我想在Redis中实现一个并发优先级队列,在不同的机器上添加多个进程(有分数),多个其他进程弹出这些项目,最低得分。
可以使用LPUSH和RPOP实现简单队列。
使用ZSET,我可以使用ZADD添加项目,并使用ZRANGE和ZREM弹出它们,只要只有一个阅读器。
对于多个读者,我认为我需要像ZPOP这样的东西,它将ZRANGE和ZREM结合在一个原子操作中。否则两个读者可能会从ZRANGE获得相同的项目,然后才能ZREM。如果ZREM返回0则重试将起作用但不可取。
我是否可以使用当前的Redis命令执行此操作?是否有任何原因尚未添加到Redis中?这似乎是一个非常简单的命令来实现。
答案 0 :(得分:4)
如果你使用一个执行ZRANGE&的Lua脚本,你可以保证原子性。 ZREM或MULTI / EXEC块。这可以防止多个工人互相干扰。
我认为ZPOP首先没有放入,因为它不是一个常见的用例,并且在需要时可以很容易编写脚本。
答案 1 :(得分:1)
你可以使用redis命令:watch
WATCH zset
element = ZRANGE zset 0 0
MULTI
ZREM zset element
EXEC
如果exec失败(返回空回复),只需重复这些命令。
答案 2 :(得分:0)