热点库存方案设计
2021-02-25 14:02:05 0 举报
热点库存方案设计
作者其他创作
大纲/内容
失败
可用数不足
不存在
6-2
4-5
是否同步redisredis_status==1
6-11
①获取有序集合的成员数 ZCARD redis_stk_stocklog②根据总成员数和每页条数计算总页数③循环分页获取有序集合中的元素 ZREVRANGE redis_stk_stocklog 0 99查出这一批所有skuId_warehouseId_whareatypeId_ownerId
redis操作成功与否
流水表【stk_stocklog】
更新库存账成功与否
7-5
7-10
1-3
增量同步:将加流水汇总到redis可用缓存【redis_stk_stock】
redis回滚做逆向操作:如果是加流水这里就减,如果是减流水这里就加命令:ZINCRBY redis_stk_stock -qty 286376_2170_1_27
①查询redis可用缓存【redis_stk_stock】指令:ZSCORE key memberps:ZSCORE redis_stk_stock 286376_2170_1_27返回:redisQty②redisQty-skuQTy
7-4
2-5
抛出异常由事务回滚
5-1
2-2
8-2
3-9
3-7
3-11
数据来源:生成流水表的同时记录一条未同步的redis状态表用途:流水汇总redis可用库存,每汇总完一条流水就更新为已同步
根据流水id查询redis同步状态表【sync_redis_status】
结果与0比较
基于此我们就不区分热点sku与非热点sku全部当热点sku来处理
6-6
id(流水id)
stock_status(同步库存状态:1已同步,0未同步,默认0)
create_time(创建时间)
sync_time(同步时间)
000000c899e5400db7865917bb56d248
0
2021-01-29 10:40:40
汇总完成同步更新表sync_stock_status状态stock_status=1
2-7
定时任务StockLogSyncRedisJob
成功
更新同步库存状态表成功与否
7-6
数据结构【SortedSet(有序集合)】key score memberredis_stk_stocklog 时间戳 skuId_warehouseId_whareatypeId_ownerId
减库存请求
存在
加库存
3-1
7-2
记录库存账表实际可用数
②关联stk_stocklog和sync_redis_status查询redis_status=0的记录
将流水表【stk_stocklog】的数据汇总更新到【库存账表stk_stock】,并且更新同步库存状态表【sync_stock_status】stock_status=1已同步
2-3
异步
数据库操作成功与否
定时任务StockLogSyncStockJob
=0
select redis_status from sync_redis_status where id=?
库存账表【stk_stock】
continue继续下一条
根据skuId_warehouseId_whareatypeId_ownerId查询流水表【stk_stocklog】关联同步redis状态表【sync_redis_status】并且未同步【redis_status=0】的记录
将redis操作记录表【redis_stk_stocklog】中已同步库存状态表【stock_status=1】,并且已同步redis状态表【redis_status=1】的记录删除
7-3
redis可用库存账
①数据库由事务控制回滚②移除redis流水id命令:del('流水id')
select count(*) from stk_stocklog where billcode =? and singleproductid =? and warehouseid =? and whareatypeid =? and ownerid =?
1-10
定时JOB
6-1
8-4
表
key
score【可用数】
member【skuId_warehouseId_whareatypeId_ownerId 】
redis_stk_stock
2-1=1
286376_2170_1_27
......
汇总完成同步更新表sync_redis_status状态stock_status=1
流程图:
false
库存状态更新成功与否
redis可用库存【redis_stk_stock】
3-6
根据skuId_warehouseId_whareatypeId_ownerId查询流水表【stk_stocklog】关联同步库存状态表【sync_stock_status】并且未同步【stock_status=0】的记录
4-9
5-2
数据库回滚
1-11
供定时任务同步更新可用库存
2-10
2-12
是否存在流水
1-7
流水更新redis可用数JOB【StockLogSyncRedisJob】
①新增减流水记录【stk_stocklog】②新增库存同步状态记录【sync_stock_status】
将库存账表【stk_stock】的数据汇总更新到redis可用数缓【redis_stk_stock】
1-8
② 更新同步redis状态表【sync_redis_status】update sync_redis_status set redis_status=1 where id=?
减库存
由于库存账表数据比较多可以采用pipeline命令每次执行一页数据
直接返回“请不要重复操作”
3-5
①新增加流水记录【stk_stocklog】②新增同步库存状态记录【sync_stock_status】③新增同步redis状态记录【sync_redis_status】
梦洁项目:sku:10W+热点sku:50-库存账表【stock_stock】:260W+库存流水表【stock_stocklog】:1300W+
分页查询库存账表,然后缓存到redis可用库存
set指令成功与否
1-1
全量同步:将加流水汇总到redis可用数缓存【redis_stk_stock】
数据来源:生成流水表的同时记录一条未同步的库存状态表用途:流水汇总库存账,每汇总完一条流水就更新为已同步
2-6
①从redis操作记录缓存中分页获取流水元信息:skuId_warehouseId_whareatypeId_ownerId
检查流水表是否存在此单
3-10
6-5
score【时间戳(秒)】
member【skuId_warehouseId_whareatypeId_ownerId】
redis_stk_stocklog
20210119172820
更新同步库存状态表【sync_stock_status】为已同步update sync_stock_status set stock_status=1 where id=?
id
singleproductid
warehouseid
whareatypeid
ownerid
qtybfchange
qtyafchange
qty
.....
50007122
1333
1
27
2
4-11
7-9
返回扣减失败
写redis可用库存【redis_stk_stock】命令:ZINCRBY redis_stk_stock QTYAVAILABLE skuId_warehouseId_whareatypeId_ownerId
6-7
未同步
4-12
7-8
redis状态更新成功与否
根据stock_status=1 and redis_status=1定期清除缓存
②更新同步库存状态表【sync_stock_status】为已同步update sync_stock_status set stock_status=1 where id=?
②写redis操作记录:操作指令【ZINCRBY key increment member】ps:ZINCRBY redis_stk_stocklog 20210119172820 286376_2170_1_27
5-3
Transaction事务
stock_status==1 and redis_status==1
①判断开关(默认关闭)是否开启,如果未开启走原逻辑,如果开启走新版逻辑②并发控制,将单号缓存到redis
1-6
将流水表【stk_stocklog】的数据汇总更新到redis可用数缓存【redis_stk_stock】,并且更新同步redis状态表【sync_redis_status】redis_status=1已同步
已同步
7-1
lua脚本
库存账全量同步redis可用数JOB【StockSyncRedisJob】
redis是否存在流水id
加库存请求
根据流水id查询同步redis状态表【sync_redis_status】
加库存成功
全量同步--支持自动和手动执行
3-4
4-8
true
1-4
幂等控制
4-4
定时抽取
①新增减流水记录【stk_stocklog】、新增同步库存状态表【sync_stock_status】记录
3-12
2-13
流水更新库存账JOB【StockLogSyncStockJob】
20210119172559
50007122_1333_1_27
6-8
②对redis可用数缓存【redis_stk_stock】进行扣减 ps:ZINCRBY redis_stk_stock -1 286376_2170_1_27
1-2
4-2
数据结构【SortedSet(有序集合)】key score memberredis_stk_stock qtyavailable skuId_warehouseId_whareatypeId_ownerId
id(主键)
bill_no(单据编号)
remark(备注)
operator(操作人)
operate_time(操作时间)
xxx
XSDD1200...
单据编号【xxx】,SKU【xxx】,仓库【xxx】,库位【xxx】,货主【xxx】,变更前:qty【x】,qtyLock【x】,qtyAvailable【x】;变更后:qty【x】,qtyLock【x】,qtyAvailable【x】
2021-01-20 14:50:20
4-6
写redis操作记录【redis_stk_stocklog】
Transaction
返回扣减成功
8-1
定时任务RemoveRedisStockLogJob
7-7
8-5
②写redis操作记录:操作指令【ZINCRBY key increment member】ps:ZINCRBY redis_stk_stocklog 20210119172559 50007122_1333_1_27
记录每次库存变动,便于跟踪
6-3
span style=\"font-size: inherit;\
删除redis操作记录表【redis_stk_stocklog】JOB【RemoveRedisStockLogJob】
6-4
6-10
3-8
① 将流水数据汇总更新到库存账表【stk_stock】update stk_stock set qtyavailable=? where singleproductid=? and warehouseid=? and whareatypeid=? and ownerid=?
-1
记录每个sku的库存增加和减少
redis是否存在此流水id
continue继续下一条流水
记录库存增加和减少
1-9
redis_status(同步redis状态:1已同步,0未同步,默认0)
提供一个url地址浏览器可访问即手动调用
3-2
同步库存状态表【sync_stock_status】
8-3
2-9
6-9
①从redis操作记录缓存中获取流水元信息②关联stk_stocklog和sync_redis_status查询redis_status=0的记录
写库存操作日志表
4-1
4-10
删除redis操作记录【redis_stk_stocklog】命令:ZREM redis_stk_stocklog 286376_2170_1_27
redis操作记录【redis_stk_stocklog】
①写redis操作记录【redis_stk_stocklog】②扣减redis可用缓存ZINCRBY redis_stk_stock -1 286376_2170_1_27
2-1
8-6
数据库实时库存账
4-3
Lua脚本
扣减时判断可用数
1-5
库存账更新成功与否
2-14
2-8
库存操作日志表【stk_stock_operate_log】
2-4
①新增加流水记录【stk_stocklog】、新增同步库存状态表【sync_stock_status】和同步redis状态表【sync_redis_status】记录
同步结束
2-11
加库存失败
4-13
①从redis操作记录缓存中获取流水元信息②关联stk_stocklog和sync_stock_status查询stock_status=0的记录
4-7
3-3
redis操作记录 【redis_stk_stocklog】
抽取接口供全量和增量调用
① 将流水数量原子加到redis缓存中【redis_stk_stock】命令:ZINCRBY redis_stk_stock qty 286376_2170_1_27
同步redis状态表【sync_redis_status】
①获取有序集合的成员数 ZCARD redis_stk_stocklog②根据总成员数和每页条数计算总页数③循环分页获取有序集合中的元素 ZREVRANGE redis_stk_stocklog 0 99查出这一批所有skuId_warehouseId_whareatypeId_ownerId
0 条评论
下一页