查询缓存和数据缓存作用层级、触发方式与管理粒度不同:前者绑定sql生命周期,自动哈希生成键,相同sql直接命中;后者由开发者手动控制存取,支持任意变量与标签批量清理,底层共用同一缓存驱动。

查询缓存和数据缓存都是为减少数据库压力而设计的,但作用层级、触发方式和管理粒度不同。
查询缓存:绑定 SQL 查询生命周期
它是模型或 Db 类查询链式操作的一部分,只对某一次具体的数据库查询生效。调用 cache(true) 或 cache('key', 300) 后,框架会自动将该次查询的完整 SQL(含条件、排序、分页等)生成唯一哈希键,把结果序列化后存入缓存驱动。
- 缓存键由 SQL 内容自动生成,开发者无需手动命名(除非显式指定名称)
- 下次执行完全相同的查询语句时,直接返回缓存值,跳过数据库交互
- 不依赖业务逻辑判断,只要 SQL 字符串一致就命中,适合读多写少、结构稳定的列表页或详情页
- 例如:
Db::name('user')->where('status', 1)->cache(true, 60)->select(),60 秒内相同条件查询都走缓存
数据缓存:面向业务数据的通用存储
它不与任何 SQL 绑定,是独立于数据库操作之外的手动缓存行为,由开发者控制存什么、取什么、何时失效。
- 必须显式调用
Cache::set()或cache('key', $value, $expire)写入,用Cache::get('key')读取 - 可缓存任意 PHP 变量:数组、对象、字符串、配置项、计算结果等
- 适合缓存跨多个查询共用的数据,比如用户权限树、地区字典、API 聚合结果
- 支持标签(
Cache::tag('user')->set()),便于按业务维度批量清理
底层存储其实共用同一套驱动
无论是查询缓存还是数据缓存,最终都写入你在 config/cache.php 中配置的驱动(如 File、Redis)。区别在于:
- 查询缓存的键名由框架内部生成(如
query_7a8b9c...),并默认带think_query标签 - 数据缓存的键名由你定义,建议加业务前缀(如
user_list_123),避免冲突 - 两者都受相同缓存有效期、序列化方式、前缀等全局配置影响
别混淆字段缓存和表结构缓存
这属于另一类系统级缓存,和上面两类无关:Db::getFields() 的结果会被缓存,键为 database.table_name.fields,默认永久有效;修改表结构后需手动刷新(Db::getFields('user', true))或清 schema 标签缓存。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











