秒杀组成部分:商品、秒杀场次、Redis、 模拟秒杀
秒杀过程: 一、实现商品、秒杀场次、秒杀场次和商品关联的 CRUD;
二、定时将秒杀场次、商品、库存等信息提前写入 redis;
三、配置 Redis 持久化;
四、实现秒杀下单逻辑;
五、定时删除秒杀的过期信息并释放库存;
六、使用 golang 并发编程模拟秒杀。
PS:整个流程中,涉及异步并发的地方:定时存储数据
一、各种表的 CRU
主商品表
子商品表
秒杀场次表
秒杀场次与商品关联表
二、定时提前写入 redis
1、使用 List 场次信息:
key:session_prefix + 场次开始时间戳 + 场地结束时间戳
value: 场次 id+商品 id
2、使用 hash 存储商品的 json 数据
key:goods_prefix field:场地 id+商品 id
value:json_encode(商品信息+场次信息+随机码)
3、使用 string 存储库存信息
key:stock_prefix + 随机码
value:秒杀库存数量
4、注意以上的redis 数据加上过期时间。
三、配置 Redis 持久化
持久化两种模式都开启:RDB(快照模式)+ AOF(日志模式)
配置文件:save/append_only
区别:两者数据保存间隔周期不同,RDB 存储间隔大于 AOF 存储间隔
四、实现秒杀下单逻辑
1、查询场次和当前秒杀商品
查询 redis 中的缓存数据,当并发量大时可能出现:
缓存穿透:key 值不存在,重复请求压垮数据库 => 布隆过滤器或设置缓存为 空。
缓存击穿:key 值存在但是失效,需重新请求数据库造成并发问题 => SETNX 锁
缓存雪崩:缓存重启或集中失效,则都请求往 DB
2、正式秒杀有两种方式:正常的购物下单流程和单独的秒杀下单功能,这里选 择后者,这种方式可提高并发量和响应速度。
3、具体的下单逻辑:
登录校验 => 秒杀过程校验 => 通过队列进行异步下单同时返回订单号
orderSN
秒杀过程中校验点如下:
随机码:商品是否可秒杀;
购买数量限制:商品每次可购买数量;
是否已购买过:通过 redis 的 SETNX 设置 Key=场次 id_商品 id_用 户 id 来判断是否购买过。
秒杀库存数量:在获取对应库存信息前,将随机码作为 key 设置
SETNX 来实现并发锁,设置超时时间,秒杀成功或失败都释放该 锁。
五、定时删除秒杀的过期信息并释放库存
读取 redis 中的信息过滤已经过期的信息,释放库存过程同时加锁。
六、使用 golang 并发编程模拟秒杀
golang 并发调度项目码云:
具体结果贴图:
如果你喜欢我写的技术文章以及面试总结,欢迎关注收看我的视频,并且点赞、收藏、关注我哦。
我是luke,感谢你的关注!
很多小伙伴在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,希望能够去帮助到小伙伴们,可以关注我。并且加入到我的圈子一起学习成长哦【架构师之路】点击链接申请加入圈子