*Redis BLMPOP 命令

BLMPOP 从多个列表中弹出一个或多个元素,支持阻塞等待。


*语法

BLMPOP timeout numkeys key [key ...] LEFT | RIGHT [COUNT count]

*参数说明

参数 类型 必填 说明
timeout Integer 阻塞等待的最大秒数,0 表示无限等待
numkeys Integer 要检查的列表键的数量
key String 列表键名,至少一个
LEFT / RIGHT Flag 从左侧或右侧弹出
COUNT Integer 弹出元素的数量,默认 1

*返回值

  • Array:包含键名和弹出元素数组的嵌套数组,例如 ["mylist", ["a", "b"]]
  • Nil:超时未弹出任何元素时返回 (nil)

*时间复杂度

O(N),N 为弹出的元素数量。


*示例

*基本阻塞弹出

> LPUSH mylist "a" "b" "c"
(integer) 3
> BLMPOP 10 1 mylist LEFT
1) "mylist"
2) 1) "c"

*从多个列表中弹出

> LPUSH list1 "x"
(integer) 1
> BLMPOP 5 2 list1 list2 LEFT COUNT 2
1) "list1"
2) 1) "x"

*超时未弹出

> BLMPOP 2 1 emptylist RIGHT
(nil)

*常见错误

错误 原因 解决
ERR wrong number of arguments 参数数量不足或 numkeys 与实际 key 数量不匹配 检查 numkeys 和 key 列表是否一致
ERR timeout is not a number or out of range timeout 不是整数或超出范围 使用有效整数作为 timeout
ERR value is not an integer or out of range COUNT 不是整数 确保 COUNT 为整数
WRONGTYPE key 不是列表类型 确认 key 为 List 类型

*最佳实践

  • 用于消息队列消费者端阻塞等待消息
  • 优先使用 BLMPOP 替代 BLPOP/BRPOP,支持多元素弹出和 COUNT
  • timeout 设为 0 时需确保有消费者持续监听,避免永久阻塞
  • 配合多 key 参数可实现优先级队列(先检查高优先级列表)

*FAQ

Q1: BLMPOP 和 BLPOP/BRPOP 有什么区别? A: BLMPOP 支持多元素弹出(COUNT),且能指定从 LEFT 或 RIGHT 弹出,是 Redis 7.0+ 推荐的新命令。

Q2: timeout 为 0 是什么意思? A: 表示永久阻塞,直到有元素可弹出。需谨慎使用,防止客户端无限等待。

Q3: 一次可以弹出多少个元素? A: 通过 COUNT 指定,默认 1。弹出数量受列表实际长度限制。