抢红包实现原理
微信红包原理业务探讨
功能点探索
功能点探索
1.新建红包:在DB、cache各新增一条记录
2. 抢红包:请求访问cache,剩余红包个数大于0则可拆开红包
3. key:1,value:20 string decr原子减,每次减1 ,而decreby减指定数量2
4.拆红包:20个红包里面有500块,key:1,value:50000(以分为单位) decreby 548,decreby 1055 ,decreby 2329
5.请求访问cache,剩余红包个数大于0则继续,同时获取可抢红包数与金额
6.计算金额(从1分到剩余平均值2倍之间随机数,如果不是最后一个红包,剩余金额预留最少1分给cas更新失败,最后一位拿红包的人)
7. cas更新数据库(更新红包计数表记录【剩余红包个数、剩余红包金额】、插入领取记录)
8.查看红包记录:用户进来直接查DB即可
微信红包数据库表设计
- 红包流水表
mysql
CREATE TABLE `red_packet_info` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`red_packet_id` bigint(11) NOT NULL DEFAULT 0 COMMENT '红包id,采用timestamp+5位随机数',
`total_amount` int(11) NOT NULL DEFAULT 0 COMMENT '红包总金额,单位分',
`total_packet` int(11) NOT NULL DEFAULT 0 COMMENT '红包总个数',
`remaining_amount` int(11) NOT NULL DEFAULT 0 COMMENT '剩余红包金额,单位分',
`remaining_packet` int(11) NOT NULL DEFAULT 0 COMMENT '剩余红包个数',
`uid` int(20) NOT NULL DEFAULT 0 COMMENT '新建红包用户的用户标识',
`create_time` timestamp COMMENT '创建时间',
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`</