在 Redis 中实现队列通常使用 列表(List) 数据结构,结合以下命令实现先进先出(FIFO)的队列操作:
实现方案
1. 基本命令
- 生产者:向队列添加元素。- LPUSH key element:将元素插入列表头部(左侧)。
- RPUSH key element:将元素插入列表尾部(右侧)。
 
- 消费者:从队列取出元素。- BRPOP key timeout:阻塞地从列表尾部(右侧)弹出元素(阻塞版- RPOP)。
- BLPOP key timeout:阻塞地从列表头部(左侧)弹出元素(阻塞版- LPOP)。
 
2. 方向配对
- 方案一(推荐) - 生产者:LPUSH添加到头部。
- 消费者:BRPOP从尾部取出(FIFO 顺序)。
 - # 生产者
LPUSH myqueue "task1"
LPUSH myqueue "task2"  # 列表顺序: ["task2", "task1"]
# 消费者(阻塞直到元素存在)
BRPOP myqueue 0        # 返回 "task1"
 
- 方案二 - 生产者:RPUSH添加到尾部。
- 消费者:BLPOP从头部取出(FIFO 顺序)。
 - # 生产者
RPUSH myqueue "task1"
RPUSH myqueue "task2"  # 列表顺序: ["task1", "task2"]
# 消费者(阻塞直到元素存在)
BLPOP myqueue 0        # 返回 "task1"
 
代码示例(Python)
生产者
import redis
r = redis.Redis()
# 添加任务到队列头部
r.lpush("myqueue", "task1")
r.lpush("myqueue", "task2")
消费者
import redis
r = redis.Redis()
while True:
    # 阻塞从队列尾部取出任务(timeout=0 表示无限等待)
    task = r.brpop("myqueue", timeout=0)
    print(f"Processing task: {task[1]}")
注意事项
- 可靠性问题 - 使用 BRPOP/BLPOP弹出的元素会立即从队列删除。若消费者崩溃,任务可能丢失。
- 解决方案:需持久化或确认机制时,改用 Redis Streams(支持消息确认和消费者组)。
 
- 性能 - Redis 列表的 LPUSH/RPUSH和BRPOP/BLPOP均为 O(1) 时间复杂度,适合高并发场景。
 
- 多队列优先级 - BRPOP queue1 queue2 0可同时监听多个队列,优先处理第一个非空队列。
 
扩展:可靠消息队列(Redis Streams)
若需消息持久化、消费者组和确认机制,使用 Streams:
# 生产者发送消息
XADD mystream * field1 "value1"
# 消费者组读取
XGROUP CREATE mystream mygroup 0
XREADGROUP GROUP mygroup consumer1 BLOCK 0 STREAMS mystream >
以上是 Redis 实现队列的核心方法,根据场景选择列表(简单队列)或 Streams(可靠队列)。