电商系列之库存
> 插:AI时代,程序员或多或少要了解些人工智能,前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。
坚持不懈,越努力越幸运,大家一起学习鸭~~~
今天来跟大家聊下电商平台里的库存系统,相信大家对库存系统最直观的感受就是商详页上是否显示“加入购物车”或者是“到货通知”。只要能加入购物车就表示有库存,显示到货通知就表示没有库存了,并没有觉得这里面有多么的复杂。今天来跟大家一起解密下库存系统,来看一看是不是真的如大家想象中那么的简单。
库存系统的作用是什么?
最重要的作用就是管理好各个商品的实时库存数据,及时告诉用户当前商品是否可以购买?还可以购买几件。
为了能够更清楚的介绍库存系统是如何管理商品库存数据的,这里需要先简单给大家介绍另外一个系统,叫做仓库系统。估计很多人分不清仓库系统跟库存系统之间的关系是什么?
仓库系统实际真正管理的是物理仓库里面的库存的数量。我们经常听说的京东亚洲一号仓等等这些大型的仓库,由于面积非常大,里面的商品数量也很多,所以需要有一套系统来帮助管理实体仓里面的库存的数量。
简单来说就是管理这个仓库一天有多少商品进入到这个仓库里面来,每个商品的数量有多少?每天从这个仓库发出去多少个商品?仓库里面每个商品还剩下多少?剩下的这些商品分别存储是仓库的哪个储位上等等。
那么有了仓库系统就可以管理商品的数量,那么为什么还要有库存系统呢?
下面给大家举个例子,让大家了解下仓库系统和库存系统之间的区别是什么?当某个商品A在仓库里面有10个数量的时候,仓库系统负责管理这个商品A的数量,以及它的位置信息。那么仓库里面这个商品A在网站上是不是一定可以允许卖10个呢?这是不一定的。因为仓库里面有10个商品A,可能网站上已经有3个被用户买掉了,只不过这3个商品还没有出库,所以在仓库系统里面看这个商品A目前还有10个在仓库,但实际上已经卖掉3个,网站上其实只能卖7个,这种可卖的数量仓库系统是区分不出来的,它只是负责管理在当前时刻仓库里面一共有多少库存,并不区分商品的状态信息。所以库存系统主要是用来解决这个问题,经过一系列的计算告诉用户当前时刻商品A一共还可以买几个。仓库系统管理的是仓库里面商品的实际数量,库存系统管理的是商品的可销售数量,这就是库存系统和仓库系统主要的区别。
在电商网站的商详页上展示当前商品可售卖数量对库存系统来说是相对比较简单的,有货的时候显示当前商品的数量,没货的时候告诉前端此商品库存为0,前端展示到货通知,如下图:
库存跟仓库系统之间的交互
比较复杂的是如何对接仓库的各种出入库事件来管理商品的数量。下面来跟你介绍一下库存跟仓库系统之间交互的几个比较重要的事件。
采购入库
当B2C电商网站类似京东、当当这种想卖一个商品的时候首选要发起采购计划,这时候需要在仓库系统里面建立一个采购单。目的是记录哪个商品采购了多少数量,将会把这批货采购到哪个仓库里面去。
采购单发起之后过一段时间实际的商品会入库。这时候仓库系统会把相应的商品数量进行更改。这个时候仓库系统同时会通知库存系统,告诉库存系统某个商品入库了,数量是多少,库存系统会把相应的数量加上。
采购入库时序图
下单锁库存
商品采购入库之后库存系统就会增加相应的数量,这时候在网站端这个商品就可以开始卖了。当有人购买这个商品的时候,库存系统会将这个商品数量先锁定。然后等待仓库出货。当仓库真正出货的时候,库存系统才会将相应的数量减掉。这里解释下库存系统为什么要有一个锁定的状态?
还是举个例子来说。当一个手机A采购入库10个的时候,库存系统也会显示这个手机在库存系统里面有10个数量。也就是说网站上可以销售的数量为10。
当一个用户买了一个手机A的时候。库存系统会将这个商品先锁定一件。表示有一个商品已经有人付钱要进行购买了,这个时候库存系统会告诉网站端此商品目前能购买的数量为9个。
订单取消解锁库存
当用户下了单买了手机A之后,过了一会可能由于种种原因后悔了,或者是不想买了或者是想换一个更好的手机,这个时候用户会将这个订单取消掉。在仓库没有将这个手机发出去之前用户是可以取消的,这个时候我们需要将刚刚锁定的数量解锁掉,变化后的库存数量如下:
出库扣库存
如果上面用户没有取消订单,那么仓库里面的工作人员将这个商品找到、打好包裹、寄出去之后,仓库系统会通知库存系统这个手机已经出库,这个时候库存系统需要将数量减少,具体变化如下:
仓库的实际数量变为9,锁定数量变为0,可售卖的数量仍然为9。
仓库间调拨
这个纯属电商仓库管理的后台流程,普通用户是感知不到的,稍微大一点的商家或者自营平台,类似京东、苏宁这种自建仓库的平台商家都会有很多个仓库分布式在全国各地,商品也是有一定规则的分布在各个仓库一定的数量,当用户下单的时候尽量从离用户最近的仓库发货,这样速度比较快并且距离也比较短,物流成本也比较低。但实际上会由于各种原因导致某些商品库存数量分配的并不是很合理,可能南方的仓库已经卖没了,北方的仓库还积压很多没卖出去,这个时候为了让商品尽快的卖出去,需要将这个商品从北方的仓库调拨到南方的仓库,这就是调拨的业务场景。
可以看到调拨是一个商品在两个仓之间的周转,这就为管理增加了难度,完成一次调拨有三个步骤:发起调拨申请、调拨出库、调拨入库。
发起调拨申请:当决定把商品A从北方仓调拨到南方仓的时候,首选需要发起一个申请,表示哪个商品从哪个仓调拨到哪个仓,调拨的数量是多少。
为了方便大家理解,我们举个例子,将商品A从北方仓调拨到南方仓100个。当发起调拨申请的时候,库存系统会先在北方仓锁定100个商品A的数量。库存的变化如下:
发起调拨前
发起调拨后
看到这里有同学会奇怪为什么发起调拨的时候也要先将调拨数量进行锁定,因为如果不进行锁定的话极端情况下北方仓的这个商品可能突然就卖掉了950件,这时候仓库只剩下了50个,仓库就没有办法进行100个商品的调拨,会影响商家的整体统筹安排,所以需要在发起调拨的时候预先锁下,保证调拨可以正常进行。
调拨出库:即当A商品从北方仓出库的时候,这个时候我们需要将库存数量进行相应的调整,调整后数量如下:
将北方仓的实际库存数量和锁定数量都减掉100,可销售的数量仍然是900。
调拨入南方仓
在这100个商品进入到南方仓之前,我们看下南方仓的库存数量,如下:
当这个100个单品进入到南方仓之后,南方仓这个商品的数量会进行调整,如下:
实际数量和可售卖数量都变成了100。
至此我们完成了一次完成的调拨流程。这里面大家可以看到,其实库存与仓库之间交互的事件比较多,逻辑也比较复杂。上面只是简单列举了几个比较核心的流程。实际生产中还有很多更细节的事件需要管理。例如,退货的流程、换货的流程、损益的流程等等。如果任何一个地方出现误差,就会导致仓库的数量与库存的数量不一致。
如果出现不一致,那就是库存系统的最大失败,库存系统就是用来管理库存的,这就是它的职责。但是实际业务中由于复杂的逻辑会出现一部分商品库存管理出现错误,这时候会导致两种后果,一种是仓库系统明明只有5个商品,库存那边计算成了10个。这样可能会有10个用户来购买,但是仓库只有5个,会导致有5个用户的商品不能发货,这就是我们所谓的超卖。这种是比较严重的后果,用户的体验非常不友好。另外一种情况是仓库里面还有10个商品,但是库存系统计算成只有5个,这样会导致商品少卖会造成商品在仓库的积压。所以仓库跟库存还有一个比较重要的逻辑就是对账每天都要核对一下两边的库存数量是否一致。
上面跟大家介绍了下库存系统的大体业务逻辑,相信已经有不少人已经看晕了,后面再找时间跟大家介绍下如此复杂的库存系统是如何实现的?这里需要解决的问题是如何保数据一致性?跨库的事务如何解决?采用什么样的策略进行补偿?对账如何做?商详的请求量比较大,如何保证库存的性能?等等。有好的方案欢迎留言讨论。
相关文章:

