*Redis BZPOPMIN 命令
BZPOPMIN 从多个有序集合中阻塞弹出分数最小的成员。
*语法
BZPOPMIN 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
> BZPOPMIN myzset 10
1) "myzset"
2) "a"
3) "1"
*从多个有序集合中弹出
> ZADD z1 10 "x"
(integer) 1
> BZPOPMIN z1 z2 5
1) "z1"
2) "x"
3) "10"
*超时未弹出
> BZPOPMIN 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 类型 |
*最佳实践
- 用于延时队列消费(时间戳作为分数,MIN 先消费到期任务)
- 配合多个 key 可实现多队列优先级调度
- 生产环境建议设置合理 timeout,避免永久阻塞
- Redis 7.0+ 建议使用 BZMPOP 替代,支持 COUNT 多元素弹出
*FAQ
Q1: BZPOPMIN 和 ZPOPMIN 有什么区别? A: BZPOPMIN 是阻塞版本,没有可弹出成员时会等待;ZPOPMIN 非阻塞,立即返回。
Q2: 为什么适合延时队列? A: 将任务到期时间作为 score,BZPOPMIN 总是弹出最早到期的任务,天然支持时间排序。
Q3: timeout 为 0 是什么意思? A: 表示永久阻塞,直到有可弹出的成员。需谨慎使用。