gpt4 book ai didi

Redis 原子弹出并添加到有序集合,相当于 BRPOPLPUSH

转载 作者:IT王子 更新时间:2023-10-29 06:08:50 27 4
gpt4 key购买 nike

我有一个 redis 列表“waiting”和一个 redis 列表“partying”。

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

“waiting”列表中的用户反复查询“我在“partying”列表中了吗?”,但没有快速(即 < O(n))检查用户是否在 redis 列表中的方法.您必须获取整个列表并循环遍历它。

所以我求助于从 redis 列表切换到 redis 排序集,其中“分数”作为他们加入“等待”排序集时的 unix 时间戳。我可以阻止得分最低的流行音乐(队列头部的用户)。使用排序集,我可以使用 ZSCORE 来检查 O(1) 时间,如果它们在任一列表中,所以它看起来很有希望。

如何在排序集上执行 BRPOPLPUSH 的原子等价物?就像我需要一个神话般的 BZRPOPMIN & ZADD= BZRPOPMINZADD。如果进程在这两个集合之间终止,则用户实际上将从两个集合中消失。

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

最佳答案

How can I perform the nice atomic equivalent of BRPOPLPUSH on sorted sets? 

对不起,你不能。我们实际上在添加 ZPOP 系列时讨论过这个问题并决定反对它:“但是我不支持 BZPOPZADD 部分,因为列表的经验表明这通常不是一个好主意,不幸的是,增加安全性消息处理可能使用其他方式。BZPOPZADD 和 BRPOPLPUSH 等最糟糕的事情是级联效应,它们在复制中造成很多问题,例如,我们的 BRPOPLPUSH 复制在某些方面仍然不正确(我们可以谈谈如果你愿意的话)。” (引用:https://github.com/antirez/redis/pull/4879#issuecomment-389116241)

 I'm very suspicious of putting the blocking BZRPOPMIN into the MULTI too, am I right to be?

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

关于Redis 原子弹出并添加到有序集合,相当于 BRPOPLPUSH,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52023929/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com