设计:在期限到期后将预留的SEAT有效地释放回池中

时间:2019-06-24 10:35:12

标签: data-structures redis distributed-system system-design

考虑一个应用程序,例如(Ticket Master或BookMyShow或任何其他座位预订应用程序)。

  • 根据所选城市,我们显示该城市中正在放映的所有电影。
  • 市将有多个电影院。
  • 每个电影院都有多个屏幕。

容量估算:每月60亿次页面浏览,每月售出1500万张预订机票。

屏幕大小可能在1000到10万个座位之间。

在保留用户选择的座位后,它们为用户提供5分钟的时间来完成付款。如果用户未能在指定的时间内完成付款,则该席位将被释放回免费池中。

在将用户重定向到付款页面之前,我们将用户选择的SEATS的状态更改为DB中的“保留”,并在高速缓存中为该特定SHOWID(高速缓存中的键)输入一个条目。

让我们说我们已经缓存了所有“预订和保留”的座位,以便在REDIS中更快地访问每个节目,而不是如下查询数据库。

{SHOWID : [{SEAT_ID, TimeInterval}, {SEAT_ID, TimeInterval}......]}

如果在任何时间点用户未能在5分钟的间隔内付款。我们需要做以下2件事,才能将座位释放回免费池中。

  • 从缓存中删除他要预订的特定SHOWID的seatID条目。
  • 在数据库中将座位状态更改回“可用”。

现在的问题是容量估算,如果用户未能在5分钟的时间内为所有城市的每次演出支付5分钟的费用,我们如何有效地将所有RESERVED座位撤回免费游泳池。这样其他用户可以立即看到这些座位的状态为可预订。

由于REDIS CACHE中所有城市的每个SHOW都有大量的RESERVED / BOOKED席位数据。

P.S:我已经阅读了有关REDIS激活钥匙有效方式的信息。但是它会随机选择密钥以检查是否过期,如果过期,它将删除该条目。但这可能导致某些座位状态仍显示为RESERVED,即使预订过期时间已经超过REDIS随机选择为止。

0 个答案:

没有答案