*Redis LMPOP 命令
LMPOP 从指定数量的列表中弹出元素,从左端或右端弹出,返回首个非空列表的键名和弹出的元素。
*语法
LMPOP numkeys key [key ...] LEFT|RIGHT [COUNT count]
*参数说明
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| numkeys | Integer | 是 | 要检查的列表键数量 |
| key | String | 是 | 列表键名,至少提供一个,数量须与 numkeys 一致 |
| LEFT \ | RIGHT | Enum | 是 |
| COUNT | Integer | 否 | 弹出的元素数量,默认 1 |
*返回值
- Array:首个非空列表的键名和弹出元素的数组,如
["mylist", ["a", "b"]] - Nil:所有指定的列表键都不存在或为空
*时间复杂度
O(N),N 为弹出的元素数量。检查列表是否为空为 O(1) 每列表。
*示例
*基本用法(从左端弹出)
> LPUSH mylist "a" "b" "c"
(integer) 3
> LMPOP 1 mylist LEFT
1) "mylist"
2) 1) "c"
*从多个列表中弹出
> LPUSH list1 "x"
(integer) 1
> LPUSH list2 "y" "z"
(integer) 2
> LMPOP 2 list1 list2 RIGHT
1) "list2"
2) 1) "x"
*弹出多个元素
> RPUSH queue "a" "b" "c" "d"
(integer) 4
> LMPOP 1 queue LEFT COUNT 2
1) "queue"
2) 1) "a"
2) "b"
*常见错误
| 错误 | 原因 | 解决 |
|---|---|---|
| ERR wrong number of arguments | 缺少 numkeys 或 key 参数 | 检查参数数量 |
| ERR value is not an integer | numkeys 或 COUNT 不是整数 | 传入整数 |
| ERR syntax error | LEFT/RIGHT 方向未指定或位置错误 | 确保在 key 列表后指定方向 |
| WRONGTYPE | key 存在但类型不是 List | 确认键类型为 List |
*最佳实践
- 适合实现多队列优先级消费:优先检查高优先级队列,为空则降级到下一个
- 替代 BLPOP/BRPOP 的非阻塞版本,当不需要阻塞等待时使用
- 批量弹出(COUNT > 1)减少网络往返,但单次不宜过大(建议 ≤ 100)
- 与 LPUSH/RPUSH 配合实现生产者-消费者模式
*FAQ
Q1: LMPOP 和 LPOP/RPOP 有什么区别? A: LMPOP 支持从多个列表中按顺序检查并弹出,LPOP/RPOP 只能操作单个列表。LMPOP 也支持 COUNT 参数。
Q2: LMPOP 会阻塞等待吗? A: 不会,LMPOP 是非阻塞命令。所有列表为空时立即返回 nil。需要阻塞等待请使用 BLMPOP。
Q3: 多个列表为空时返回什么? A: 返回 nil(空的多 bulk 回复)。
Q4: COUNT 超过列表长度会怎样? A: 弹出列表中所有可用元素,返回实际弹出的数量,不会报错。
Q5: 哪些 Redis 版本支持 LMPOP? A: Redis 7.0+ 引入。