ThinkPHP6中数据缓存需手动触发,不配置驱动或调用cache()方法则不会缓存;必须安装think-redis扩展、正确配置驱动及权限,并通过Cache门面或store指定方式读写,模型查询需在select前调用cache()并推荐自定义key。

在ThinkPHP6中实现数据缓存,必须手动触发缓存写入与读取,框架不会自动为数据库查询或变量赋值添加缓存;不配置驱动、不调用cache()或Cache::set(),数据就永远停留在内存或数据库里,不会落盘或进Redis。
确认并启用缓存驱动
打开config/cache.php文件,检查'default'是否指向你打算使用的驱动,例如'redis'或'file';若仍为'file'但你想用Redis,必须同步确保'stores.redis.type' === 'redis'且所有连接参数(host、port、password)已填妥。【Driver [redis] not supported错误,90%源于未执行composer require topthink/think-redis】
执行命令安装扩展:composer require topthink/think-redis。该包是TP6官方适配层,不是原生predis或phpredis——装错包会导致驱动注册失败,且无明确报错提示。
Linux服务器上若runtime/cache目录权限不足,file驱动会静默失败;用ls -ld runtime/cache确认PHP运行用户对该目录有写权限。
基础缓存写入与读取
方法一:使用Cache门面类(推荐)
直接写入:Cache::set('user_1001_profile', $data, 3600);,第三参数为秒数,传null表示永久有效(Redis中执行PERSIST)。
读取缓存:$profile = Cache::get('user_1001_profile');,若key不存在,默认返回null;可指定默认值:Cache::get('user_1001_profile', [])。
方法二:指定store(多驱动场景必需)
当配置了多个store(如file和redis),且想强制走Redis时,必须显式调用:Cache::store('redis')->set('token_xxx', $val, 7200);漏掉store('redis')会 fallback 到default驱动,很可能写进文件却从Redis读不到。
模型查询结果缓存
第一步:在查询链路中插入cache()方法
UserModel::where('status', 1)->cache(1800)->select();——注意cache()必须出现在select()或find()之前,否则无效。
第二步:避免SQL生成key导致冲突
TP默认用SQL语句MD5作key,但拼接变量时易因空格、换行、环境差异导致key不一致;强烈建议传入自定义字符串key:->cache('user_active_list_v2', 1800),确保全局唯一且可读。
第三步:关联查询必须拆开缓存
with('profile')不能直接套cache()——关联子查询不参与key生成,缓存命中后profile字段为空;应分两步:先查主模型并缓存user_ids,再用ProfileModel::whereIn('user_id', $ids)->cache(1800)->select()单独缓存关联数据。
第四步:聚合结果需用remember封装
count()返回整型,不支持链式cache();改用Cache::remember('user_total_count', 300, function () { return UserModel::count(); });,闭包只在缓存未命中时执行。
缓存清理与原子操作
删除单个key:Cache::delete('user_1001_profile');
清空整个store(慎用):Cache::store('redis')->clear();——这会删掉该store下所有带前缀的key,包括其他模块缓存。
需要incr/decr或hGetAll等原生命令?别硬套Cache抽象层:$redis = think\facade\Cache::store('redis')->handler(); $redis->incr('visit_count');——handler()返回底层Predis实例,绕过序列化与前缀处理,但务必确保key命名不与Cache冲突。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











