美文网首页
Redis秒杀系统架构设计-微信抢红包(用科学告诉你如何手气最佳

Redis秒杀系统架构设计-微信抢红包(用科学告诉你如何手气最佳

作者: Java斗帝之路 | 来源:发表于2020-08-26 17:20 被阅读0次

微信抢红包实现原理

业务流程分析

功能拆解

1、新建红包

在DBRedis分别新增一条记录

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:免费获取,资料名字叫做--抢红包源码;

相关文章

网友评论

      本文标题:Redis秒杀系统架构设计-微信抢红包(用科学告诉你如何手气最佳

      本文链接:https://www.haomeiwen.com/subject/ymrfsktx.html