电商系列之库存
> 插:AI时代,程序员或多或少要了解些人工智能,前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 坚持不懈,越努力越幸运,大家…...

Apache HBase(二)
目录 一、Apache HBase 1、HBase Shell操作 1.1、DDL创建修改表格 1、创建命名空间和表格 2、查看表格 3、修改表 4、删除表 1.2、DML写入读取数据 1、写入数据 2、读取数据 3、删除数据 2、大数据软件启动 一、Apache HBase 1、HBase Shell操作 先启动HBase。再…...
【设计模式】原型模式详解
概述 用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型对象相同的新对象 结构 抽象原型类:规定了具体原型对象必须实现的clone()方法具体原型类:实现抽象原型类的clone()方法,它是可以被复制的对象。访问类&…...

企微侧边栏开发(内部应用内嵌H5)
一、背景 公司的业务需要用企业微信和客户进行沟通,而客户的个人信息基本都存储在内部CRM系统中,对于销售来说需要一边看企微,一边去内部CRM系统查询,比较麻烦,希望能在企微增加一个侧边栏展示客户的详细信息…...
如何确定最优的石油管道位置
如何确定最优的石油管道位置 一、前言二、问题概述三、理解问题的几何性质四、转化为数学问题五、寻找最优解六、算法设计6.1伪代码6.2 C代码七算法效率和实际应用7.1时间效率分析7.2 空间效率分析结论一、前言 当我们面对建设大型输油管道的复杂任务时,确保效率和成本效益是…...

