秒杀系统如何设计?

高并发面试题发布于

一、挑战

高并发、库存有限、防超卖、防刷。

二、优化手段

1. 前端

  • 按钮置灰,防止重复提交。
  • 答题/验证码防机器人。

2. 网关层

  • 限流(用户维度、IP 维度)。
  • 静态资源 CDN。

3. 应用层

  • Redis 预减库存,判断是否还有库存。
  • 异步下单:请求写 MQ,消费者处理订单。
  • 本地缓存挡热点商品。

4. 数据层

  • Redis 存库存,扣减用 Lua 保证原子。
  • 数据库乐观锁防超卖:update stock set count=count-1 where id=? and count>0。
  • 订单表唯一索引(user_id + goods_id)防重复下单。

三、流程

  1. 用户请求秒杀 → 网关限流。
  2. Redis 检查库存(Lua 原子操作)。
  3. 有库存 → 扣减 + 发 MQ。
  4. 消费者创建订单 + 数据库扣库存。
  5. 返回排队中,客户端轮询结果。

四、关键

  • 库存用 Redis 挡大部分流量。
  • MQ 削峰,数据库只处理真实订单。
  • 幂等:用户+商品唯一。