2.设计秒杀系统
1.场景
- 商家创建秒杀活动
- 进行ing配置
用户
- 秒杀页面
- 抢购
- 下单
- 支付
2.服务
- 抢购模块
- 库存模块
- 订单模块
- 支付模块
存储
商品信息表
- id
- 价格
- name
库存信息表
- 商品id
- 库存id
- 活动id(与秒杀活动对应)
- 数量
- 锁定(支付还没有付款的)
秒杀活动表
- 秒杀id
- 商品id
- 价格
- 数量
订单信息表
- 订单id
- 用户id
- 商品id
- 活动id
- 是否付款
秒杀活动的业务逻辑
扣减库存
使用的乐观锁,如果够才进行相减
1 | UPDATE `stock_info` SET stock = stock - 1 |
使用事务操作
- 开启事务
- 锁住数据,for update
- 再次进行减少
- commit
数据预热
提前把数据加入到redis,直接通过redis来进行判断数据
活动开始的时候,设置前缀,活动id+商品id
总体流程
- 读redis缓存
- redis进行减少一
- 锁定数据库的库存,然后创建订单
- 付款
- 最后减少订单
读取还有判断是两步,可能会并发,这个时候需要使用lua脚本
数据两太大了使用消息队列来进行薛峰
总体流程
- 使用lua进行判断
- 请求打入到消息队列
- 然后监听消费
- 之后锁住库存
- 付款
- 然后扣减库存
只能抢购一次
使用redis,来判断
sadd key value
sismember 是否存在value
分布式事务
三阶段提交
- 询问提交
- 预热提交-记录到undo和redo
- 提交
优化
- cdn优化前端
- 前端限流
- 使用倒计时
- 服务降级
- 验证码
- 限流,redis’
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.