秒杀组成部分:商品、秒杀场次、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,感谢你的关注!

很多小伙伴在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,希望能够去帮助到小伙伴们,可以关注我。并且加入到我的圈子一起学习成长哦【架构师之路】点击链接申请加入圈子