thinkphp5默认不自动缓存数据库查询结果,必须显式调用cache()方法;支持自定义键、过期时间及驱动(如redis),需手动清理以保障数据一致性,关联查询和聚合函数等场景需特殊处理。

ThinkPHP 5 默认不自动缓存数据库查询结果,必须显式调用 cache() 方法才能启用。它不是“开了缓存驱动就自动生效”的机制,而是由开发者按需控制——这是为了防止数据陈旧、避免隐式行为带来的风险。
基础用法:在查询链中插入 cache()
只需在 Db 查询构建器的任意中间步骤调用 cache(),即可对最终 select()、find()、value() 或 column() 的结果进行缓存:
-
Db::name('user')->where('status', 1)->cache(3600)->select():缓存 1 小时,key 由框架自动生成(基于 SQL) -
Db::name('article')->cache('hot_list_202610')->limit(10)->select():使用自定义 key,便于定位和清理 -
Db::name('config')->cache(true, 0)->find(1):true表示启用默认配置缓存,0表示永不过期(注意:File 驱动下有效;Redis 中建议用null或大数值)
缓存驱动要手动指定,不能只靠配置
即使你在 config/cache.php 中已配置了 Redis,cache() 方法默认仍走 file 驱动。如需使用 Redis 缓存查询结果,必须显式传入驱动名:
Db::name('user')->cache(3600, null, 'redis')->select()- 或统一在
config/database.php中设置:'cache' => ['type' => 'redis'],之后所有cache()调用将默认使用 Redis
避免缓存失效与数据不一致
TP5 不会自动监听数据变更来清理缓存,增删改操作后必须手动清除对应缓存:
- 更新用户信息后,应执行
Cache::rm('user_profile_123')或Cache::tag('user:123')->clear() - 推荐用
Cache::tag()打标管理,例如:Db::name('user')->cache('user_123', 3600, 'redis')->tag('user:123')->find(123),后续可一键清空该用户全部相关缓存 - 软删除(
use SoftDelete)场景下,cache()不感知delete_time字段变化,逻辑删除后的数据仍可能被缓存返回,需在业务层主动清除
慎用场景与替代方案
不是所有查询都适合直接缓存。以下情况建议绕过 cache(),改用更可控的方式:
-
关联查询(如
with('profile')):缓存易失效,应拆分为独立查询并分别缓存主表与关联表数据 -
聚合函数(如
count()、sum()):它们返回标量而非 Query 对象,无法链式调用cache(),应改用Cache::remember('user_count', 300, function () { return Db::name('user')->count(); }) -
带用户态或分页参数的查询(如
where('uid', session('uid'))):key 易冲突或爆炸式增长,优先考虑客户端缓存或服务端局部缓存策略
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











