利用Mysql实现高并发红包

1. 关联表

1.1. 红包预拆分表A
1.2. 临时自增序列表B
1.3. 发红包表C
1.4. 收红包表D

2. 实现原理

  目前大多数红包实现都是基于redis实现,但是对于一个项目工期紧或者没有运维人员维护redis服务器时,Mysql的实现是个不错的选择。

  Mysql实现红包的的原理如下:
    2.1. 预先将红包按照算法拆分成需要的N份并保存于表A,同时每个子红包对应一个值,从1…N。
    2.2. 利用mysql表的自增主键,保证多用户高并发插入,并且获取自增主键值,从1…M 。
    2.3. 如果获取自增主键M<=N,则取事先分配好的子红包,否则表示未抢到红包。
    2.4. 取到事先分配好的子红包后从表A中删除记录,并且随后更新账务。

3. 补偿机制

  如果抢完红包,在更新账户时发生了异常,则自增主键方式导致会有红包遗漏,则在设计系统健壮性时,则要设计一定的补偿机制。
  整个补偿机制的流程如下:
    3.1.如果当前自增主键m>n,则判断当前收红包记录表D中是否已经存在N条记录。如果确实N条记录,则返回未抢到红包。
    3.2. 如果收红包记录小于N,则去判断预拆分表A是否存在预拆分记录,如果不存在则表示无未领取红包。
    3.3. 如果表A存在记录,则取判断自增主机表B中是否有对应的序列号,如果存在则表示正在处理账务。否则表示该红包未被领取,可被领取(此步骤中判断一定要加上锁,避免同时被领取,因为此步骤为小概率发生时间,因为可以牺牲一定的时间满足安全性)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值