*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: 表示永久阻塞,直到有可弹出的成员。需谨慎使用。