前言

库存中心是电商、零售、仓储系统的核心。面试常问:

  • 可售库存和实际库存有什么区别。
  • 下单时扣什么库存。
  • 支付失败如何释放库存。
  • 怎么防止超卖。
  • 多仓库存怎么选仓。

库存模型

常见库存字段:

字段 说明
actual_stock 实际库存
available_stock 可售库存
locked_stock 锁定库存
sold_stock 已售库存

下单通常锁定可售库存,支付成功后确认扣减,订单取消后释放锁定。

状态流转

stateDiagram-v2
    [*] --> 可售
    可售 --> 锁定: 下单
    锁定 --> 已扣减: 支付成功/出库
    锁定 --> 可售: 取消/超时

扣减方案

数据库扣减

1
2
3
4
update stock
set available_stock = available_stock - 1,
locked_stock = locked_stock + 1
where sku_id = ? and available_stock > 0;

简单可靠,但高并发压力大。

Redis 预扣

适合秒杀场景,性能好,但需要库存同步和补偿。

分段库存

把库存拆分到多个库存桶,降低热点行竞争。

库存流水

库存变动必须有流水:

  • 下单锁定。
  • 支付扣减。
  • 取消释放。
  • 退货入库。
  • 人工调整。

库存流水用于审计、排查和对账。

多仓库存

多仓场景还要考虑:

  • 用户地址。
  • 仓库库存。
  • 配送时效。
  • 运费。
  • 仓库优先级。

选仓一般不是单纯库存够就行,而是综合成本和履约效率。

高频面试题

为什么要区分可售库存和实际库存?

因为下单未支付的商品不能继续售卖,但也还没有真正出库。锁定库存用于表达这部分占用。

库存回滚怎么防重复?

通过订单状态、库存流水唯一键和条件更新保证幂等。

库存中心为什么要有流水?

库存属于关键资产,任何变动都要可追溯。

高并发库存怎么防超卖?

用条件更新、Redis 原子扣减、分段库存、限流和异步化组合。

总结

库存中心的核心是库存分层、状态流转、条件扣减、库存流水和补偿回滚。企业里库存不是一个数字,而是一套可追踪的资产变动系统。