数据缓存由开发者手动控制,通用性强;查询缓存由ThinkPHP自动封装,紧贴数据库层。前者存任意结构化数据,键名自定义;后者基于SQL哈希生成键,仅对读操作生效,需手动处理写操作缓存清除。

数据缓存和查询缓存都是 ThinkPHP 5 中减少数据库压力、提升响应速度的重要手段,但它们的触发时机、作用层级和使用方式有本质不同。
数据缓存:手动控制,通用性强
数据缓存是开发者主动调用 Cache::set() 或 S() 方法,把任意结构化数据(数组、对象、字符串等)存入缓存介质中。它不绑定具体 SQL,也不依赖数据库操作,完全由业务逻辑决定何时存、存什么、存多久。
- 适合缓存配置项、用户权限树、地区列表、API 响应结果等静态或低频变动数据
- 缓存键由开发者自定义,例如
Cache::set('site_config', $config, 3600) - 可跨控制器、跨模型复用,也可在命令行任务中读写
- 底层不解析 SQL,只做键值对存储与检索
查询缓存:自动封装,紧贴数据库层
查询缓存是直接附加在数据库查询链上的,通过 ->cache(true, $expire, $tag) 方法开启。TP5 会在执行 SQL 前先检查对应缓存是否存在;若命中,则跳过数据库查询,直接反序列化返回结果。
- 缓存键由系统自动生成,通常基于 SQL 语句哈希 + 表名 + 条件参数组合而成
- 仅对
select()、find()、value()等读取类方法生效 - 写操作(如
save()、delete())不会自动清除关联缓存,需手动处理 - 适合缓存文章列表、商品分类、热门标签等“查得多、改得少”的 DB 查询结果
关键区别总结
数据缓存是你“自己存、自己取”,自由度高;查询缓存是 TP5“帮你存、帮你取”,更省事但耦合数据库操作。前者像存一个文件到硬盘,后者像给一条 SQL 贴了个速查便签。
立即学习“PHP免费学习笔记(深入)”;
实际项目中常配合使用:用查询缓存减少重复 SQL 执行,再用数据缓存兜底存储一些非 DB 来源的结果(比如远程接口返回、计算中间值),形成多层缓冲体系。



















