*Redis BLMOVE 命令 阻塞地从列表弹出元素并推入另一列表
*BLMOVE
*语法
BLMOVE source destination LEFT|RIGHT LEFT|RIGHT timeout
*说明
BLMOVE 是 LMOVE 的阻塞(blocking)版本。原子地从列表 source 中移除一个元素,并将其插入到列表 destination 中。
- 前两个方向参数与 LMOVE 相同:分别指定从
source的哪一端移除,以及插入到destination的哪一端。 - 当
source非空时,BLMOVE 的执行效果与 LMOVE 完全相同,不会阻塞。 - 当
source为空时,客户端连接将被阻塞,直到另一个客户端向source列表插入新元素,或timeout超时。 timeout为阻塞的最大等待秒数,timeout = 0表示永久阻塞。- 在 MULTI / EXEC 事务中使用 BLMOVE 时,其行为与 LMOVE 相同(不会阻塞)。
- BLMOVE 用于替代已弃用的 BRPOPLPUSH。
BRPOPLPUSH 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 reply:
timeout超时且source仍为空,返回nil。
*版本兼容性
| 版本 | 说明 |
|---|---|
| >= 6.2.0 | 可用;替代已弃用的 BRPOPLPUSH |
| < 6.2.0 | 不支持 |
*时间复杂度
O(1)。
*模式:可靠队列
BLMOVE 可用于构建可靠的消息队列:消费者将消息从主队列原子地移动到待处理队列(processing queue),处理完成后再用 LREM 删除。即使客户端崩溃,消息也不会丢失。