thinkphp 8.0 使用 redis 缓存必须显式配置 config/cache.php 全参数、验证 ping 返回 +pong、分离 cache 与 session 的 database,并安装 think-redis 包,否则静默降级为 file 驱动。

ThinkPHP 8.0 使用 Redis 缓存不能只改 .env 就生效,必须显式配置、手动验证、分层隔离,否则会静默退回到 file 驱动——你看到 Cache::set() 返回 true,但 Cache::get() 拿不到值,就是典型失效信号。
确认环境和扩展已就绪
缓存跑不起来,八成卡在底层。先确保:
- 执行
php -m | grep redis,输出含redis才算扩展已启用 - Redis 服务正在运行(如
systemctl status redis) - 项目中已安装适配包:
composer require topthink/think-redis - 改完
php.ini或启用扩展后,必须重启 PHP-FPM 或 Web 服务器(Nginx/Apache)
严格配置 config/cache.php
TP8 不读取 .env 中的 REDIS_HOST 等变量,所有参数必须硬编码写进配置文件:
-
'default' => 'redis'(小写,不能是 Redis 或 REDIS) -
'stores' => ['redis' => [...]]中必须显式包含:-
'host' => '127.0.0.1'(字符串,不能为空或注释) -
'port' => 6379(整型,写成'6379'会失败) -
'database' => 0(整型,必须指定,否则部分命令报错) -
'password' => ''或 ACL 模式下用'auth' => 'your-pass' -
'timeout' => 3.0(建议 float 类型,防连接卡死) -
'persistent' => true(高并发下强烈推荐,减少握手开销) -
'prefix' => 'app_v2_'(避免 key 冲突)
-
分离 cache 和 session 的 Redis 实例
别指望靠 prefix 区分,冲突风险高。推荐物理隔离:
- cache 用
database => 0 - session 用
database => 1,并在config/session.php中完整配置:'type' => 'redis', 'store' => [ 'host' => '127.0.0.1', 'port' => 6379, 'database' => 1, 'auth' => 'xxx' ]
- 同时禁用 PHP 原生 GC:
ini_set('session.gc_probability', 0),防止 Redis 中 session 被误删
验证是否真走 Redis
别信日志没报错就等于连上了。最快实测方式:
- 运行
php think tinker - 输入:
(new \think\cache\driver\Redis(config('cache.stores.redis')))->handler()->ping() - 返回
+PONG才算通;返回false或异常,说明配置错误或网络不通 - 再补一手:执行
php -r "var_dump(cache('test_key', 'ok', 10));",再执行php -r "var_dump(cache('test_key'));",两次都输出"ok"才算真实生效
基础缓存操作写法
缓存不会自动触发,必须显式调用:
- 单键存取:
Cache::set('user_1001', ['name' => '张三'], 3600);Cache::get('user_1001') - 带标签批量管理:
Cache::tag('user')->set('profile_1001', $data, 3600);后续可Cache::clear('user')一键清理 - 请求级缓存需启用中间件:
think\middleware\CheckRequestCache,控制器中用$this->cache(3600)设置时长
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











