*Redis BZPOPMAX 命令

BZPOPMAX 从多个有序集合中阻塞弹出分数最大的成员。


*语法

BZPOPMAX key [key ...] timeout

*参数说明

参数 类型 必填 说明
key String 有序集合键名,支持多个
timeout Integer 阻塞等待的最大秒数,0 表示无限等待

*返回值

  • Array[key, member, score] — 键名、弹出的成员、分数
  • Nil:超时未弹出任何成员时返回 (nil)

*时间复杂度

O(log(N)),N 为有序集合成员数。


*示例

*基本阻塞弹出

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

*从多个有序集合中弹出

> ZADD z1 100 "x"
(integer) 1
> BZPOPMAX z1 z2 5
1) "z1"
2) "x"
3) "100"

*超时未弹出

> BZPOPMAX emptyzset 2
(nil)

*常见错误

错误 原因 解决
ERR wrong number of arguments 未提供 key 或 timeout 至少提供一个 key 和 timeout
ERR timeout is not a number or out of range timeout 不是整数或超出范围 使用有效整数作为 timeout
WRONGTYPE key 不是有序集合类型 确认 key 为 Sorted Set 类型

*最佳实践

  • 用于实时排行榜消费最高分变更
  • 配合多个 key 可实现优先级队列(先检查高优先级队列)
  • 延时队列场景建议使用 BZPOPMIN(按时间顺序消费)
  • Redis 7.0+ 建议使用 BZMPOP 替代,支持 COUNT 多元素弹出

*FAQ

Q1: BZPOPMAX 和 ZPOPMAX 有什么区别? A: BZPOPMAX 是阻塞版本,没有可弹出成员时会等待;ZPOPMAX 非阻塞,立即返回。

Q2: 弹出多个 key 时的顺序是什么? A: 从左到右依次检查,返回第一个非空有序集合的最大分成员。

Q3: timeout 为 0 是什么意思? A: 表示永久阻塞,直到有可弹出的成员。需谨慎使用。