Redis原子弹出并添加到与BRPOPLPUSH等效的排序集中

时间:2018-08-26 07:02:15

标签: redis

我有一个Redis列表“正在等待”和一个Redis列表“正在聚会”。

我有一个运行很长时间的过程,可以安全地阻止“等待”列表项出现,然后将其弹出并使用BRPOPLPUSH自动将其推送到“聚会”列表中。很棒。

“正在等待”列表中的用户反复查询“我在“聚会”列表中吗?”,但是没有快速(即

因此,我要从redis列表切换到redis排序集,将“分数”作为他们加入“ waiting”排序集时的unix时间戳。我可以在最低分数上阻止流行音乐(用户位于队列的开头)。使用排序集,我可以使用ZSCORE来检查O(1)时间是否在两个列表中,所以看起来很有希望。

如何在已排序的集合上执行BRPOPLPUSH的原子等效项? 就像我需要神话般的BZRPOPMINZADD = BZRPOPMINZADD。如果该过程在这两者之间终止,则将有效地从这两个集合中消失一个用户。

在redis中查看MULTI EXEC transactions时,它们并不是乍看起来的样子,它们更像是“管道”,因为我不能获取第一个命令(BZRPOPMIN)的结果并将其输入第二个命令(ZADD)。我也非常想将封锁的BZRPOPMIN放到MULTI中,对吗?

1 个答案:

答案 0 :(得分:4)

  

如何在排序集上执行与BRPOPLPUSH相当的原子等效项?

抱歉,不能。我们实际上在添加ZPOP系列时讨论了此问题,并决定反对:“但是我不适合BZPOPZADD部分,因为相反,列表的经验表明,不幸的是,这通常不是一个好主意,并且增加了消息处理可能使用其他方式.BZPOPZADD和BRPOPLPUSH等最糟糕的事情是级联效应,例如它们在复制中产生了很多问题,并且我们的BRPOPLPUSH复制在某些方面仍然不正确(我们可以讨论如果需要的话)。” (参考:https://github.com/antirez/redis/pull/4879#issuecomment-389116241

  

我非常怀疑是否将阻止BZRPOPMIN放入MULTI中,我是否正确?

当然,无论如何都不能在事务内部调用阻塞命令。