LMPOP 与 ZMPOP 是什么
7.0 新增的多键弹出命令:LMPOP 从多个列表里挑第一个非空的键弹出元素,ZMPOP 对有序集合做同样的事(按最小或最大分数端取)。相比 BRPOP 每次只能指定一个键、且一次只弹一个元素,LMPOP/ZMPOP 支持一次传多个键并可指定 COUNT 批量弹出,还有阻塞版本 BLMPOP / BZMPOP。
基本信息
| 语法 | LMPOP numkeys key [key ...] LEFT|RIGHT [COUNT n] |
|---|---|
| ZMPOP | ZMPOP 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 或负数报错 |
阻塞类命令会占用连接:使用专属连接或足够大的连接池,否则池子会被阻塞中的命令占满,其他请求拿不到连接。
多键弹出的顺序即优先级:命令按传入顺序扫描,遇到第一个非空键就返回,因此把高优先级队列写在前面即可实现简单优先级调度。