首页/数据/数据库速查/多键弹出:LMPOP / ZMPOP(7.0)
Redis 命令96 条

多键弹出:LMPOP / ZMPOP(7.0)

从多个列表/有序集合里挑第一个非空键弹出元素:LMPOP/ZMPOP 一次调用支持多键与 COUNT,BLMPOP/BZMPOP 可阻塞等待,比 BRPOP 更灵活。

数据库速查数据更新于 2026-10-13

LMPOP 与 ZMPOP 是什么

7.0 新增的多键弹出命令:LMPOP 从多个列表里挑第一个非空的键弹出元素,ZMPOP 对有序集合做同样的事(按最小或最大分数端取)。相比 BRPOP 每次只能指定一个键、且一次只弹一个元素,LMPOP/ZMPOP 支持一次传多个键并可指定 COUNT 批量弹出,还有阻塞版本 BLMPOP / BZMPOP。

基本信息

语法LMPOP numkeys key [key ...] LEFT|RIGHT [COUNT n]
ZMPOPZMPOP numkeys key [key ...] MIN|MAX [COUNT n]
返回结构数组,第一项是键名,第二项是元素列表;全部为空返回 nil
阻塞版BLMPOP / BZMPOP,首位参数是超时秒数(0 表示永久阻塞)
版本7.0 及以上;低版本客户端调用会报未知命令

典型使用场景

  • 多队列消费:消费者按优先级顺序扫描多个队列,取到第一个有数据的就返回
  • 批量取出:一次弹出多个任务,减少网络往返
  • 优先队列:ZSet 按分数取最小或最大端的任务,实现简单优先级调度
  • 阻塞消费:用 BLMPOP 挂在多个队列上等待,替代多个 BRPOP 轮询
  • 跨键均衡:多个分片队列中只要有一个有数据就能取到,降低空转概率

用法示例

用法示例
RPUSH queue:a 1 2
RPUSH queue:b 3
# 从左端弹出,queue:a 非空所以从它取 2 个
LMPOP 2 queue:a queue:b LEFT COUNT 2
# ZSet 版本:取分数最小的一端
ZADD rank 1 a 2 b
ZMPOP 1 rank MIN
# 阻塞版本:最多等 5 秒(0 表示永久阻塞)
BLMPOP 5 2 queue:a queue:b LEFT COUNT 1
# 检查队列剩余长度
LLEN queue:a
LLEN queue:b

返回结构读法

字段含义注意事项
第一项被选中的键名多键场景下据此判断数据来自哪个队列
第二项弹出的元素列表顺序与 LEFT/RIGHT 或 MIN/MAX 对应
nil所有键都为空脚本必须处理空返回,避免取空值
COUNT一次弹出个数必须大于等于 1,传 0 或负数报错
阻塞类命令会占用连接:使用专属连接或足够大的连接池,否则池子会被阻塞中的命令占满,其他请求拿不到连接。
多键弹出的顺序即优先级:命令按传入顺序扫描,遇到第一个非空键就返回,因此把高优先级队列写在前面即可实现简单优先级调度。

易错点

  • 在 7.0 之前的实例上使用:直接报未知命令,升级服务端或降级到 BRPOP 组合写法
  • COUNT 传 0 或负数:参数校验直接报错,取值必须大于等于 1
  • 塞进共享连接池:阻塞命令会占住连接不放,池小时会把其他业务请求一起堵死
  • 忽略返回 nil 的情况:全部键为空时返回 nil,脚本未做判断会写入空值导致后续逻辑异常
  • 以为耗时与 COUNT 成正比:单次弹出多个元素确实省往返,但元素数量过大时单条命令的执行时间也随之增加,需要控制批量大小

数据来源与参考

  • Redis 官方文档: LMPOP
  • Redis 官方文档: ZMPOP

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