我正在尝试使用Redis实现排队系统。所以可以说我们有这个列表:
> LPUSH listTickets 1 2 3 4 5 6 7 8 9
,并以移动应用程序用户身份分配了一个号码4,另一个用户号码6。现在,我想向他们显示他们面前有多少张票(还可以计算等待的估计时间)。现在,这似乎很简单,
> LPOP listTicket
"4"
然后我们广播结果(当前要调用的票号),然后在移动应用程序中,每个人都将从自己的票号中减去该结果。例如我当前的票是6
,所以6-4=2
这样每个用户都知道前面有多少张票
但是,一旦您想添加功能以允许用户删除其票证或将其推送到队列的末尾,事情就会变得复杂。例如删除后
> LRANGE listTicket 0 -1
1) "2"
2) "4"
3) "6"
4) "7"
5) "8"
当我们LPOP listTicket
时,我们将得到2,而票证为6的移动应用将计算6-2,而得到4,这是错误的计算。
您有什么想法吗?每当有人删除其工单时,获取列表中每个工单的索引是一个昂贵的计算过程吗?我应该只发送队列中的所有票证,让用户计算自己的位置吗?
我希望系统具有可伸缩性。因此,redis节点服务器可以处理总计5万个(通过不同的队列或列表)连接的移动应用程序,从而使它们在为其预订票证的队列中排名。
我考虑过使用ZRANK
,但这将如何加载服务器?