1.场景

  1. 商家创建秒杀活动
  2. 进行ing配置

用户

  1. 秒杀页面
  2. 抢购
  3. 下单
  4. 支付

2.服务

  1. 抢购模块
  2. 库存模块
  3. 订单模块
  4. 支付模块

存储

商品信息表

  1. id
  2. 价格
  3. name

库存信息表

  1. 商品id
  2. 库存id
  3. 活动id(与秒杀活动对应)
  4. 数量
  5. 锁定(支付还没有付款的)

秒杀活动表

  1. 秒杀id
  2. 商品id
  3. 价格
  4. 数量

订单信息表

  1. 订单id
  2. 用户id
  3. 商品id
  4. 活动id
  5. 是否付款

秒杀活动的业务逻辑

扣减库存

使用的乐观锁,如果够才进行相减

1
2
UPDATE `stock_info` SET stock = stock - 1
WHERE commodity_id = 189 AND seckill_id = 28 AND stock > 0;

使用事务操作

  1. 开启事务
  2. 锁住数据,for update
  3. 再次进行减少
  4. commit

数据预热

提前把数据加入到redis,直接通过redis来进行判断数据

活动开始的时候,设置前缀,活动id+商品id

总体流程

  1. 读redis缓存
  2. redis进行减少一
  3. 锁定数据库的库存,然后创建订单
  4. 付款
  5. 最后减少订单

读取还有判断是两步,可能会并发,这个时候需要使用lua脚本

数据两太大了使用消息队列来进行薛峰

总体流程

  1. 使用lua进行判断
  2. 请求打入到消息队列
  3. 然后监听消费
  4. 之后锁住库存
  5. 付款
  6. 然后扣减库存

只能抢购一次

使用redis,来判断

sadd key value

sismember 是否存在value

分布式事务

三阶段提交

  1. 询问提交
  2. 预热提交-记录到undo和redo
  3. 提交

优化

  1. cdn优化前端
  2. 前端限流
  3. 使用倒计时
  4. 服务降级
  5. 验证码
  6. 限流,redis’