首页 > 解决方案 > 有没有办法实现仅在密钥已经存在时才弹出的 BLPOPX?

问题描述

无论密钥是否存在,BLPOP 都会阻塞。我需要检查密钥是否存在的“X”版本,类似于 LPUSHX、RPUSHX。如果密钥不存在,则该命令为空操作。我只想在事件发生时从列表中弹出。有 EXIST 命令,但有两个命令不是原子的。我可以将这两个命令放入 lua 脚本中以原子方式运行吗?由于命令可能阻塞,这是否会挂起 redis?

标签: redis

解决方案


看来您对 Redis LIST 和 BLPOP/LPOP 命令的行为有一些误解。如果列表为空,Redis 会自动删除相关的key,即如果列表为空,则该key 不存在。

如果密钥不存在,则该命令为空操作。

这就是LPOP命令的作用。如果 key 不存在,则LPOP立即返回 nil 回复。否则,它会从列表中弹出一个项目。但是,在这种情况下,您需要在客户端进行池化工作。

我可以将这两个命令放入 lua 脚本中以原子方式运行吗?由于命令可能阻塞,这是否会挂起 redis?

你不能这样做。事实上,Lua 脚本禁止那些BLPOP会阻塞 Redis 的命令,例如 。


推荐阅读