*Redis BLPOP 命令

阻塞式移除并返回 List 头部元素。当 List 为空时阻塞等待,直到有元素或超时。


*语法

BLPOP key [key ...] timeout

*参数说明

参数 类型 必填 说明
key String 一个或多个 List 键名,按顺序检查
timeout Integer/Float 阻塞超时时间(秒),0 表示永久阻塞

*返回值

条件 返回值
成功弹出 数组 [key, element]
超时 (nil)

*时间复杂度

O(1)(List 非空时),阻塞期间不消耗 CPU。


*示例

# 客户端 A:阻塞等待
> BLPOP queue 30
# 阻塞中...

# 客户端 B:生产消息
> RPUSH queue "new_job"
(integer) 1

# 客户端 A 收到:
1) "queue"
2) "new_job"

# 多个 key,按顺序检查
> BLPOP queue1 queue2 queue3 10
# 返回第一个非空 List 的头部元素

# 超时
> BLPOP empty_queue 1
(nil)

*常见错误

  1. timeout 参数遗忘:BLPOP 最后一个参数必须是 timeout,容易遗漏。
  2. 永久阻塞:timeout=0 时永久阻塞,需确保有消费者或连接超时机制。

*最佳实践

  1. 消息队列消费:BLPOP + RPUSH 是实现 Redis 消息队列的标准模式,比轮询高效 1000 倍。
  2. 超时设置:建议 timeout 5-30 秒,超时后重新 BLPOP,避免连接长期闲置被防火墙切断。
  3. 多个消费者:多个客户端 BLPOP 同一 List,天然负载均衡(每个元素只被一个消费者获取)。

*FAQ

Q: BLPOP 和 LPOP 有什么区别? A: LPOP 立即返回,List 为空返回 nil;BLPOP 阻塞等待直到有元素或超时,避免空轮询。

Q: BLPOP 是原子操作吗? A: 是。元素只会被一个客户端获取,不会重复消费。

Q: BLPOP 多个 key 时的顺序? A: 按传入 key 的顺序依次检查,返回第一个非空 List 的元素。

Q: timeout=0 安全吗? A: 会永久阻塞直到有元素。需确保网络连接稳定,或有心跳机制防止被中间件断开。