库存问题处理上的一些思考

646 阅读2分钟

思考

对于库存管理来说,最重要的库存的分配与扣减

1)、最优仓调度逻辑 如果一物一仓(一个sku只在一个仓库有货),这种逻辑比较简单,扣减响应的仓库库存即可。

实际上,一个sku可能会分布在多个仓库中,此时需要根据物流时效,仓库等级去扣减仓库中商品。

1、 查询时,先筛选出有库存的仓库。 2、 将收货地址与这些仓库的一级配送区域(24小时到达)匹配,若没有再去匹配二级区域(2日到达),以此列推,筛选出最优仓库。 3、 筛选出同级区域(物流时效相同)的仓库后,再根据仓库的优先级进行筛选 4、 若扔有多个仓库(同一类型的仓库)待选,例如保定从北京发,和从天津发时效相同,再根据同级仓库之间的优先级进行选择,最后选择仓库。 5、 选择好仓库之后,获取仓库中的库存数量

2)、下单扣减库存 以购买2个商品为例:

1、提交订单后,判断可销售库存数量是否够,若无法满足,则提示库存不足 2、若可销售库存满足条件时,可销售库存减2,锁定库存数加2,成功提交订单。 3、在用户支付以后,销售总库存减2,现货库存减2,锁定库存减2,已销售库存加2,做完这一系列动作之后,扣减库存才算结束。 4、若买家支付前取消了订单,则返还库存,可销售库存数加2,锁定库存减2。

如何正确扣减库存?

  1. 利用数据库行锁保证库存的正确扣减

select sale_stock_num, lock_stock_num from stock where sku = :sku

update stock set sale_stock_num = sale_stock_num -2, lock_stock_num = lock_stock_num +2 where sale_stock_num = :old_sale_stock_num and lock_stock_num = old_lock_stock_num and sku = :sku

如果查到的old_sotck_num已经被其他用户扣减,则update 更新影响行数是0,提示 “库存存扣减失败,请重试 ”

如果使用此种方式,大量用户同一时刻必将查到相同的库存数stock_num,则必将有大量用户提示库存扣减失败。

  1. 利用redis单线程保证库存的正确扣减

将库存提前放到redis中, 扣减库存的时候,先扣减redis,然后发MQ消息更新数据库。

如果使用此种方式,如何保证redis和数据库之间的数据一致性。