多键弹出首选非空
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 设得过大而消费端处理不过来,元素会堆积在客户端内存里,队列原本的缓冲作用被削弱。
轮询的优先级完全由键的传入顺序决定,命令不会按数据量或优先级自己判断,键顺序必须在代码里写死并保持稳定。