RedisList基于双向链表,利用LRANGE命令可毫秒级实现范围查询,适合热点数据和小范围分页。分页公式为start=(pageNum-1)*pageSize,stop=pageNum*pageSize-1。优势是性能稳定、实现简单,但大offset时性能下降,且仅按插入顺序排序。需控制List长度,超大分页建议改用SortedSet。
要深入理解 Redis List 的分页能力,需先掌握其数据结构本质——双向链表。所有元素按插入顺序排列,天然形成有序队列。配合 lrange 命令,可在毫秒级完成一段范围的数据查询。对比传统 MySQL 的 limit offset 分页,Redis 在热点数据、小范围分页场景下优势明显:纯内存操作,响应时间稳定,不会因 offset 增大而出现明显抖动。这也是许多系统采用缓存 List 承载“最新文章列表”“评论流”“消息列表”等按时间排序分页需求的原因。
LRANGE key start stop
key:List 类型的键名;start:起始索引(从 0 开始,负数表示倒数,如 -1 代表最后一个元素);stop:结束索引(包含该索引,-1 可表示查询所有元素)。注意,LRANGE 是只读操作,仅返回指定范围的元素,不会像 LPOP/RPOP 那样删除数据。这一点对分页查询至关重要——翻页不会破坏原始数据。
长期稳定更新的攒劲资源: >>>点此立即查看<<<
假设分页参数为:
pageNum:当前页码(从 1 开始);pageSize:每页展示条数;索引计算规则如下:
start = (pageNum - 1) * pageSize stop = pageNum * pageSize - 1
例如,第 1 页每页 5 条,start=0,stop=4;第 2 页 start=5,stop=9。直接明了。
向 article:list 插入 10 条文章 ID,模拟按发布时间从新到旧排列(使用 RPUSH 从右侧插入,保证插入顺序即列表顺序):
RPUSH article:list 101 102 103 104 105 106 107 108 109 110
第 1 页(每页 5 条):
LRANGE article:list 0 4 # 返回 [101, 102, 103, 104, 105]

第 2 页(每页 5 条):
LRANGE article:list 5 9 # 返回 [106, 107, 108, 109, 110]

查询所有数据(兜底场景):
LRANGE article:list 0 -1 # 返回全部 10 条数据

除 LRANGE 外,还有几个命令在实际分页场景中经常搭配使用,下表可快速参考:
| 命令 | 作用 | 示例 |
|---|---|---|
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 计算总页数# 1. 获取总条数 LLEN article:list → 10 # 2. 计算总页数(每页 5 条) 总页数 = CEIL(总条数 / pageSize) → CEIL(10/5) = 2
有了总页数,前端即可显示分页器。
LRANGE 即可完成,无复杂语法,开发成本极低;LRANGE 按索引访问的时间复杂度为 O(n)。当分页 offset 较大时(如查第 1000 页),性能会明显下降;LRANGE 做超大 offset 分页:offset 一旦过大,性能会急剧下降。此类场景推荐使用 Sorted Set(ZSET) 配合 游标分页;LRANGE 仅用于查询,若需“取数据并删除”,可考虑 LRANGE + LTRIM 组合操作;LTRIM 定期清理过期数据,避免 List 无限膨胀。常见做法是只保留最近 1000 条。如果业务要求按自定义字段排序,或需要超大分页,则不必纠结 List,直接使用 Redis Sorted Set(ZSET),通过 ZRANGE 实现分页,排序和性能均能兼顾。
Redis List + LRANGE 组合堪称“简单有序分页”场景的最优解。其核心优势在于实现简单、性能稳定,特别适合热点小范围分页。使用时需把握好两个边界:一是控制 List 长度,二是避免超大 offset。一旦需求跨越这些边界,果断改用 ZSET 才是更理性的选择。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述