redis中list应用场景

一、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

两种方式

  1. 普通轮询 业务代码不停循环 lpop 抢消息,轮询队列。
  2. 阻塞队列(推荐) 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 流水线(时间线流)

业务逻辑

发朋友圈 / 发微博:

  1. 用户发动态 → lpush 推入自己和粉丝的 List 时间线
  2. 刷朋友圈时直接 lrange 分页拉取列表

为什么用 List?

  • lpush 往头部插,天然新的在最前面,时间倒序
  • 直接分页查询,不用排序、不用计算
  • 就是一条时间流水线 Pipeline,按发布时间天然排好

适用:

  • 微博关注流
  • 朋友圈动态流
  • 关注博主最新作品流

六、一句话总总结

Redis List 基于双向链表:

  1. 当作有序数组存评论、日志、流水记录;
  2. rpush/lpop 实现生产者消费者消息队列,支持轮询和阻塞拉取;
  3. 按不同业务拆分多频道独立 List,实现消息解耦隔离;
  4. 利用头尾插入特性,实现微博朋友圈 Timeline 时间流水线,天然按时间排序分页。
相关推荐
wu85877345717 分钟前
向量数据库不是银弹:从枚举漏检到 ReACT 多轮召回的实践路径
前端·数据库·react.js
hsg771 小时前
简述:Jensen Huang‘s Footsteps网站全内容分析
前端·javascript·数据库
yuezhilangniao1 小时前
MySQL 8.0.32 二进制安装脚本 和初始化 操作系统版本rocky86
数据库·mysql·adb
Trouvaille ~1 小时前
【Redis篇】Redis 主从复制:数据同步的原理与实现
数据库·redis·缓存·中间件·高可用·主从复制·后端开发
真实的菜1 小时前
Redis 从入门到精通(五):哨兵模式(Sentinel)—— 自动故障转移的完整原理与实战
数据库·redis·sentinel
是小王同学啊~2 小时前
Redis 面试通关笔记:高频八股 + 生产实战 + 追问链路(下)
redis·面试题
唔662 小时前
(二)补充完整的数据库、中间件、MQTT、JAR后台和Web前端的部署脚本,全部一键自动化。
数据库·中间件·jar
六月雨滴2 小时前
Oracle 内存优化
数据库·oracle
学代码的真由酱2 小时前
MySQL数据库进阶-数据库设计实践-Java
数据库·mysql·数据库设计
遇事不決洛必達2 小时前
【数据库系列】本地映射云服务器Mysql的方法
服务器·数据库·mysql·定时任务