FPGA 图像边缘检测(Canny算子)
1 顶层代码 timescale 1ns / 1ps //边缘检测二阶微分算子:canny算子module image_canny_edge_detect (input clk,input reset, //复位高电平有效input [10:0] img_width,input [ 9:0] img_height,input [ 7:0] low_threshold,input [ 7:0] high_threshold,input va…...

2024.3.28学习笔记
今日学习韩顺平java0200_韩顺平Java_对象机制练习_哔哩哔哩_bilibili 今日学习p286-p294 继承 继承可以解决代码复用,让我们的编程更加靠近人类思维,当多个类存在相同的属性和方法时,可以从这些类中抽象出父类,在父类中定义这些…...

33.HarmonyOS App(JAVA)鸿蒙系统app数据库增删改查
33.HarmonyOS App(JAVA)鸿蒙系统app数据库增删改查 关系数据库 关系对象数据库(ORM) 应用偏好数据库 分布式数据库 关系型数据库(Relational Database,RDB)是一种基于关系模型来管理数据的数据库。HarmonyOS关系型…...

寄主机显示器被快递搞坏了怎么办?怎么破?
大家好,我是平泽裕也。 最近,我在社区里看到很多关于开学后弟弟寄来的电脑显示器被快递损坏的帖子。 看到它真的让我感到难过。 如果有人的数码产品被快递损坏了,我会伤心很久。 那么今天就跟大家聊聊寄快递的一些小技巧。 作为一名曾经的…...
python爬虫-bs4
python爬虫-bs4 目录 python爬虫-bs4说明安装导入 基础用法解析对象获取文本Tag对象获取HTML中的标签内容find参数获取标签属性获取所有标签获取标签名嵌套获取子节点和父节点 说明 BeautifulSoup 是一个HTML/XML的解析器,主要的功能也是如何解析和提取 HTML/XML 数…...

