Skip to content
极高困难

一句话答案

秒杀三层削峰:前端限流(按钮/验证码)→Redis Lua 原子预扣库存→MQ 异步下单,尽量在上游拦截请求。

核心要点

架构分层:

  1. 前端:按钮灰显/验证码/限制频率
  2. 网关层:限流/黑名单/令牌桶
  3. 服务层:Redis Lua 原子预扣库存 → 成功则发 MQ
  4. 异步层:消费 MQ → 创建订单 → 扣减DB库存
  5. 数据层:乐观锁防超卖 UPDATE SET stock=stock-1 WHERE stock>0

核心: 尽量在上游拦截,减少到达数据库的请求

追问与易错

追问方向:

  • Redis 预扣库存和 DB 扣减不一致怎么办?(MQ 保证最终一致 + 对账补偿)
  • 如何防止黄牛/脚本?(验证码/设备指纹/限频/风控)
  • 如果 Redis 挂了怎么兜底?(降级方案:直接 DB 乐观锁,但性能下降)

易错点:

  • ❌ "直接查 DB 判断库存"——高并发下 DB 扛不住
  • ❌ "先扣 DB 再发 MQ"——应该先 Redis 预扣,成功后再发 MQ 异步落 DB

💡 记忆锚点

漏斗模型:前端按钮灰显+验证码挡90%请求 -> 网关限流令牌桶再挡一层 -> Redis Lua原子预扣库存(核心关卡)-> MQ异步削峰 -> DB乐观锁落库(WHERE stock>0)。每层过滤掉大部分请求,最终到DB的可能只有万分之一。核心原则:把请求挡在离用户最近的地方。