*Redis ZMPOP 命令
ZMPOP 从指定的一个或多个有序集合中弹出并移除分数最高或最低的成员。
*语法
ZMPOP numkeys key [key ...] MIN | MAX [COUNT count]
*参数说明
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| numkeys | Integer | 是 | 要检查的集合数量 |
| key | String | 是 | 有序集合键名,至少一个 |
| MIN / MAX | Flag | 是 | MIN 弹出最低分成员,MAX 弹出最高分成员 |
| COUNT count | Integer | 否 | 弹出的成员数量,默认 1 |
*返回值
- Array:
[key, [[member, score], ...]]— 第一个非空集合的键名和弹出的成员列表 - Nil:所有集合都为空或不存在
*时间复杂度
O(K) + O(M·log(N)),其中:
- K 为提供的 key 数量
- N 为第一个非空集合的基数
- M 为弹出的元素数量
*示例
*从单个集合弹出最低分
> ZADD myzset 1 "one" 2 "two" 3 "three"
(integer) 3
> ZMPOP 1 myzset MIN
1) "myzset"
2) 1) 1) "one"
2) "1"
*从多个集合中检查并弹出
> ZADD z1 10 "a" 20 "b"
(integer) 2
> ZADD z2 5 "x"
(integer) 1
> ZMPOP 2 z1 z2 MAX COUNT 2
1) "z1"
2) 1) 1) "b"
2) "20"
2) 1) "a"
2) "10"
*所有集合为空
> ZMPOP 1 emptyzset MIN
(nil)
*常见错误
| 错误 | 原因 | 解决 |
|---|---|---|
| ERR wrong number of arguments | 缺少 MIN/MAX 或 numkeys | 检查必传参数 |
| ERR value is not an integer | numkeys 或 COUNT 非整数 | 使用整数 |
| WRONGTYPE | key 不是有序集合 | 检查 key 类型 |
*最佳实践
- 场景:优先级队列、延时队列消费端、任务调度(高分优先或低分优先)
- 多个 key 按从左到右顺序检查,返回第一个非空集合的结果
- 适合替代 BZPOPMIN/BZPOPMAX 的非阻塞场景
- COUNT 可批量弹出减少网络往返
- 大集合频繁弹出注意写入性能,评估是否使用分片
*FAQ
Q1: ZMPOP 和 BZPOPMIN 有什么区别? A: ZMPOP 是非阻塞的,立即返回;BZPOPMIN 会阻塞等待直到有数据。
Q2: 弹出成员后集合为空会怎样? A: 集合会被保留(空集合),不会自动删除。可用 ZCARD 检查是否为空后手动 DEL。
Q3: 多个 key 时如何确定从哪个 key 弹出? A: 按参数顺序从左到右检查,第一个非空集合即被选中。