SpringBoot学习之ElasticSearch下载安装和启动(Mac版)(三十一)
本篇是接上一篇Windows版本,需要Windows版本的请看上一篇,这里我们继续把Elasticsearch简称为ES,以下都是这样。 一、下载 登录Elasticsearch官网,地址是:Download Elasticsearch | Elastic 进入以后,网页会自动识别系统给你提示Mac版本的下载链接按钮 二、安装 下载…...

OC对象 - Block解决循环引用
文章目录 OC对象 - Block解决循环引用前言1. 循环引用示例1.1 分析 2. 解决思路3. ARC下3.1 __weak3.2 __unsafe_unretained3.3 __block 4. MRC下4.1 __unsafe_unretain....4.1 __block 5. 总结5.1 ARC下5.2 MRC下 OC对象 - Block解决循环引用 前言 本章将会通过一个循环引用…...

Java设计模式之装饰器模式
装饰器模式是一种结构型设计模式,它允许动态地将责任附加到对象上。装饰器模式是通过创建一个包装对象,也就是装饰器,来包裹真实对象,从而实现对真实对象的功能增强。装饰器模式可以在不修改原有对象的情况下,动态地添…...
Java基础知识总结(25)
代理模式 什么是代理模式? 代理模式是指,为其他对象提供一种代理以控制这个对象的访问。一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户和目标对象之间起到中介的作用。换句话说,代理模式,是在不修…...
Vue3 实现基于token 用户登录
前后端分离情况下,实现的大致思路 1 第一次登录的时候,前端调用后端的登录接口,发送用户名与密码 2 后端收到请求,验证用户名和密码,验证成功 给前端返回一个token 3 前段拿到token 将token 存储进localStorage 和…...

在word中显示Euclid Math One公式的问题及解决(latex公式,无需插件)
问题:想要在word中显示形如latex中的花体字母 网上大多解决办法是安装Euclid Math One。安装后发现单独的符号插入可行,但是公式中选择该字体时依然显示默认字体。 解决办法:插入公式后,勾选左上角的latex 在公式块中键入latex代码…...

江协科技STM32:按键控制LED光敏传感器控制蜂鸣器
按键控制LED LED模块 左上角PA0用上拉输入模式,如果此时引脚悬空,PA0就是高电平,这种方式下,按下按键,引脚为低电平,松下按键,引脚为高电平 右上角PA0,把上拉电阻想象成弹簧 当按键…...
最佳矢量绘图设计软件Sketch for Mac v99.5 最新中文激活版
Sketch for Mac是一款功能强大的矢量绘图软件,它提供了简单易用的界面和丰富的工具,让用户能够轻松创建精美的设计作品。 软件下载:Sketch for Mac v99.5 最新中文激活版 Sketch具有直观的布局和智能的工具,使得设计师能够快速实现…...

【IntelliJ IDEA】运行测试报错解决方案(附图)
IntelliJ IDEA 版本 2023.3.4 (Ultimate Edition) 测试报错信息 命令行过长。 通过 JAR 清单或通过类路径文件缩短命令行,然后重新运行 解决方案 修改运行配置,里面如果没有缩短命令行,需要再修改选项里面勾选缩短命令行让其显示&#x…...
【Kotlin】List、Set、Map简介
1 List Java 的 List、Set、Map 介绍见 → Java容器及其常用方法汇总。 1.1 创建 List 1.1.1 emptyList var list emptyList<String>() // 创建空List 1.1.2 List 构造函数 var list1 List(3) { "abc" } // [abc, abc, abc] var list2 ArrayList<In…...

手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)
Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...
Java求职者面试指南:计算机基础与源码原理深度解析
Java求职者面试指南:计算机基础与源码原理深度解析 第一轮提问:基础概念问题 1. 请解释什么是进程和线程的区别? 面试官:进程是程序的一次执行过程,是系统进行资源分配和调度的基本单位;而线程是进程中的…...
Java数值运算常见陷阱与规避方法
整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...