使用Redis的List实现缓存分页信息

 更新时间:2026年02月24日 09:09:31   作者:写码小C  
Redis List 是基于双向链表实现的有序集合(按插入顺序排序),借助 lrange 命令可快速实现分页查询,相比传统数据库(如 MySQL)的 limit offset 分页,Redis List 分页在热点数据、小范围分页场景下性能更稳定,本文给大家介绍了如何使用Redis的List实现缓存分页信息

一、Redis List 分页的核心价值

Redis List 是基于双向链表实现的有序集合(按插入顺序排序),借助 lrange 命令可快速实现分页查询,相比传统数据库(如 MySQL)的 limit offset 分页,Redis List 分页在热点数据、小范围分页场景下性能更稳定,且纯内存操作响应耗时极低,常被用于缓存“最新文章列表、评论列表、消息列表”等按时间排序的分页场景。

二、核心 API 与分页实现逻辑

1. 核心分页命令:LRANGE(只读,不修改原数据)

(1)命令格式

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 条数据(按发布时间从新到旧排序):

# 从右侧插入(保证新数据在列表头部/尾部,根据业务调整)
RPUSH article:list 101 102 103 104 105 106 107 108 109 110

(2)分页查询操作

第 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 条数据

三、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 计算总页数

# 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 实现。

以上就是使用Redis的List实现缓存分页信息的详细内容,更多关于Redis List缓存分页信息的资料请关注脚本之家其它相关文章!

相关文章

  • 关于Redis的内存淘汰策略详解

    关于Redis的内存淘汰策略详解

    当内存空间使用达到限制时,Redis 会根据配置策略来选择不同处理方式,要么返回 errors,要么按照不同的策略算法来清除一些旧数据,达到回收内存的目的,这就是 Redis 的内存淘汰,有些文章中,内存淘汰也叫缓存回收,需要的朋友可以参考下
    2023-05-05
  • 一篇文章让你明白Redis主从同步

    一篇文章让你明白Redis主从同步

    今天小编就为大家分享一篇关于一篇文章让你明白Redis主从同步,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02
  • 详解Redis中key的命名规范和值的命名规范

    详解Redis中key的命名规范和值的命名规范

    这篇文章主要介绍了详解Redis中key的命名规范和值的命名规范,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • 使用redis生成唯一编号及原理示例详解

    使用redis生成唯一编号及原理示例详解

    今天介绍下如何使用redis生成唯一的序列号,其实主要思想还是利用redis单线程的特性,可以保证操作的原子性,使读写同一个key时不会出现不同的数据,感兴趣的朋友跟随小编一起看看吧
    2021-09-09
  • Redis哨兵集群模式全方位解读

    Redis哨兵集群模式全方位解读

    Redis哨兵集群通过心跳检测实现主从自动故障转移,当主节点宕机时,依据断开时间、优先级、offset和运行ID规则选举新主,脑裂问题因网络分割导致数据冲突,可通过配置参数限制同步延迟和从节点数量来避免数据丢失
    2025-09-09
  • Redis配置文件redis.conf详细配置说明

    Redis配置文件redis.conf详细配置说明

    本文列出了Redis的配置文件redis.conf的各配置项的详细说明,简单易懂
    2018-03-03
  • Redis数据库存储键值对的底层原理分析

    Redis数据库存储键值对的底层原理分析

    Redis是一种内存数据库,使用哈希表存储键值对,它通过哈希函数计算键的存储地址,并通过地址找到数据,当出现哈希冲突时,Redis使用链地址法解决,为优化性能,Redis采用渐进式哈希表迁移技术,逐步将数据从旧哈希表迁移到新哈希表,减少对业务的影响
    2026-03-03
  • 详解Redis的慢查询日志

    详解Redis的慢查询日志

    这篇文章主要介绍了Redis的慢查询日志的相关资料,帮助大家更好的理解和学习Redis数据库,感兴趣的朋友可以了解下
    2020-08-08
  • Redis 删除策略的三种实现

    Redis 删除策略的三种实现

    本文主要介绍了Redis 删除策略的三种实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • redis批量操作pipeline管道操作方法

    redis批量操作pipeline管道操作方法

    Redis本身是基于一个Request一个Response方式的同步请求,正常情况下,客户端发送一个命令,这篇文章主要介绍了redis批量操作pipeline管道,需要的朋友可以参考下
    2022-09-09

最新评论