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中是否有对应的序列号,如果存在则表示正在处理账务。否则表示该红包未被领取,可被领取(此步骤中判断一定要加上锁,避免同时被领取,因为此步骤为小概率发生时间,因为可以牺牲一定的时间满足安全性)。