跳转到主内容
极星编程网:以代码为星,赴技术山海!

Laravel怎样利用缓存提升分页性能_Laravel利用缓存提升分页性能方法【UI】

Laravel分页性能优化有五种方法:一、缓存整个Paginator实例;二、单独缓存COUNT总数;三、改用游标分页避免OFFSET;四、静态数据启用全页响应缓存;五、通过模型事件自动刷新分页缓存。

如果您在 Laravel 应用中处理大量数据的分页请求,页面响应缓慢或数据库负载过高,则很可能是由于每次分页都重新执行 COUNT 查询和数据查询导致。以下是提升分页性能的多种缓存方法:

一、使用缓存包裹 Paginator 实例

该方法将整个分页器对象(含总条目数、当前页数据、分页链接等)序列化后存入缓存,避免重复计算总数和重复查询数据集。

1、在控制器中构造查询构建器,调用

paginate()前先生成唯一缓存键,例如基于查询条件与每页数量的 MD5 值。

2、尝试从缓存(如 Redis)中获取已缓存的LengthAwarePaginator实例。

3、若缓存命中,直接返回该实例;若未命中,则执行原始分页查询,并将结果以serialize()方式存入缓存,设置合理过期时间(如 30 分钟)。

二、分离 COUNT 查询并缓存总数

分页核心瓶颈常来自 COUNT(*) 查询,尤其在无合适索引的大表上耗时显著。此方法将总数单独缓存,数据查询仍按需执行,兼顾实时性与性能。

1、使用

toBase()->getCountForPagination()获取原始 COUNT 查询语句。

2、基于查询语句哈希生成缓存键,检查缓存中是否存在该总数。

3、若缓存缺失,则执行 COUNT 查询并将结果写入缓存;后续同条件分页复用该缓存值,仅变动 offset/limit 执行数据查询。

三、采用游标分页(Cursor Pagination)替代传统偏移分页

游标分页不依赖 OFFSET 和 COUNT,而是基于上一页最后记录的排序字段值进行下一页查询,天然规避总数计算与深分页性能衰减问题。

1、确保数据表存在单调递增且有索引的字段(如 id 或 created_at)。

2、使用

cursorPaginate()替代paginate(),并传入每页数量。

3、在响应中返回

next_cursor和prev_cursor字符串,客户端通过 URL 参数传递游标值,服务端据此构造 WHERE 条件。

四、对静态数据集启用全页缓存

当分页数据极少更新(如文章分类列表、地区字典等),可将整页 HTML 或 JSON 响应直接缓存,完全绕过路由、控制器与查询逻辑。

1、在中间件中拦截匹配特定路由模式的 GET 请求(如 /api/categories?page=1)。

2、生成包含完整请求路径与查询参数的缓存键,尝试读取响应内容缓存。

3、若命中,直接返回缓存的

Response对象并设置Cache-Control: public, max-age=3600头;否则继续执行原流程并在响应发送前写入缓存。

五、使用模型事件自动刷新关联分页缓存

当底层数据变更时,原有分页缓存可能失效。该方法监听模型的创建、更新、删除事件,在事务提交后清除对应缓存键,保障分页数据一致性。

1、在模型的

booted()方法中注册created、updated、deleted事件监听器。

2、每个监听器内构造与该模型分页相关的所有缓存键前缀(如

posts_paginate_*)。

3、调用

Cache::forget()或Cache::flush()清除匹配键,确保下次分页请求重建缓存。

相关文章