Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Concurrency redis中的并发优先级队列?_Concurrency_Redis_Priority Queue - Fatal编程技术网

Concurrency redis中的并发优先级队列?

Concurrency redis中的并发优先级队列?,concurrency,redis,priority-queue,Concurrency,Redis,Priority Queue,我想在Redis中实现一个并发优先级队列,不同机器上的多个进程添加项目(有分数),多个其他进程弹出这些项目,分数最低的优先 可以使用LPUSH和RPOP实现简单队列 使用ZSET,我可以使用ZADD添加项目,并使用ZRANGE和ZREM弹出它们,只要只有一个阅读器 对于多个读者,我想我需要类似ZPOP的东西,它将ZRANGE和ZREM结合在一个原子操作中。否则,两个读卡器可能会先从ZRANGE获取相同的项目,然后才能对其进行ZREM。如果ZREM返回0,则重试将有效,但不可取 使用当前的Redi

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

可以使用LPUSH和RPOP实现简单队列

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

对于多个读者,我想我需要类似ZPOP的东西,它将ZRANGE和ZREM结合在一个原子操作中。否则,两个读卡器可能会先从ZRANGE获取相同的项目,然后才能对其进行ZREM。如果ZREM返回0,则重试将有效,但不可取


使用当前的Redis命令有什么方法可以做到这一点吗?有没有什么原因没有将其添加到Redis中?这似乎是一个非常容易实现的命令。

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


我假设ZPOP并没有放在第一位,因为它不是一个常见的用例,并且在需要时,它可以很容易地编写脚本。

您可以使用redis命令:watch

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

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

从Redis 5.0.0中,您可以使用and(以及它们的阻塞对应项and)。

如何执行此命令?我在文档中看到了它,但我不知道如何执行它