我在面试中遇到了这个系统设计问题,我没有最好的答案。
问题是:我们想为一个用户保留一个房间5分钟,我们该怎么做?
库存数据如下所示:
酒店 ID | 房间类型_id | 日期 | 总库存 | 总保留 |
---|---|---|---|---|
123 | 001 | 2023-09-30 | 100 | 99 |
123 | 001 | 2023-10-01 | 100 | 96 |
流程是,一旦用户进入预订详细信息页面,预订服务首先在缓存中检查库存,然后现在应该有某种锁定机制来锁定房间 5 分钟。 2023年9月30日,仍有一间客房可供预订,用户A可以继续实际预订。如果同时用户 B 尝试做同样的事情,系统会以某种方式知道该特定房间类型在该日期被锁定,并且没有更多房间可供预订,因此系统将显示“此房间是不可用”
我的问题是:
total_inventory - total_reserved > 0
?我提到我们可能应该使用锁来锁定房间并设置 5 分钟的 TTL 来释放锁。但我无法真正一步一步解释清楚它是如何工作的。我的猜测是:
key = 123_001_2023_09_30(hotel_id_room_type_id_date)
value = { total_inventory: 100, total_reserved: 99, on_hold: 1}
TTL = 5 mins
每次有其他用户尝试预订时,应该首先检查是否
total_reserved + on_hold >= total_inventory
,如果为真,则阻止用户继续下一步
一旦时间到了(5分钟),redis会自动将on_hold减1(但这可行吗??)
我的答案与真实答案相距甚远吗?非常感谢任何帮助
诀窍是,每个锁都有不同的 TTL。所以你确实需要一组会过期的锁。您可以通过在 Redis 中存储锁“密钥”来实现这一点,每个锁有 1 个 TTL,然后扫描它们进行计数。这在 Redis 中并不是一个理想的操作。我实际上会考虑某种数据库,它会插入具有明确到期时间的保留行,以便您可以有效地查询它。它将给您带来许多下游优势,例如能够轻松延长保留时间,以及能够执行诸如找出历史上有趣的事情(例如转化率)之类的事情。