前二天我写了一篇,Redis高级项目实战(点我直达),SpringBoot整合Redis附源码(点我直达),今天咱们来作一下Redis秒杀系统的设计。固然啦,Redis基础知识还不过关的,先去增强下自身内功,而后在回来看这篇,Redis基础知识(点我直达)。为啥写这个微信抢红包项目呢,公司0202年08月22日,公司周年庆,抢了100多红包🧧,O(∩_∩)O哈哈~html
在DB、Redis分别新增一条记录mysql
请求Redis,红包剩余个数,大于0才能够拆,等会0时,提示用户,红包已抢完redis
Redis中数据类型的String特性的原子递减(DECR key)和减小指定值(DECRBY key decrement)算法
查询DB便可sql
红包流水表数据库
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`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='红包信息 表,新建⼀个红包插⼊⼀条记录';
红包记录表微信
CREATE TABLE `red_packet_record` ( `id` int(11) NOT NULL AUTO_INCREMENT, `amount` int(11) NOT NULL DEFAULT '0' COMMENT '抢到红包的⾦额', `nick_name` varchar(32) NOT NULL DEFAULT '0' COMMENT '抢到红包的⽤户的⽤户 名', `img_url` varchar(255) NOT NULL DEFAULT '0' COMMENT '抢到红包的⽤户的头像', `uid` int(20) NOT NULL DEFAULT '0' COMMENT '抢到红包⽤户的⽤户标识', `red_packet_id` bigint(11) NOT NULL DEFAULT '0' COMMENT '红包id,采⽤ timestamp+5位随机数', `create_time` timestamp COMMENT '建立时间', `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='抢红包记 录表,抢⼀个红包插⼊⼀条记录';
注意,往db中就单纯存入一条记录,Service层和Mapper层,就简单的一条sql语句,主要是提供思路,下面会附案例源码,不要慌并发
经过上图算法得出,靠前面的人,手气最佳概率小,手气最佳,每每在后面app
由于我发了10个红包,金额是20000,使用压测工具,模拟50个请求,只容许前10个请求能抢到红包,而且金额等于20000。高并发
连接: https://pan.baidu.com/s/1knmVMKBldVe46cmXqqfGpw 密码: a7o7
微信上有个小伙伴恰好要作一个秒杀的系统,催我赶忙把博客更新出来。过2天继续往下更新,布隆过滤器。