ThinkPHP缓存切换Redis后读不到数据是因file与redis双缓存并存导致脏数据;需确认驱动配置、扩展启用、分步清理旧缓存并验证Redis写入是否正常。

ThinkPHP缓存驱动从file切到redis后,旧的runtime/cache/文件还在磁盘上,而新请求走Redis却读不到刚写入的数据——这不是代码问题,是两套缓存并存导致的脏数据冲突。
确认当前生效的缓存驱动
先执行php think run或查看config/cache.php中default值,再检查.env是否覆盖了CACHE_DRIVER=redis。如果default是redis但stores['redis']配置里host写错或扩展未安装,框架会静默fallback到null驱动,此时所有Cache::get()都返回null,你以为清干净了,其实根本没写进Redis。
运行php -m | grep redis确认扩展已启用,否则Cache::store('redis')->get('test')会直接报错而非静默失败。
分层清理:先断旧链,再清新仓
第一步:停掉旧file缓存的自动写入。打开config/cache.php,把stores['file']['path']临时改成一个不存在的路径(比如/tmp/xxx_cache),重启服务。这步强制让所有Cache::store('file')调用失败,避免新请求继续往runtime/cache/里塞文件。
立即学习“PHP免费学习笔记(深入)”;
第二步:手动清空runtime/cache/目录。执行rm -rf runtime/cache/*,注意别删runtime/cache本身目录,只清里面的内容。这一步必须做,否则下次切回file驱动时,那些残留的过期缓存文件会被误读。
第三步:清Redis里的旧缓存。不要用FLUSHDB——它会清掉其他业务共用的Redis库。查config/cache.php中redis驱动的prefix配置(默认是think_cache:),然后在Redis CLI里执行SCAN 0 MATCH think_cache:* COUNT 1000,逐个DEL返回的key。如果用了标签缓存,还得补一句SCAN 0 MATCH tp_tag:* COUNT 1000再删。
【关键前提】必须确保stores['redis']['prefix']和stores['redis']['tag_prefix']两个配置都已设置,否则Cache::tag('user')->clear()在Redis里根本找不到索引key,删了个寂寞。
验证是否真正切换成功
写一段测试代码:Cache::store('redis')->set('driver_test', 'ok', 60); var_dump(Cache::store('redis')->get('driver_test'));。如果输出string(2) "ok",说明Redis写入正常;如果输出bool(false),立刻检查stores['redis']里的host、port、database三项是否填错。
再跑一次Cache::clear(),观察Redis里对应prefix的key是否归零。别信返回值true,要用redis-cli KEYS "think_cache:*" | wc -l数真实剩余key数量。
最后删掉之前改的stores['file']['path']临时路径,恢复原配置。这步做完,旧file缓存彻底失效,新redis缓存完全接管。



















