Redis 预扣库存成功、订单却创建失败,怎样保证两边一致?
先自己想一想,再看参考要点
参考要点
- 以数据库的库存和订单为准,Redis 库存只是闸门,允许暂时少卖,数据库条件更新始终保留
- 发送消息明确失败时执行反向脚本回补,发送超时(消息可能已送达)或应用宕机交给对账,也可以用事务消息
- 订单因业务原因失败时回补 Redis,异常失败靠消息重试,唯一索引防止重复建单
- 回补先 SREM 已购集合、返回 1 才加库存,允许再次抢购时还要核对请求 ID
- Redis 主从切换丢失扣减时由数据库兜底,因数据库库存不足失败的请求,确认这个用户没有订单后只移出已购集合、不加回库存
- 活动后对账