库存同步

Redis 预扣库存解决了性能问题,但库存一致性变复杂了。现在系统里至少有三种状态:

  • Redis 中的可抢库存。
  • 数据库中的真实库存。
  • 订单中的占用和支付状态。

库存同步要保证这些状态最终能对齐。

状态流转

秒杀库存可以分成:

可售库存 -> 预扣库存 -> 已下单库存 -> 已支付库存
                         -> 超时释放

用户抢到资格后,库存先被预扣;订单创建后进入待支付;支付成功后确认销售;超时未支付则释放库存。

防超卖与防少卖

防超卖是底线,但防少卖也重要。常见少卖原因:

  • Redis 预扣成功,订单创建失败,库存没有释放。
  • 用户未支付,库存长期占用。
  • 消费者异常导致队列消息丢失。
  • 数据库回写失败但 Redis 已扣减。

所以系统需要补偿任务扫描异常订单和库存差异。

对账机制

对账可以按活动维度定期执行:

初始库存 = 已支付订单 + 待支付占用 + Redis 剩余库存 + 异常差异

如果不平,需要生成补偿记录,并限制活动继续放量,避免错误扩大。

支付超时

秒杀订单通常有短支付时间。超时后要释放库存,但释放要幂等:

  • 订单已经支付,不能释放。
  • 订单已经取消,不能重复释放。
  • 释放 Redis 和数据库状态要有补偿。

库存同步是秒杀系统最容易出事故的部分。它要求每个状态变化都有记录、可重试、可对账。

章节