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