如何在Redis 6.2中使用BLMOVE命令替代已废弃的RPOPLPUSH?

秋丽同学_6115

秋丽同学_6115

2026-10-28

859人浏览

原创

BLMOVE 是 Redis 6.2 替代 BRPOPLPUSH 的唯一推荐阻塞式列表搬运命令,参数更清晰、支持同 Key 旋转与集群槽约束;其 timeout 固定第五位,方向参数须大写,source 与 destination 必须同槽,超时返回 nil,destination 不存在时自动创建。

如何在redis 6.2中使用blmove命令替代已废弃的rpoplpush?

BLMOVE 是 Redis 6.2 中替代 BRPOPLPUSH 的唯一推荐阻塞式列表搬运命令,它完全兼容原语义,但参数结构更清晰、方向控制更明确,且支持同 Key 旋转和集群槽约束检查。

BLMOVE 与 BRPOPLPUSH 的参数映射关系

BRPOPLPUSH source destination timeout 的行为,等价于 BLMOVE 的以下组合:

  • BLMOVE source destination RIGHT LEFT timeout → 原 BRPOPLPUSH(右弹左推)
  • BLMOVE source destination LEFT RIGHT timeout → 相当于“左弹右推”,即反向轮询场景
  • BLMOVE source source RIGHT RIGHT timeout → 同 Key 旋转(类似 BRPOPLPUSH source source timeout)

注意:timeout 必须是数字,不能为字符串;0 表示无限等待,非 0 值单位为秒(Redis 6.0+ 支持浮点数,如 0.1)。

集群环境下 BLMOVE 的槽位限制必须显式处理

BLMOVE 要求 source 和 destination 必须位于同一哈希槽,否则报错 CROSSSLOT Keys in request don't hash to the same slot。这不是可选优化,而是强制约束。

redis-tools
redis-tools

按类别查找Redis命令、检测服务器连接、监控键数量和内存占用,支持离线速查表。

下载
  • 若使用键名带花括号(如 task:{user123}:pending 和 task:{user123}:processing),Redis 会自动按 {user123} 计算槽位,通常满足要求
  • 若键名无一致性哈希标签(如 queue:src 和 queue:dst),需手动确保二者在相同节点,或改用 CLUSTER KEYSLOT 验证
  • 跨槽调用会直接失败,不会降级或重试

常见误用:把 BLMOVE 当作 LMOVE 加 timeout 使用

BLMOVE 不是 “LMOVE + 阻塞”,它的阻塞逻辑只作用于 source 列表为空时;一旦 source 有数据,它立刻执行并返回元素,不等待 destination 准备就绪(destination 不存在会自动创建)。

  • 错误认知:“加了 timeout 就能保证两端都 ready” → 实际上 destination 创建是原子的,无需预热
  • 典型陷阱:在 Lua 脚本中混用 BLMOVE 和 EXISTS 判断 destination,脚本内无法阻塞,应避免
  • 超时返回值是 nil(空回复),不是空数组或空字符串,客户端需用 == nil 或 isNull() 判断

迁移旧 BRPOPLPUSH 代码时最易忽略的细节

BRPOPLPUSH 在 source 为空且超时后,如果 destination 原本不存在,它不会创建;而 BLMOVE 即使超时,只要执行过一次搬运(哪怕超时前没发生),destination 就已存在。但更重要的是:

  • BRPOPLPUSH 的 timeout 参数位置固定为第三位;BLMOVE 的 timeout 固定为第五位,中间两个方向参数不可省略
  • 方向参数必须全大写:LEFT/RIGHT,小写或混合大小写(如 left)会导致 ERR unknown command
  • 没有 BLMOVE 的“非阻塞变体”——想做非阻塞搬运,必须用 LMOVE,不能靠设 timeout=0 模拟

真正棘手的地方在于:BLMOVE 的原子性涵盖“弹出 + 推入 + 超时判断”全过程,但它的日志/监控埋点很难拆解哪一步耗时,线上排查阻塞延迟时,得结合 SLOWLOG 和 client list 的 flags=b 状态综合看。

相关专题

更多
常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.02

4689

19

内存数据库有哪些
内存数据库有哪些

内存数据库有Redis、Memcached、Apache Ignite、VoltDB、TimesTen、H2 Database、Aerospike、Oracle TimesTen In-Memory Database、SAP HANA和ache Cassandra。更多关于内存数据库相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.14

4235

11

mongodb和redis哪个读取速度快
mongodb和redis哪个读取速度快

redis 的读取速度比 mongodb 更快。原因包括:1. redis 使用简单的键值存储,而 mongodb 存储 json 格式的数据,需要解析和反序列化。2. redis 使用哈希表快速查找数据,而 mongodb 使用 b-tree 索引。因此,redis 在需要高性能读取操作的应用程序中是一个更好的选择。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.02

7992

6

redis怎么做缓存服务器
redis怎么做缓存服务器

redis 作为缓存服务器的答案:redis 是一款开源、高性能、分布式的键值存储,可作为缓存服务器使用。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

663

6

redis怎么解决数据一致性
redis怎么解决数据一致性

redis 提供了两种一致性模型,以维护副本数据一致性:强一致性 (sync) 确保写操作仅在复制到所有从节点后才完成;最终一致性 (async) 则在主节点上写操作后认为已完成,牺牲一致性换取性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

776

6

mysql和redis怎么保证双写一致性
mysql和redis怎么保证双写一致性

确保 mysql 和 redis 双写一致性的技术包括:1、事务性更新:同时更新 mysql 和 redis,保证一致性;2、主从复制:mysql 主服务器更改同步到 redis 从服务器;3、基于事件的更新:mysql 记录更改并发送到 redis等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

8082

6

redis缓存一般存些什么数据
redis缓存一般存些什么数据

redis缓存中存储的数据类型包括:字符串、哈希、列表、集合、有序集合、位图、地理空间数据和hyperloglog。这些数据类型适用于存储各种数据,从简单信息到复杂对象和地理位置。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

1180

6

redis的8种数据类型有哪些
redis的8种数据类型有哪些

redis 提供 8 种数据类型:字符串(文本、数字、二进制)、哈希(键值对)、列表(有序集合)、集合(无序唯一元素)、有序集合(按分数排序)、地理空间(地理位置)、hyperloglog(估计大数据基数)和位图(位序列存储)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

1216

6

redis主要作用有哪些
redis主要作用有哪些

redis 的主要作用包括:1. 缓存数据,提高访问速度;2. 充当消息队列,实现消息传递;3. 存储各种数据类型,如字符串、散列和集合;4. 管理会话信息,确保可靠性和可用性;5. 限制请求速率,防止服务器超载等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.07

6998

6

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
phpEnv手册
phpEnv手册

共0课时 | 0人学习