List 与消息队列
约 599 字大约 2 分钟
布欧-Lewyon
2026-05-15
Redis List 是双向链表,支持头尾操作,适合消息队列、最新消息列表。
基础操作
# 左/右推入
LPUSH logs "error: timeout" # 左侧推入
RPUSH logs "info: started" # 右侧推入
RPUSH logs "warn: memory 80%"
# 左/右弹出
LPOP logs # "error: timeout"
RPOP logs # "warn: memory 80%"
# 获取范围(不弹出)
LRANGE logs 0 -1 # 全部
1) "info: started"
# 列表长度
LLEN logs # (integer) 1阻塞操作
# BLPOP/BRPOP:阻塞直到有数据或超时
# 终端 1(消费者)
BRPOP queue:messages 30 # 阻塞等待,最多 30 秒
# 终端 2(生产者)
LPUSH queue:messages "task1"
# 终端 1 结果
1) "queue:messages"
2) "task1"
# 多个队列,优先级
BRPOP queue:high queue:low 5固定长度列表
# LTRIM:保留指定范围,丢弃其他
RPUSH news "article1" "article2" "article3" "article4" "article5"
LTRIM news 0 2 # 只保留前 3 条
LRANGE news 0 -1
1) "article1"
2) "article2"
3) "article3"List 实现简单消息队列
# 生产者
LPUSH task:queue "email:user1"
LPUSH task:queue "email:user2"
LPUSH task:queue "report:generate"
# 消费者(轮询)
RPOP task:queue # "email:user1"
RPOP task:queue # "email:user2"
# 消费者(阻塞等待)
BRPOP task:queue 0 # 一直等待List 队列的局限
| 问题 | 说明 |
|---|---|
| 消息确认 | 弹出即消失,无 ACK 机制 |
| 重复消费 | 不支持消费者组 |
| 消息积压 | 内存不设上限会 OOM |
简单场景用 List,生产级消息队列用 Stream。
应用场景
# 最新消息列表(取前 10 条)
LPUSH user:100:messages "msg1"
LPUSH user:100:messages "msg2"
LTRIM user:100:messages 0 9 # 只保留前 10 条
# 简单的消息队列
# 生产者
LPUSH task:queue $task
# 消费者(循环)
while true; do BRPOP task:queue 0; done
# 数据分页(模拟)
RPUSH items "item1" "item2" "item3" "item4" "item5"
LRANGE items 0 1 # 第 1 页
LRANGE items 2 3 # 第 2 页数据结构
# 头部插入 O(1),尾部插入 O(1)
# 索引访问 O(N)
# 小列表(< 8KB)用压缩链表(ziplist),节省内存小结
| 命令 | 用途 | O |
|---|---|---|
LPUSH/RPUSH | 推入 | 1 |
LPOP/RPOP | 弹出 | 1 |
BLPOP/BRPOP | 阻塞弹出 | 1 |
LRANGE | 范围获取 | N |
LTRIM | 截断 | N |
LLEN | 长度 | 1 |
- List 是双向链表,头尾操作 O(1),索引存取 O(N)。
LPUSH + BRPOP是最简单的消息队列模式。LTRIM限制长度,适合"最新 N 条"场景。- 生产级消息队列推荐用 Stream(支持消费者组、ACK)。
上一节:String 与计数器 下一节:Set 与标签系统
