*Redis BZMPOP 命令

BZMPOP 从多个有序集合中弹出一个或多个成员,支持阻塞等待。


*语法

BZMPOP timeout numkeys key [key ...] MIN | MAX [COUNT count]

*参数说明

参数 类型 必填 说明
timeout Integer 阻塞等待的最大秒数,0 表示无限等待
numkeys Integer 要检查的有序集合键的数量
key String 有序集合键名,至少一个
MIN / MAX Flag 弹出分数最小或最大的成员
COUNT Integer 弹出成员的数量,默认 1

*返回值

  • Array:包含键名和弹出成员数组的嵌套数组,例如 ["myzset", [["member1", "1"], ["member2", "2"]]]
  • Nil:超时未弹出任何成员时返回 (nil)

*时间复杂度

O(N·log(M)),N 为弹出的成员数量,M 为有序集合成员数。


*示例

*基本阻塞弹出

> ZADD myzset 1 "a" 2 "b" 3 "c"
(integer) 3
> BZMPOP 10 1 myzset MIN
1) "myzset"
2) 1) 1) "a"
      2) "1"

*从多个有序集合中弹出

> ZADD z1 10 "x" 20 "y"
(integer) 2
> BZMPOP 5 2 z1 z2 MAX COUNT 2
1) "z1"
2) 1) 1) "y"
      2) "20"
   2) 1) "x"
      2) "10"

*超时未弹出

> BZMPOP 2 1 emptyzset MIN
(nil)

*常见错误

错误 原因 解决
ERR wrong number of arguments 参数数量不足或 numkeys 与实际 key 数量不匹配 检查 numkeys 和 key 列表是否一致
ERR timeout is not a number or out of range timeout 不是整数或超出范围 使用有效整数作为 timeout
ERR value is not an integer or out of range COUNT 不是整数 确保 COUNT 为整数
WRONGTYPE key 不是有序集合类型 确认 key 为 Sorted Set 类型

*最佳实践

  • 用于延时队列或优先级队列的消费者端阻塞等待
  • 优先使用 BZMPOP 替代 BZPOPMIN/BZPOPMAX,支持多元素弹出和 COUNT
  • 延时队列场景中,MIN 模式可按时间顺序消费
  • 排行榜实时处理场景中,MAX 模式可获取最高分变更

*FAQ

Q1: BZMPOP 和 BZPOPMIN/BZPOPMAX 有什么区别? A: BZMPOP 支持多元素弹出(COUNT),且能选择 MIN 或 MAX,是 Redis 7.0+ 推荐的新命令。

Q2: timeout 为 0 是什么意思? A: 表示永久阻塞,直到有可弹出的成员。需谨慎使用,防止客户端无限等待。

Q3: 弹出成员的分数会一起返回吗? A: 是的,返回格式为 [[member, score], ...],包含成员名和分数。