0

0

PHP分页怎么用Redis缓存分页数_PHP结合Redis分页缓存【技巧】

蓮花仙者

蓮花仙者

发布时间:2026-02-20 18:19:02

|

262人浏览过

|

来源于php中文网

原创

最稳妥的是用 redis 的 zset 存原始排序数据(score=排序字段值,member=主键id),再配合 zrange + zcard 做分页和总数统计——前提是排序字段唯一且稳定。

php分页怎么用redis缓存分页数_php结合redis分页缓存【技巧】

分页数据存Redis用什么结构最合适

直接存整个分页结果数组到字符串(SET)看似简单,但更新某一页或删数据时无法局部刷新,容易脏;用哈希(HSET)按页号存也行,但分页总数、总条数这些元信息得额外维护,不统一。最稳妥的是:**用 Redis 的 ZSET 存原始排序数据(score=排序字段值,member=主键ID),再配合 ZRANGE + ZCARD 做分页和总数统计**——前提是排序字段唯一且稳定(比如 created_at + id 拼接作 score)。

如果排序字段不唯一(如多个记录同时间创建),必须加唯一后缀避免 member 冲突,例如:

zadd articles:2024:score 1698765432.000001:1001 1001<br>zadd articles:2024:score 1698765432.000002:1002 1002

  • 分页查:用 ZRANGE articles:2024:score $offset $limit WITHSCORES
  • 总数:ZCARD articles:2024:score,比 GET 一个预存总数更可靠
  • 翻页跳转快:ZRANK 可定位某 ID 当前页码,适合“回到上次位置”场景
  • 注意:ZSET 不支持 offset-limit 随机跳转的 O(1) 复杂度,大数据量(>10w)时 ZRANGE 偏移过大仍会慢,此时应改用游标式分页(SCAN 或业务层游标)

缓存分页元信息该不该单独存

必须存,而且要和数据缓存联动失效。比如用 GET page:articles:2024:meta{"total": 1284, "per_page": 20, "last_updated": 1712345678} ——这不是可选优化,是避免并发写入导致总数错乱的关键。

  • 每次新增/删除记录后,立刻 INCRDECR 总数(用 INCRBY 更安全)
  • 不要依赖 ZCARD 实时算总数:高并发下可能因 pipeline 或网络延迟产生瞬时不一致
  • 元信息设 1–3 秒过期(EXPIRE),配合写后更新,既防雪崩又保最终一致
  • 如果业务允许弱一致性(如后台管理页),可省掉元信息,直接 ZCARD 查总数;但用户端列表页不建议

PHP 里怎么安全读取带分页的 ZSET 数据

别用 redis->zRange() 直接传 $page * $limit 算 offset——当有人恶意传 page=999999,Redis 会遍历前几百万元素再返回空数组,拖垮服务。

立即学习PHP免费学习笔记(深入)”;

正确做法是先用 ZCARD 判断范围,再截断:

$total = $redis->ZCARD('articles:2024:score');<br>$offset = max(0, min($page - 1, (int)(($total - 1) / $per_page))) * $per_page;<br>$ids = $redis->zRange('articles:2024:score', $offset, $offset + $per_page - 1);
  • max/min 截断 offset,防止越界计算
  • 查出 ID 后,再用 MGET 批量查详情(假设详情存在 article:1001 这类 key)
  • 不要在 PHP 里用 foreach 单条查 Redis,MGET 能减少 90%+ 的 RTT
  • 如果详情数据也需缓存,建议用 PIPELINE 一次发多个命令,但注意超时和内存占用

什么时候该放弃 Redis 分页缓存

不是所有分页都适合上 Redis。以下情况直接走 MySQL LIMIT OFFSET 更省事、更稳:

  • 数据实时性要求极高(秒级更新),且写远大于读(如 IM 消息流)
  • 排序逻辑复杂(涉及多表 JOIN、函数计算、用户权限过滤),无法预热进 ZSET
  • 分页条件动态多变(如搜索关键词频繁变),ZSET 结构难以覆盖全部组合
  • 单页数据量极小(

真正值得投入 Redis 分页的,是那些「排序固定、读多写少、总量大、分页稳定」的场景,比如文章归档、商品类目列表、日志查询后台——其余情况,先压测再决定。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

679

2023.06.20

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

372

2023.06.21

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

286

2023.07.18

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

519

2023.07.19

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

263

2023.07.25

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

392

2023.08.08

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

537

2023.08.11

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

638

2023.08.14

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

796

2026.02.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 12.1万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 11.3万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号