*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+ 引入。