首页/数据/数据库速查/BLPOP / BRPOP 阻塞弹出(队列消费)
Redis 命令96 条

BLPOP / BRPOP 阻塞弹出(队列消费)

阻塞版弹出:列表空时挂起等待,元素到达立刻返回;timeout=0 永久阻塞。多消费者共享一个队列即竞争消费。

数据库速查数据更新于 2026-10-13

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 并在断开时重连,避免消费者挂死。
阻塞命令占住的是连接而不是实例资源,但连接池里如果混入阻塞连接,池子很容易被占满;生产上通常给阻塞消费者分配独立连接或独立池。

易错点

  • 用 timeout 0 永久阻塞且不做断线重连,网络抖动后消费者再也不会消费
  • 连接池里混用阻塞连接,池被占满导致普通指令也拿不到连接
  • 元素弹出后处理失败直接丢弃,没有回到队列或落库补偿
  • 多个队列优先级顺序写错,低优先队列反而先被消费
  • 把 BLPOP 返回当成单个值使用,取值时解构错误(实际是键名加值两元素)

数据来源与参考

  • Redis 官方文档: BLPOP
  • Redis 官方文档: BRPOP

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