ThinkPHP提升性能的核心是精准缓存:选Redis/Memcached替代文件缓存防IO瓶颈,优先缓存数据库查询结果、模板片段和计算结果,配合合理过期、主动失效、空值缓存及tag前缀管理。

ThinkPHP用缓存提高性能,核心是减少重复计算和数据库查询,把高频读取、低频变更的数据存在更快的存储里。关键不在“加不加缓存”,而在于“缓存什么、怎么存、什么时候失效”。
选对缓存驱动,别让缓存成瓶颈
文件缓存适合开发或小流量场景,但并发高时容易锁文件、IO慢;生产环境强烈推荐 Redis 或 Memcached:
- Redis 支持持久化、数据结构丰富,适合存用户会话、权限规则、热点列表
- Memcached 内存利用率高、多线程响应快,适合纯键值型高频缓存(如配置项、计数器)
- 配置时注意连接参数:host、port、password、timeout;Redis 建议开启 persistent(长连接),避免每次请求重建连接
重点缓存这三类数据
不是所有数据都值得缓存,优先覆盖以下高收益场景:
-
数据库查询结果:比如首页文章列表、分类导航、用户权限规则。用
Db::cache(true, 3600)直接挂载到查询链上 -
模板片段:侧边栏推荐、热门评论等不常变的 HTML 片段,配合
{:widget('hot_comment')}+ 缓存逻辑可大幅降低渲染开销 - 计算结果:如用户等级、积分汇总、统计报表。避免每次请求都执行 SUM/COUNT/GROUP BY
设置合理过期与失效机制
缓存不更新比不缓存更危险。不能只设固定时间,要结合业务节奏:
- 静态内容(如网站公告)可设 1–24 小时;动态内容(如购物车数量)建议 5–30 分钟
- 主动失效优于被动过期:用户修改资料后,立刻
Cache::delete('user_profile_' . $uid) - 权限类数据建议按角色/用户 ID 维度缓存,并在角色变更时批量清除对应键,而不是清空全部
- 避免缓存穿透:对查不到的数据(如 id=999999 的用户)也缓存空值(
Cache::set($key, null, 60)),防止恶意请求打穿缓存直击数据库
用好前缀和标签,方便维护和清理
不加约束的缓存键容易冲突或无法管理:
- 全局 prefix 如
'tp6_user_'或'admin_api_',区分模块和环境 - 敏感数据(如用户手机号)不要直接当 key,应哈希处理:
md5('mobile_' . $phone) - 支持 tag 的驱动(如 Redis)可用
Cache::tag('user')->set('info_123', $data),后续一键清空整个 tag 下所有缓存
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











