首页/数据/Redis 进阶速查/LMPOP:多键弹出首选非空
数据结构与选型42 条

LMPOP:多键弹出首选非空

LMPOP 从首个非空的列表弹出元素(可指定方向与数量),把「遍历多个候选键」收敛为单命令,减少多轮试探。

Redis 进阶速查数据更新于 2026-10-13

多键弹出首选非空

LMPOP 从第一个非空的列表弹出元素,可以指定方向与数量,把依次遍历多个候选键收敛为单命令。适合多优先级队列的轮询消费:按顺序传入高、中、低优先级队列,命令自己找第一个有数据的那个。Redis 7.0 起提供。

基本信息

语法LMPOP numkeys key [key ...] LEFT|RIGHT [COUNT n]
版本Redis 7.0 及以上
场景多队列轮询消费
对应单键命令LPOP / RPOP
阻塞版本BLMPOP

典型使用场景

  • 多优先级队列:按高、中、低顺序取任务
  • 分片队列:多个队列键轮询消费,避免空轮询
  • 替代逐个 LPOP 再判断 nil 的循环,减少往返次数
  • 消费者需要在一次调用里拿到一批元素
  • 与阻塞版本配合,空闲时等待而不是空转

消费侧约定

键顺序固定写死,不建议动态拼接
批量大小与消费者处理能力对齐
返回值判空按 nil 判断,不按空数组
多消费者优先级理解要统一

调用示例

调用示例
redis-cli RPUSH queue:high t1              # 准备高优先级队列
redis-cli RPUSH queue:low t9 t10           # 准备低优先级队列
redis-cli LMPOP 3 queue:high queue:mid queue:low LEFT COUNT 10
# 上一条从第一个非空队列弹出至多 10 个元素,返回队列名与元素列表
redis-cli LLEN queue:high                  # 验证剩余长度
redis-cli BLMPOP 0 3 queue:high queue:mid queue:low LEFT COUNT 10  # 阻塞版
redis-cli TYPE queue:high                  # 队列被弹空后键会消失,注意判断方式

返回项读法

返回项含义注意点
第一个返回数据所在的队列键名告诉你这次数据来自哪个队列
第二个返回元素列表顺序与 LEFT 或 RIGHT 方向一致
无可用数据返回 nil判空要按 nil 写,不是空数组
COUNT n单次弹出上限实际弹出数量可能少于 n
键被弹空空列表键会被自动删除后续 EXISTS 判断会返回 0
LEFT 从头部取、RIGHT 从尾部取。与 LPUSH 配合时应取尾部(RIGHT)才能得到先进先出的顺序,方向搞反就把队列用成了栈。
COUNT 设得过大而消费端处理不过来,元素会堆积在客户端内存里,队列原本的缓冲作用被削弱。
轮询的优先级完全由键的传入顺序决定,命令不会按数据量或优先级自己判断,键顺序必须在代码里写死并保持稳定。

易错点

  • 轮询语义依赖传入顺序:键顺序与优先级设计不一致,业务取错队列
  • COUNT 与消费能力不匹配:拉取量超出处理速度,数据堆在客户端
  • 把返回的 nil 当空数组:判空逻辑写错,消费循环空转
  • 依赖 EXISTS 判断队列是否存在:队列被弹空后键会自动消失,判断会误报

数据来源与参考

  • Redis 官方文档:LMPOP 说明
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