我试图用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
但这将如何加载服务器?