*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], ...],包含成员名和分数。