一、List 底层本质
Redis List 底层是双向链表 ,可以当数组 / 队列 / 栈用:
- 元素有序、可重复、支持头尾快速进出
- 头尾增删:O(1 极快
- 中间随机查:慢,不适合随机访问
可以模拟数组结构存有序数据,也能做队列、时间线。
二、场景 1:当作数组结构存储
特点
可以按下标存取、分页查询,像数组一样用:
lrange key start end范围取值,分页lindex key index按下标取单个元素
适用
- 最新评论列表
- 操作日志记录
- 流水记录、有序历史数据
用法
redis
# 右边依次加入,按顺序排列
rpush comment:1001 "评论1" "评论2" "评论3"
# 分页查所有
lrange comment:1001 0 -1
相当于一个可变长有序数组。
三、场景 2:生产者消费者模型 消息队列 轮询排队
原理
List 天然就是普通队列:
- 生产者:右边入队
rpush - 消费者:左边出队
lpop/brpop
两种方式
- 普通轮询 业务代码不停循环
lpop抢消息,轮询队列。 - 阻塞队列(推荐)
blpop / brpop没有消息就阻塞等待,不空转浪费 CPU。
流程
- 生产者发任务:
redis
rpush task:queue "订单任务1"
- 消费者阻塞等待:
redis
blpop task:queue 0
完美实现生产者消费者、异步任务排队、削峰。
四、场景 3:分频道消息队列、多频道解耦
思路
不同业务、不同频道单独一个 List:
- 频道 1:
queue:chat:room1 - 频道 2:
queue:chat:room2 - 通知频道:
queue:notify
每个频道各自队列互不干扰:
- 发消息只推到对应频道 List
- 消费者只监听自己负责的频道实现多业务解耦、频道隔离、互不阻塞。
适合:聊天室多房间、多类型消息通知、不同业务异步任务隔离。
五、场景 4:微博 / 朋友圈 Timeline 流水线(时间线流)
业务逻辑
发朋友圈 / 发微博:
- 用户发动态 → lpush 推入自己和粉丝的 List 时间线
- 刷朋友圈时直接
lrange分页拉取列表
为什么用 List?
lpush往头部插,天然新的在最前面,时间倒序- 直接分页查询,不用排序、不用计算
- 就是一条时间流水线 Pipeline,按发布时间天然排好
适用:
- 微博关注流
- 朋友圈动态流
- 关注博主最新作品流
六、一句话总总结
Redis List 基于双向链表:
- 可当作有序数组存评论、日志、流水记录;
- 用
rpush/lpop实现生产者消费者消息队列,支持轮询和阻塞拉取; - 按不同业务拆分多频道独立 List,实现消息解耦隔离;
- 利用头尾插入特性,实现微博朋友圈 Timeline 时间流水线,天然按时间排序分页。