*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: 按参数顺序从左到右检查,第一个非空集合即被选中。