外观
一句话答案
Redis Lua 原子预扣库存→MQ 异步→DB 乐观锁落库(WHERE stock>0),防超卖靠原子性+乐观锁双保险。
核心要点
流程:
- Redis Lua 原子:判断库存 → 扣减 → 返回
- 成功后发 MQ
- 消费者扣减 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。