*Redis BLMOVE 命令 阻塞地从列表弹出元素并推入另一列表

*BLMOVE

*语法

BLMOVE source destination LEFT|RIGHT LEFT|RIGHT timeout

*说明

BLMOVELMOVE 的阻塞(blocking)版本。原子地从列表 source 中移除一个元素,并将其插入到列表 destination 中。

  • 前两个方向参数与 LMOVE 相同:分别指定从 source 的哪一端移除,以及插入到 destination 的哪一端。
  • source 非空时,BLMOVE 的执行效果与 LMOVE 完全相同,不会阻塞。
  • source 为空时,客户端连接将被阻塞,直到另一个客户端向 source 列表插入新元素,或 timeout 超时。
  • timeout 为阻塞的最大等待秒数,timeout = 0 表示永久阻塞。
  • MULTI / EXEC 事务中使用 BLMOVE 时,其行为与 LMOVE 相同(不会阻塞)。
  • BLMOVE 用于替代已弃用的 BRPOPLPUSHBRPOPLPUSH source destination timeout 等价于 BLMOVE source destination RIGHT LEFT timeout

*示例

# 构建源列表
redis-cli RPUSH src a b c

# source 非空,立即执行(从尾部移到另一列表头部)
redis-cli BLMOVE src dst RIGHT LEFT 0

# 查看结果
redis-cli LRANGE src 0 -1
redis-cli LRANGE dst 0 -1

# source 为空时阻塞(在另一个终端执行 RPUSH src x 可解除阻塞)
redis-cli BLMOVE empty_src dst LEFT LEFT 5

*返回值

  • Bulk string reply:从 source 移除并插入到 destination 的元素值。
  • Nil replytimeout 超时且 source 仍为空,返回 nil

*版本兼容性

版本 说明
>= 6.2.0 可用;替代已弃用的 BRPOPLPUSH
< 6.2.0 不支持

*时间复杂度

O(1)。

*模式:可靠队列

BLMOVE 可用于构建可靠的消息队列:消费者将消息从主队列原子地移动到待处理队列(processing queue),处理完成后再用 LREM 删除。即使客户端崩溃,消息也不会丢失。