【问题标题】:Concurrent priority queue in redis?redis中的并发优先级队列?
【发布时间】:2014-10-14 20:00:48
【问题描述】:

我想在 Redis 中实现一个并发优先级队列,不同机器上的多个进程添加项目(带有分数)和多个其他进程弹出这些项目,最低分数优先。

可以使用 LPUSH 和 RPOP 实现一个简单的队列。

使用 ZSET,只要只有一个阅读器,我就可以使用 ZADD 添加项目并使用 ZRANGE 和 ZREM 弹出它们。

对于多个读者,我认为我需要像 ZPOP 这样的东西,它将 ZRANGE 和 ZREM 结合在一个原子操作中。否则,两个读者可能在 ZREM 之前从 ZRANGE 获得相同的项目。如果 ZREM 返回 0 则重试可以,但不可取。

有没有什么方法可以使用当前的 Redis 命令来做到这一点?是否有任何理由尚未将其添加到 Redis 中?看起来这将是一个非常简单的命令来实现。

【问题讨论】:

    标签: concurrency redis priority-queue


    【解决方案1】:

    如果您使用执行 ZRANGE 和 ZREM 的 Lua 脚本或使用 MULTI/EXEC 块,您可以保证原子性。这将防止多个工作人员相互干扰。

    我认为 ZPOP 一开始就没有被加入,因为它不是一个常见的用例,而且在需要时,它可以很容易地编写脚本。

    【讨论】:

      【解决方案2】:

      从 Redis 5.0.0 开始,您可以使用 ZPOPMINZPOPMAX(以及它们的阻塞对应物 BZPOPMINBZPOPMAX)。

      【讨论】:

        【解决方案3】:

        你可以使用redis命令:watch

        WATCH zset
        element = ZRANGE zset 0 0
        MULTI
        ZREM zset element
        EXEC
        

        如果 exec 失败(返回 null 回复),只需重复这些命令。

        【讨论】:

        • 你如何执行这个?我在文档中看到它,但我不知道如何执行它
        猜你喜欢
        • 1970-01-01
        • 2011-04-30
        • 2011-12-20
        • 1970-01-01
        • 2017-06-16
        • 2013-02-13
        • 1970-01-01
        • 2012-02-24
        • 1970-01-01
        相关资源
        最近更新 更多