问题描述
有一个库存管理系统,可以接收新库存、为订单分配库存、在结账页面保留库存。在任何给定的时间点,系统都应该能够在 {productId,storeId} 级别告知可用库存。实体看起来像:
新库存
{
"storeId": "100001-W101","productId": "100001123456","quantity": 5
}
分配的库存
{
"storeId": "100001-W101","quantity": 1
}
[以上表示已在此 storeId 为该 productId 分配了 1 个订单]
预留库存
{
"storeId": "100001-W101","cartId: "123","expireTime": 1622962817,"quantity": 2
}
{
"storeId": "100001-W101","cartId: "113","expireTime": 1622962819,"quantity": 1
}
[以上表示该 storeId 已经预留了 3 个该 productId 数量]
因此,storeId: 100001-W101
和 productId: 100001123456
的可用库存为:
5 (onhand) - 1 (allocated) - 2 (reserved) - 1 (reserved) = 1
每当超过 expireTime(以纪元毫秒为单位)时,都需要删除保留条目
我们可以清楚地看到,对于保留实体,我们需要在 {productId,storeId} 级别进行聚合。
如果我们可以快速查询分配数量和预留数量,那么可用库存的计算将非常容易。
考虑redis:
我们可以将这些实体存储为键值对,例如:
INHAND#PRODUCTID#STOREID: 5
ALLOCATED#PRODUCTID#STOREID: 1
RESERVED#PRODUCTID#STOREID#CARTID: {"qty" : 2,"expiry": 1622962819}
在这种情况下查找会非常快,但是在保留的情况下聚合会很困难!!为了克服这个问题,我们可以这样做:
RESERVED#PRODUCTID#STOREID: [{"cart":"123","qty" : 2,"expiry": 1622962819},{"cart":"113","qty" : 1,"expiry": 1622962817}]
但是这个列表可能会增长,并且它可能会溢出 redis 中允许的记录大小。
此外,是否可以使用 redis TTL 概念来自动使这些保留条目过期(我们需要 100% 保证它在正确的过期时间发生,因为这是核心业务逻辑)?
如果没有,我们可以编写一个调度程序来获取所有以 KEYS RESERVED* 开头的键,但这是一个好主意吗?我能否在我的应用层逐个迭代这些键?
考虑其他数据库:
我应该考虑将时间序列数据库之类的东西作为我的数据存储吗?读写速度够快吗?
Edit-1:保留的对象在任何给定时间都不会超过 5k,因为我们在到期后(2 分钟)刷新这些对象,或者在成功下订单后将它们移动到分配的存储桶.
Postgres 在这里工作吗?因为拥有一个完整的时间序列数据库会有点矫枉过正
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)