Skip to content
困难

一句话答案

Redis Lua 原子预扣库存→MQ 异步→DB 乐观锁落库(WHERE stock>0),防超卖靠原子性+乐观锁双保险。

核心要点

流程:

  1. Redis Lua 原子:判断库存 → 扣减 → 返回
  2. 成功后发 MQ
  3. 消费者扣减 DB:UPDATE SET stock=stock-1 WHERE stock>0

防超卖: Redis Lua 原子性 + DB 乐观锁 防少卖: Redis 扣成功但 DB 失败 → 补偿回滚 Redis

追问与易错

追问方向:

  • 超卖根本原因?
  • Redis 预扣成功 DB 失败怎么办?
  • 退单库存恢复怎么做?

易错点:

  • ❌ SELECT FOR UPDATE 就行——高并发行锁竞争严重
  • ❌ Redis 预扣就不超卖——Redis→DB 可能不一致

💡 记忆锚点

库存扣减三板斧:第一板Redis Lua原子预扣(判断+扣减一条龙,高性能挡并发),第二板MQ异步传递(解耦削峰),第三板DB乐观锁落库(WHERE stock>0兜底防超卖)。超卖靠Redis原子性+DB乐观锁双保险,少卖靠Redis扣成功DB失败时补偿回滚Redis。