一种库存管理方法[发明专利]

(19)中华人民共和国国家知识产权局
(12)发明专利申请
(10)申请公布号 (43)申请公布日 (21)申请号 202110092819.5
(22)申请日 2021.01.25
(71)申请人 上海伯俊软件科技有限公司
地址 200000 上海市闵行区黎安路999、
1009号402室
(72)发明人 李清轶 陈雨陆 
(74)专利代理机构 重庆百润洪知识产权代理有
限公司 50219
代理人 杨光
(51)Int.Cl.
G06F  16/2455(2019.01)
G06Q  10/08(2012.01)
G06Q  30/06(2012.01)
(54)发明名称
一种库存管理方法
(57)摘要
本发明涉及电商库存领域,特别涉及一种库
存管理方法;该方法包括以下步骤:S1:建立
Redis缓存库存并初始化Redis缓存库存中的库
存数据;S2:批处理、异步更新Redis缓存库存、处
理Redis缓存库存的异常并生成流水记录。本发
明通过建立Redis缓存库存,在平台推单达到
1000W/h的场景下完成了全链路压测500W/h的目
标,
确保了OMS正向流程的高效处理。权利要求书1页  说明书4页  附图1页CN 112749199 A 2021.05.04
C N  112749199
A
1.一种库存管理方法,其特征在于,该方法包括以下步骤:
S1:建立Redis缓存库存并初始化Redis缓存库存中的库存数据;
S2:批处理、异步更新Redis缓存库存、处理Redis缓存库存的异常并生成流水记录。
2.根据权利要求1所述的一种库存管理方法,其特征在于,所述步骤S1中初始化Redis 缓存库存中的库存
数据包括两种途径,一种途径是在Lua脚本中进行判断,如果Redis缓存库存数据不存在时,当做0去计算再更新或初始化RedisRedis缓存库存记录;另一种途径是在Redis缓存库存中存储补偿任务,该补偿任务以基于实际数据库库存同步Redis缓存库存。
3.根据权利要求1所述的一种库存管理方法,其特征在于,所述步骤S2中异步更新Redis缓存库存采用Kafka异步进行更新。
4.根据权利要求3所述的一种库存管理方法,其特征在于,所述Kafka异步的具体步骤为基于Kafka同个分区内消费有序,自定义分区算法,使得同一个库存记录的消息投递同一个分区内有序消费。
5.根据权利要求1所述的一种库存管理方法,其特征在于,所述步骤S2中批处理的过程为基于Lua脚本对Redis缓存库存中的Redis命令进行批处理。
6.根据权利要求1所述的一种库存管理方法,其特征在于,所述步骤S2中Redis缓存库存的异常情况包括两种,一种是Kafka消费失败,对于Kafka消费失败的情况,在监听端捕获到异常后重新投递消息到该分区等待消费,记录补偿次数;另一种是投递Kafka消息失败,对于投递Kafka消息失败的情况,通过LTS补偿任务扫描Redis缓存库存中的流水key组装报文重新投递消息。
权 利 要 求 书1/1页CN 112749199 A
一种库存管理方法
技术领域
[0001]本发明涉及电商库存领域,特别涉及一种库存管理方法。
背景技术
[0002]电商平台库存的高效处理,确保OMS正向流程的处理速度。OMS订单按照调度规则调用库存分仓服务决定哪些sku由哪个仓库发货,生成发货通知单,预占库存;然后推送至仓库,WMS系统同步响应,扣减库存进行出库,回写到中台生成结果单扣减库存,并异步通知渠道库存重新计算同步销售库存。库存服务如果有延时会影响整个下单流程,而且也易产生超卖或有货无法售卖的异常情况。
[0003]为此,提出一种库存管理方法。
发明内容
[0004]本发明的目的在于提供一种库存管理方法,能够确保OMS正向流程的处理速度。[0005]为了实现上述目的,本发明的技术方案如下:
[0006]一种库存管理方法,该方法包括以下步骤:
[0007]S1:建立Redis缓存库存并初始化Redis缓存库存中的库存数据;
[0008]S2:批处理、异步更新Redis缓存库存、处理Redis缓存库存的异常并生成流水记录。
[0009]具体的,所述步骤S1中初始化Redis缓存库存中的库存数据包括两种途径,一种途径是在Lua脚本中进行判断,如果Redis缓存库存数据不存在时,当做0去计算再更新或初始化RedisRedis缓存库存记录;另一种途径是在Redis缓存库存中存储补偿任务,该补偿任务以基于实际数据库库存同步Redis缓存库存。
[0010]进一步的,本发明涉及的Redis缓存库存,业务对库存数据的查询或事务性操作均基于Redis缓存库存,批处理、异步更新Redis缓存库存、处理Redis缓存库存的异常并生成流水记录,提升了库存服务的处理速度。
[0011]具体的,所述步骤S2中异步更新Redis缓存库存采用Kafka异步进行更新;所述Kafka异步的具体步骤为基于Kafka同个分区内消费有序,自定义分区算法,使得同一个库存记录的消息投递同一个分区内有序消费,能够减少高并发场景数据库锁冲突的开销。[0012]具体的,所述步骤S2中批处理的过程为基于Lua脚本对Redis缓存库存中的Redis 命令进行批处理,能够减少了频繁Redis缓存库存连接管理的开销。
[0013]进一步的,本发明涉及的Redis缓存库存从2.6版本后引入了对lua脚本的支持,会将整个脚本作为一个整体执行,与事务类似;Lua脚本中会将命令从上到下一条条命令依次执行,先去查询更新前的redis缓存库存,然后经过判断计算后的结果是否小于0,若小于0记录该条库存记录标记缺货,若不小于0,更新对应redis缓存库存记录,并且标记该条库存记录操作成功,若后续有操作失败的记录,根据业务场景判断是需要做commit还是根据前面记录的标记成功的信息来做rollback。
[0014]具体的,所述步骤S2中Redis缓存库存的异常情况包括两种,一种是Kafka消费失败,对于Kafka消费失败的情况,在监听端捕获到异常后重新投递消息到该分区等待消费,记录补偿次数;另一种是投递Kafka消息失败,对于投递Kafka消息失败的情况,通过LTS补偿任务扫描Redis缓存库存中的流水key组装报文重新投递消息。
[0015]进一步的,本发明涉及的造成Kafka消费失败的原因包括但不限于服务器宕机、线程死掉、网络波动或数据库异常等。
[0016]进一步的,本发明涉及的在监听端捕获到异常后重新投递消息到该分区等待消费的具体过程为在报文中设置属性记录补偿次数,初始值是0,消费端代码外围有try catch,catch到异常或者判断到失败的code,会去判断报文中的失败次数,如果失败次数小于配置的阈值,就更新报文中的补偿次数+1并重新投递消息等待再次消费。
[0017]进一步的,本发明涉及的通过LTS补偿任务扫描Redis缓存库存中的流水key组装报文重新投递消息的具体过程为根据固定前缀“sg:storage_ftp:”,调用redis缓存库存的scan命令扫描相关的流水redis记录,解析redis key中的库存业务单据编号的前缀,根据不同的单据类型复用组装报文的逻辑并重新发送kafka消息。
[0018]本发明的有益效果为:本发明通过建立Redis缓存库存,在平台推单达到1000W/h 的场景下完成了全链路压测500W/h的目标,确保了OMS正向流程的高效处理。
附图说明
[0019]图1为本发明实施例的流程图。
具体实施方式
[0020]下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅是本发明的一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
[0021]一种库存管理方法,该方法包括以下步骤:
[0022]S1:建立Redis缓存库存并初始化Redis缓存库存中的库存数据;
[0023]S2:批处理、异步更新Redis缓存库存、处理Redis缓存库存的异常并生成流水记录。
[0024]具体的,本发明涉及的Redis缓存库存基于Hash结构存储进行存储,sg:storage: [%cp_c_store_id%]:[%ps_c_sku_id%]。
[0025]例如:sg:storage:100:111371289;其中,sg:storage:是固定前缀,逻辑仓id=100,条码id=111371289的Redis记录。
[0026]具体的,本发明涉及的Redis缓存库存中还包括逻辑仓库存流水KEY,sg:storage_ ftp:[%时间戳%]_[%bill_no%]。
[0027]例如:sg:storage_ftp:20191111153218_SN19110800158405,其中,sg:storage_ ftp:是固定前缀,20191111153218是时间戳,SN19110800158405是对应的库存业务单据编号。
[0028]进一步的,本发明涉及的Redis缓存库存在更新成功的同时,会针对此次库存更新
请求在Redis缓存库存中记录一条流水Key,value记录了具体仓库、sku和库存变化数量;并同时发Kafka消息触发数据库库存更新,自定义分区规则:仓库id+sku id取模Kafka分区数;在Kafka消费成功(更新数据库库存成功)时,会删除对应的流水Key,因此可以根据Redis中的流水Key来补偿丢失的消息。
[0029]进一步的,本发明涉及的Kafka消费成功就会根据Redis缓存库存更新时记录的流水KEY,直接调用Redis缓存库存中的api删除这条redis流水记录;Redis流水key定义的规则是sg:storage_ftp:时间戳_库存单据编号。
[0030]进一步的,本发明涉及的针对Kafka消费,会对报文md5加密记录log表,防止相同消息重复消费;若Kafka消费失败,累加补偿次数,会判断报文中的补偿次数,若补偿次数< [配置项参数],会重新投递消息。
[0031]其中,在报文md5加密记录log表,使用DigestUtils工具类进行md5加密解析后的报文,直接插入到log表中。
[0032]其中,Kafka消费的时候,会根据经过md5加密后的报文作为条件去查询log表是否存在,若存在就代表已经消费过了,不会重复消费。
[0033]其中,配置项参数是一个int变量,sg.control.xact_retry_times,维护在Appolo 上。
[0034]具体的,所述步骤S1中初始化Redis缓存库存中的库存数据包括两种途径,一种途径是在Lua脚本中进行判断,如果Redis缓存库存数据不存在时,当做0去计算再更新或初始化RedisRedis缓存库存记录;另一种途径是在Redis缓存库存中存储补偿任务,该补偿任务以基于实际数据库库存同步Redis缓存库存。
[0035]进一步的,本发明涉及的Redis缓存库存,业务对库存数据的查询或事务性操作均基于Redis缓存库存,批处理、异步更新Redis缓存库存、处理Redis缓存库存的异常并生成流水记录,提升了库存服务的处理速度。
[0036]具体的,所述步骤S2中异步更新Redis缓存库存采用Kafka异步进行更新;所述Kafka异步的具体步骤为基于Kafka同个分区内消费有序,自定义分区算法,使得同一个库存记录的消息投递同一个分区内有序消费,能够减少高并发场景数据库锁冲突的开销。[0037]具体的,所述步骤S2中批处理的过程为基于Lua脚本对Redis缓存库存中的Redis 命令进行批处理,能够减少了频繁Redis缓存库存连接管理的开销。
[0038]进一步的,本发明涉及的Redis缓存库存从2.6版本后引入了对lua脚本的支持,会将整个脚本作为一个整体执行,与事务类似;Lua脚本中会将命令从上到下一条条命令依次执行,先去查询更新前的redis缓存库存,然后经过判断计算后的结果是否小于0,若小于0记录该条库存记录标记缺货,若不小于0,更新对应redis缓存库存记录,并且标记该条库存记录操作成功,若后续有操作失败的记录,根据业务场景判断是需要做commit还是根据前面记录的标记成功的信息来做rollback。
[0039]具体的,所述步骤S2中Redis缓存库存的异常情况包括两种,一种是Kafka消费失败,对于Kafka消费失败的情况,在监听端捕获到异常后重新投递消息到该分区等待消费,记录补偿次数;另一种是投
递Kafka消息失败,对于投递Kafka消息失败的情况,通过LTS补偿任务扫描Redis缓存库存中的流水key组装报文重新投递消息。
[0040]进一步的,本发明涉及的造成Kafka消费失败的原因包括但不限于服务器宕机、线

本文发布于:2024-09-21 18:53:56,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/1/471161.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:库存   缓存   记录
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议