有没有一种方法可以一次性从Redis列表中弹出所有的列表项?

5
我想一次性从Redis列表中弹出所有列表项。
当列表为空时,我不想调用 lpoprpop 方法,因为多次向 redis-server 发送请求似乎效率低下。
我也知道可以使用 lrange 方法获取所有列表项,但无法弹出这些列表项。
你能给我建议吗?
我只想通过一次请求向 redis-server 弹出并获取列表项。
4个回答

5
如Itamar Haber所说,可以使用lrange和del命令。在管道模式下,这将作为一个单独的命令完成。
LRANGE key 0 -1
DEL key

3
当其他进程正在向列表中推送时,这似乎会创建竞争条件。例如,另一个应用程序/进程在Redis执行“LRANGE”和“DEL”之间添加了一个项目到列表中。 - Jeff Puckett
1
不,如果这些命令以PIPE模式发送,则不能。或者您可以使用MULTI和EXEC。 - h0x91B
2
Redis的管道技术不是原子性的。 - SangminKim

5

Redis没有POPALL命令,但是通过嵌入Lua脚本,您可以轻松地执行此操作,例如:

local reply = redis.call('LRANGE', KEYS[1], 0, -1)
redis.call('DEL', KEYS[1])
return reply

1

关于什么

RENAME key key_processing
LRANGE key_processing 0 -1
DEL key_processing

这样做可以弹出所有的项并保持原始键“empty”,但任何人都可以将新元素写入/推入键列表(以便将来处理)。


1

redis 6.2.0 版本开始,你可以从键中 lpop 'count'。

LPOP KEY N

这将从KEY中弹出N个元素。您可以使用LLEN来计算列表的长度。

LLEN KEY

使用redis pipeline和组合这两个命令,可以通过单个命令弹出所有元素。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接