在 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(可靠队列)。