redis - 有没有办法实现仅在密钥已经存在时才弹出的 BLPOPX?
问题描述
无论密钥是否存在,BLPOP 都会阻塞。我需要检查密钥是否存在的“X”版本,类似于 LPUSHX、RPUSHX。如果密钥不存在,则该命令为空操作。我只想在事件发生时从列表中弹出。有 EXIST 命令,但有两个命令不是原子的。我可以将这两个命令放入 lua 脚本中以原子方式运行吗?由于命令可能阻塞,这是否会挂起 redis?
解决方案
看来您对 Redis LIST 和 BLPOP/LPOP 命令的行为有一些误解。如果列表为空,Redis 会自动删除相关的key,即如果列表为空,则该key 不存在。
如果密钥不存在,则该命令为空操作。
这就是LPOP
命令的作用。如果 key 不存在,则LPOP
立即返回 nil 回复。否则,它会从列表中弹出一个项目。但是,在这种情况下,您需要在客户端进行池化工作。
我可以将这两个命令放入 lua 脚本中以原子方式运行吗?由于命令可能阻塞,这是否会挂起 redis?
你不能这样做。事实上,Lua 脚本禁止那些BLPOP
会阻塞 Redis 的命令,例如 。
推荐阅读
- jmeter - Jmeter恒定吞吐量采样器的问题
- c++ - 在某些情况下,链接器会抱怨未定义的引用。模板类静态对象成员
- facebook - 无法获得 Facebook 应用管理员的 manage_pages publish_pages 权限
- java - Spring 配置类如何获取其方法所期望的对象的实例?
- oracle - 不是 regexp_like,查找空值
- typescript - 根据另一个对象的属性在一个对象中键入属性(在 Typescript 中)
- html - 在我的代码中将弹性项目与行对齐
- html - 如何使用 Observables/实时更改 angular2+ 表中的一项
- java - 使用 JDBC 的群聊服务器
- javascript - 如何使二维码扫描仪只扫描二维码而不扫描其他东西