微信抢红包实现原理
业务流程分析
功能拆解
1、新建红包
在DB、Redis分别新增一条记录
2、抢红包(并发)
请求Redis,红包剩余个数,大于0才可以拆,等会0时,提示用户,红包已抢完
3、拆红包(并发)
用到技术
Redis中数据类型的String特性的原子递减(DECR key)和减少指定值(DECRBY key decrement)
业务
请求Redis,当剩余红包个数大于0,红包个数原子递减,随机获取红包
计算金额,当最后一个红包时,最后一个红包金额=总金额-总已抢红包金额
更新数据库
查看红包记录
查询DB即可
数据库表设计
红包流水表
CREATETABLE`red_packet_info`(`id`int(11)NOTNULLAUTO_INCREMENT,`red_packet_id`bigint(11)NOTNULLDEFAULT0COMMENT'红包id,采⽤
timestamp+5位随机数',`total_amount`int(11)NOTNULLDEFAULT0COMMENT'红包总⾦额,单位分',`total_packet`int(11)NOTNULLDEFAULT0COMMENT'红包总个数',`remaining_amount`int(11)NOTNULLDEFAULT0COMMENT'剩余红包⾦额,单位
分',`remaining_packet`int(11)NOTNULLDEFAULT0COMMENT'剩余红包个数',`uid`int(20)NOTNULLDEFAULT0COMMENT'新建红包⽤户的⽤户标识',`create_time`timestampCOMMENT'创建时间',`update_time`timestampNOTNULLDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMPCOMMENT'更新时间', PRIMARYKEY(`id`))ENGINE=InnoDBAUTO_INCREMENT=1DEFAULTCHARSET=utf8mb4COMMENT='红包信息表,新建⼀个红包插⼊⼀条记录';
红包记录表
CREATETABLE`red_packet_record`(`id`int(11)NOTNULLAUTO_INCREMENT,`amount`int(11)NOTNULLDEFAULT'0'COMMENT'抢到红包的⾦额',`nick_name`varchar(32)NOTNULLDEFAULT'0'COMMENT'抢到红包的⽤户的⽤户
名',`img_url`varchar(255)NOTNULLDEFAULT'0'COMMENT'抢到红包的⽤户的头像',`uid`int(20)NOTNULLDEFAULT'0'COMMENT'抢到红包⽤户的⽤户标识',`red_packet_id`bigint(11)NOTNULLDEFAULT'0'COMMENT'红包id,采⽤
timestamp+5位随机数',`create_time`timestampCOMMENT'创建时间',`update_time`timestampNOTNULLDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMPCOMMENT'更新时间', PRIMARYKEY(`id`))ENGINE=InnoDBAUTO_INCREMENT=1DEFAULTCHARSET=utf8mb4COMMENT='抢红包记录表,抢⼀个红包插⼊⼀条记录';
发红包API
发红包接口开发
新增一条红包记录
往mysql里面添加一条红包记录
往redis里面添加一条红包数量记录
往redis里面添加一条红包金额记录
注意,往db中就单纯存入一条记录,Service层和Mapper层,就简单的一条sql语句,主要是提供思路,下面会附案例源码,不要慌
抢红包API
抢红包功能属于原子减操作
当大小小于0时原子减失败
当红包个数为0时,后面进来的用户全部抢红包失败,并不会进入拆红包环节
抢红包功能设计将红包ID的请求放入请求队列中,如果发现超过红包的个数,直接返回
注意事项抢到红包不一定能拆成功
抢红包算法拆解
通过上图算法得出,靠前面的人,手气最佳几率小,手气最佳,往往在后面
发100元,共10个红包,那么平均值是10元一个,那么发出来的红包金额在0.01~20元之间波动
当前面4个红包总共被领了30元时,剩下70元,总共6个红包,那么这6个红包的金额在0.01~23.3元之间波动
抢红包接口开发
测试
发红包
模拟高并发抢红包(Jmeter压测工具)
因为我发了10个红包,金额是20000,使用压测工具,模拟50个请求,只允许前10个请求能抢到红包,并且金额等于20000。
项目源码下载
好了,项目已经介绍完毕了,如果有需要项目源码的朋友可以添加vx:bjmsb10:免费获取,资料名字叫做--抢红包源码;
网友评论