BLPOP / BRPOP 是什么
它们是弹出命令的阻塞版本:列表为空时命令会挂起等待,元素一到达立即返回,等到超时(或 timeout 传 0 即永久阻塞)才结束。多个消费者同时阻塞弹出同一个队列,就自然形成竞争消费,每条元素只会被其中一个消费者取走;返回结构是包含键名与值的两元素数组,而不是单个值。
基本信息
| 语法 | BLPOP key [key ...] timeout |
|---|---|
| 返回值 | 两元素数组:键名与值;超时返回 nil |
| 超时单位 | 秒;0 表示无限等待 |
| 多键语义 | 按参数顺序依次检查,命中即返回 |
| 相关命令 | LPOP / RPOP / LMOVE / BLMOVE / LLEN |
典型使用场景
- 队列消费:消费者阻塞等待,避免轮询空转浪费算力
- 优先级队列:BLPOP 高优先队列 低优先队列 5,先消费高优先的
- 多消费者横向扩展:多个 worker 共享同一队列,天然负载均衡
- 超时控制:给阻塞加超时,避免消费者连接永久占用
- 配合 RPUSH 形成 FIFO:右进左出,顺序确定
- 临时任务通道:一次性任务用阻塞等待实现近实时触发
示例
示例
RPUSH q job1
BLPOP q 5 # 立即返回:1) q 2) job1
BLPOP q 5 # 队列为空:等待 5 秒后返回 nil
BLPOP q 0 # 永久阻塞直到有元素(断连需重连重试)
BLPOP high mid low 10 # 按顺序检查多个队列,实现优先级消费
LLEN q # 查看剩余积压
BLMOVE q processing LEFT RIGHT 5 # 阻塞转移:取元素并同时写入处理中列表阻塞与非阻塞对照
| 命令 | 空队列行为 | 典型用途 |
|---|---|---|
| LPOP / RPOP | 立即返回 nil | 批量消费或轮询兜底 |
| BLPOP / BRPOP | 挂起等待,超时或取到才返回 | 实时队列消费、优先级消费 |
| LMOVE | 立即返回,不做等待 | 转移元素且不丢失 |
| BLMOVE | 挂起等待,取到后转移到目标键 | 可靠队列消费的标准姿势 |
阻塞连接要独立管理:长时间阻塞会占住客户端连接;设置合理 timeout 并在断开时重连,避免消费者挂死。
阻塞命令占住的是连接而不是实例资源,但连接池里如果混入阻塞连接,池子很容易被占满;生产上通常给阻塞消费者分配独立连接或独立池。