文章目录
-
- [一、Redis List 分页的核心价值](#一、Redis List 分页的核心价值)
- [二、核心 API 与分页实现逻辑](#二、核心 API 与分页实现逻辑)
-
- [1. 核心分页命令:LRANGE(只读,不修改原数据)](#1. 核心分页命令:LRANGE(只读,不修改原数据))
- [2. 分页实现公式(通用)](#2. 分页实现公式(通用))
- [3. 完整实战示例](#3. 完整实战示例)
- [三、List 分页相关辅助 API](#三、List 分页相关辅助 API)
-
- [实战:结合 LLEN 计算总页数](#实战:结合 LLEN 计算总页数)
- [四、Redis List 分页的优势与局限](#四、Redis List 分页的优势与局限)
-
- [1. 优势](#1. 优势)
- [2. 局限](#2. 局限)
- 五、最佳实践
-
- [1. 适用场景](#1. 适用场景)
- [2. 避坑点](#2. 避坑点)
- [3. 替代方案(补充)](#3. 替代方案(补充))
- 六、小结

一、Redis List 分页的核心价值
Redis List 是基于双向链表 实现的有序集合(按插入顺序排序),借助 lrange 命令可快速实现分页查询,相比传统数据库(如 MySQL)的 limit offset 分页,Redis List 分页在热点数据、小范围分页场景下性能更稳定,且纯内存操作响应耗时极低,常被用于缓存"最新文章列表、评论列表、消息列表"等按时间排序的分页场景。
二、核心 API 与分页实现逻辑
1. 核心分页命令:LRANGE(只读,不修改原数据)
(1)命令格式
redis
LRANGE key start stop
key:List 类型的键名;start:起始索引(从 0 开始,负数表示倒数,如-1代表最后一个元素);stop:结束索引(包含该索引,-1可表示查询所有元素)。
(2)核心特性
LRANGE 是只读操作 ,仅返回指定范围的元素,不会移除 List 中的元素(区别于 LPOP/RPOP 等删除类命令)。
2. 分页实现公式(通用)
假设分页参数为:
pageNum:当前页码(从 1 开始);pageSize:每页展示条数;
则分页的索引计算规则:
start = (pageNum - 1) * pageSize
stop = pageNum * pageSize - 1
3. 完整实战示例
(1)初始化测试数据
向 article:list(文章 ID 列表)插入 10 条数据(按发布时间从新到旧排序):
redis
# 从右侧插入(保证新数据在列表头部/尾部,根据业务调整)
RPUSH article:list 101 102 103 104 105 106 107 108 109 110
(2)分页查询操作
-
第 1 页(每页 5 条):
redisLRANGE article:list 0 4 # 返回 [101, 102, 103, 104, 105]
-
第 2 页(每页 5 条):
redisLRANGE article:list 5 9 # 返回 [106, 107, 108, 109, 110]
-
查询所有数据(兜底场景):
redisLRANGE article:list 0 -1 # 返回全部 10 条数据
三、List 分页相关辅助 API
| 命令 | 作用 | 示例 |
|---|---|---|
RPUSH/LPUSH |
向 List 尾部/头部插入数据(初始化分页数据) | RPUSH article:list 111 112 |
LLEN |
获取 List 总长度(计算总页数) | LLEN article:list → 返回 10 |
LPOP/RPOP |
移除并返回头部/尾部元素(清理过期数据) | LPOP article:list → 返回 101 |
LTRIM |
修剪 List,仅保留指定范围元素(分页后清理) | LTRIM article:list 0 99 |
实战:结合 LLEN 计算总页数
redis
# 1. 获取总条数
LLEN article:list → 10
# 2. 计算总页数(每页 5 条)
总页数 = CEIL(总条数 / pageSize) → CEIL(10/5) = 2
四、Redis List 分页的优势与局限
1. 优势
- 性能稳定:纯内存操作,小范围分页(前几页)耗时微秒级,远快于 MySQL 大 offset 分页;
- 实现简单 :仅需
LRANGE命令,无需复杂语法,开发成本低; - 有序性保障:List 按插入顺序排序,天然适配"最新优先"类分页场景(如消息、评论)。
2. 局限
- 索引访问性能 :List 底层是双向链表,
LRANGE按索引访问为 O(n) 复杂度,分页 offset 过大(如查询第 1000 页)时性能下降; - 排序能力弱:仅支持插入顺序(某端插入时候的顺序,取决于用法),无法按自定义字段(如时间、热度)排序;
- 数据量限制:不适用于超大规模 List(百万级以上),易导致内存占用过高。
五、最佳实践
1. 适用场景
- 热点分页:仅需查询前 N 页(如前 10 页)的场景(如首页文章列表);
- 有序列表:数据按插入顺序展示,无需自定义排序(如用户消息流)。
2. 避坑点
- 不要用
LRANGE做超大 offset 分页:offset 过大时,建议改用 Sorted Set(ZSET )+ 游标分页; - 区分"查询"与"删除":
LRANGE仅查询,如需"取数据并删除",可结合LRANGE + LTRIM; - 控制 List 长度:通过
LTRIM定期清理过期数据,避免 List 无限膨胀(如仅保留最近 1000 条)。
3. 替代方案(补充)
若需按自定义字段排序 / 超大分页 ,建议使用 Redis Sorted Set(ZSET ),通过 ZRANGE 实现分页,兼顾排序与高性能。
六、小结
Redis List + LRANGE 是实现"简单有序分页"的最优解,核心优势是实现简单、性能稳定,适合热点小范围分页场景;使用时需注意控制 List 长度、避免超大 offset 分页,若需更复杂的排序/分页需求,可切换至 ZSET 实现。