4. 库存分配与锁定:库存实时查询、库存预占与锁定策略、缺货场景下的分配逻辑
库存分配这事儿,说白了就是「谁先抢到,谁先得」的博弈。但现实远比这个复杂。我做了这么多年供应链,见过太多因为库存分配不合理导致的订单超卖、客户投诉、甚至仓库打起来的场面。嗯,今天咱们就聊聊这块硬骨头。
4.1 库存实时查询:别让数据骗了你
很多系统查库存,查的是「账面库存」。但账面库存和实际可卖库存,往往差着十万八千里。我个人习惯,在查询库存时一定要区分三个概念:
- 物理库存:仓库里真实存在的货。这个数一般不准,因为盘点总有差异。
- 可售库存:物理库存减去已经被预占、锁定、以及次品、预留的货。这才是你能卖的数。
- 在途库存:采购了还没到、调拨了还没入库的货。这个能不能卖?我建议谨慎。
核心原则:实时查询时,永远用「可售库存」作为决策依据。账面库存只是参考。
我在项目中遇到过,某电商大促时,系统查出来库存还有500件,结果用户下单后全部超卖。为什么?因为那500件里有300件已经被其他渠道预占了,但查询接口没过滤掉。你想想看,这锅谁来背?
4.2 库存预占与锁定策略:先下手为强
库存预占,就是用户下单后,系统先把货「占住」,防止别人抢走。但什么时候预占?预占多久?这里面门道很多。
我建议分两种场景:
- 下单即预占:用户提交订单,立刻锁定库存。适合现货充足、履约确定性高的场景。缺点是如果用户不付款,库存就白白锁着。
- 付款才预占:用户付款后,才真正锁定库存。适合预售、高价值商品。缺点是可能用户付了款,库存却被别人抢走了。
我曾经在做一个跨境项目时,采用了「下单预占+30分钟自动释放」的策略。为什么是30分钟?因为统计下来,90%的用户会在30分钟内完成支付。超过30分钟未支付的订单,库存自动释放给其他人。这样既保证了用户体验,又避免了库存浪费。
小技巧:预占库存时,建议在数据库里加一个「预占过期时间」字段。定时任务扫一遍,过期自动释放。别问我为什么知道——我曾经因为忘了加这个,导致一批库存被锁了整整三天。
4.3 缺货场景下的分配逻辑:谁先谁后?
缺货是常态,不缺货才是意外。当库存不够分时,怎么分配?这里我总结了几种常见策略:
| 策略名称 | 核心逻辑 | 适用场景 | 缺点 |
|---|---|---|---|
| 先到先得 | 谁先下单,谁先拿货 | 通用场景,公平 | 大客户可能不满 |
| 优先级分配 | 按客户等级、订单金额等分配 | VIP客户、大客户优先 | 小客户体验差 |
| 比例分配 | 按渠道、区域比例分配库存 | 多渠道、多仓库场景 | 计算复杂 |
| 动态分配 | 结合预测、库存周转率动态调整 | 高波动、快消品 | 需要算法支持 |
我个人比较推荐「优先级+先到先得」的混合策略。举个例子:
- 先按客户等级分:VIP客户优先分配,普通客户次之。
- 同等级内,按下单时间先到先得。
- 如果VIP客户没抢到,自动降级为普通客户排队。
这样做的好处是,既照顾了核心客户,又保持了基本的公平性。我在一个日化品项目里用过这套逻辑,缺货投诉率下降了40%。
注意:缺货分配逻辑一定要在系统里写死,不能人工干预。否则一旦出现缺货,销售、运营、仓库三方互相扯皮,最后全推到系统头上。我曾经见过一个公司,因为缺货分配规则不明确,三个部门经理在会议室吵了一下午。
4.4 核心逻辑流程图
下面这张图,是我自己总结的库存分配与锁定的核心流程。你看一遍,基本就能理解整个链路了。
4.5 实战中的避坑指南
最后,分享几个我踩过的坑,希望能帮你少走弯路:
- 不要依赖缓存查库存:Redis里的库存数据可能延迟,导致超卖。我建议核心库存查询走数据库,缓存只做展示用。
- 预占和锁定要分开:预占是临时占位,锁定是最终确认。混在一起,一旦订单取消,库存释放逻辑会乱成一锅粥。
- 缺货时要有「兜底」逻辑:比如自动生成采购单、通知客服、或者给用户发优惠券。别让用户干等着。
- 日志一定要全:谁、什么时间、预占了哪个SKU、多少数量、订单号是什么。出了问题,查日志是唯一的救命稻草。
我的习惯:每次上线库存分配逻辑前,我都会手动模拟几个极端场景:比如同一秒100个用户抢最后1件库存、比如用户下单后立刻取消再下单。这些边界情况,往往能暴露最隐蔽的bug。
好了,库存分配与锁定这块,核心就是「查得准、占得住、分得清」。你把这三点想透了,系统就不会出大乱子。