Redis atomic pop并添加到排序集,相当于BRPOPLPUSH

Redis atomic pop并添加到排序集,相当于BRPOPLPUSH,redis,Redis,我有一个redis列表“等待”和一个redis列表“聚会” 我有一个长时间运行的过程,它安全地阻止“等待”列表项出现,然后弹出它,并使用原子方式将其推到“聚会”列表上。太棒了 “等待”列表中的用户反复查询“我是否在“参与”列表中?”,但没有快速(即

我有一个redis列表“等待”和一个redis列表“聚会”

我有一个长时间运行的过程,它安全地阻止“等待”列表项出现,然后弹出它,并使用原子方式将其推到“聚会”列表上。太棒了

“等待”列表中的用户反复查询“我是否在“参与”列表中?”,但没有快速(即 因此,我尝试从redis列表切换到redis排序集,“score”作为他们加入“waiting”排序集的unix时间戳。我可以以最低的分数阻止pop(用户在队列的最前面)。通过使用排序集,我可以使用
ZSCORE
在任意一个列表上签入O(1)次,因此看起来很有希望

如何在排序集上执行类似于
BRPOPLPUSH
的原子操作? 就像我需要一个神话般的
BZRPOPMIN
&
ZADD
=
BZRPOPMINZADD
。如果进程在这两个集合之间终止,那么用户将从这两个集合中消失

查看redis中的
MULTI
EXEC
,它们并不是乍看之下的样子,它们更像是“管道”,因为我无法获得第一个命令(
BZRPOPMIN
)的结果并将其输入第二个命令(
ZADD
)。我非常怀疑将阻塞
BZRPOPMIN
也放入
MULTI
中,我这样做对吗

如何在排序集上执行BRPOPLPUSH的原子等价物

对不起,你不能。我们实际上在添加ZPOP家族时讨论过这一点,并决定反对:“然而,我不支持BZPOPZADD部分,因为与列表相关的经验表明,不幸的是,这通常不是一个好主意,增加消息处理的安全性可能会被用于其他方式。BZPOPZADD和BRPOPLPUSH等最糟糕的事情是级联效应,它们在复制过程中产生了很多问题,例如,我们的BRPOPLPUSH复制在某些方面仍然不正确(如果需要,我们可以讨论)。“(参考:)

我也非常怀疑将阻塞BZRPOPMIN放入MULTI中,我这样做对吗


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

我想不出一个好的答案。只要你想使用阻塞命令,你就非常有限,因为Redis很少使用这些命令,而且你失去了用其他命令(事务或脚本)组成原子块的能力。因此,一种方法是轮询而不是阻止。更好的建议可能是忽略看起来吓人的O(n)并坚持您的原始设计。Redis速度非常快,使您的体系结构复杂化以避免您实际上没有遇到的性能瓶颈是一种典型的反模式。谢谢,我选择了列表和O(n),这是正确的做法。