Java面试要点:库存中心可售库存、锁定库存、实际库存、流水与回滚
前言
库存中心是电商、零售、仓储系统的核心。面试常问:
- 可售库存和实际库存有什么区别。
- 下单时扣什么库存。
- 支付失败如何释放库存。
- 怎么防止超卖。
- 多仓库存怎么选仓。
库存模型
常见库存字段:
| 字段 | 说明 |
|---|---|
| actual_stock | 实际库存 |
| available_stock | 可售库存 |
| locked_stock | 锁定库存 |
| sold_stock | 已售库存 |
下单通常锁定可售库存,支付成功后确认扣减,订单取消后释放锁定。
状态流转
stateDiagram-v2
[*] --> 可售
可售 --> 锁定: 下单
锁定 --> 已扣减: 支付成功/出库
锁定 --> 可售: 取消/超时
扣减方案
数据库扣减
1 | update stock |
简单可靠,但高并发压力大。
Redis 预扣
适合秒杀场景,性能好,但需要库存同步和补偿。
分段库存
把库存拆分到多个库存桶,降低热点行竞争。
库存流水
库存变动必须有流水:
- 下单锁定。
- 支付扣减。
- 取消释放。
- 退货入库。
- 人工调整。
库存流水用于审计、排查和对账。
多仓库存
多仓场景还要考虑:
- 用户地址。
- 仓库库存。
- 配送时效。
- 运费。
- 仓库优先级。
选仓一般不是单纯库存够就行,而是综合成本和履约效率。
高频面试题
为什么要区分可售库存和实际库存?
因为下单未支付的商品不能继续售卖,但也还没有真正出库。锁定库存用于表达这部分占用。
库存回滚怎么防重复?
通过订单状态、库存流水唯一键和条件更新保证幂等。
库存中心为什么要有流水?
库存属于关键资产,任何变动都要可追溯。
高并发库存怎么防超卖?
用条件更新、Redis 原子扣减、分段库存、限流和异步化组合。
总结
库存中心的核心是库存分层、状态流转、条件扣减、库存流水和补偿回滚。企业里库存不是一个数字,而是一套可追踪的资产变动系统。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Junly博客!
评论


