*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。弹出数量受列表实际长度限制。