ThinkPHP 8.0 Redis 缓存真正提速的关键是显式填全 config/cache.php 中 host、port、database、password/auth、timeout、persistent 等全部参数,禁用 PHP 原生 session GC,并通过 ping 验证连接;漏一项即静默降级为 file 驱动。

ThinkPHP 8.0 的 Redis 缓存要真正提速,关键不是“开了 Redis”,而是配置不漏项、用法不越界、降级不沉默。很多项目缓存“看似生效”,实则一直在走 file 驱动——这是性能瓶颈最常被忽略的根源。
必须手动填全 config/cache.php 参数
`.env` 中的 CACHE_STORE=redis 只是开关,TP8 不读取 REDIS_HOST、REDIS_PORT 等环境变量。所有连接参数必须显式写进 config/cache.php 的 stores['redis'] 数组里:
-
host:字符串,如
'127.0.0.1',不能留空或注释 -
port:整型,如
6379,写成字符串会失败 -
database:整型,如
0,必须指定,否则部分命令报错 -
password 或 auth:ACL 模式(Redis ≥6.0)用
auth,传统模式用password -
timeout:建议 float 类型,如
3.0,避免连接卡死 -
persistent:高并发下务必设为
true,减少 TCP 握手开销
session 和 cache 必须物理隔离
别指望靠 prefix 区分 session 和 cache,冲突风险高。推荐做法是:
- cache 用
database => 0 - session 用
database => 1(需同步配在config/session.php的store数组中) -
config/session.php不仅要写'type' => 'redis',还必须完整声明'store' => [...],否则直接报Call to a member function setOptions() on null - 禁用 PHP 原生 GC:
ini_set('session.gc_probability', 0),防止 Redis 中 session 被误删导致用户登出
验证是否真连上 Redis
别信日志没报错就等于连上了。最快验证方式:
立即学习“PHP免费学习笔记(深入)”;
- 运行
php think tinker - 执行:
(new \think\cache\driver\Redis(config('cache.stores.redis')))->handler()->ping() - 返回
+PONG才算通;返回 false 或异常,说明配置有误或网络不通 - 现象预警:
Cache::set('x', 'y')返回 true,但Cache::get('x')返回 null,大概率已静默降级为 file
请求缓存要靠中间件激活
即使 Redis 配好了,GET 请求也不会自动缓存。必须启用框架内置的请求缓存中间件:
- 确保
think\middleware\CheckRequestCache已注册到对应路由或全局中间件队列 - 控制器中可用
$this->cache(3600)显式设置缓存时长 - 带查询参数的 URL(如
?id=5)会被完整计入 key,注意缓存粒度 - 避免在中间件前输出内容(如
header()或提前调用session_start()),否则缓存响应逻辑会被破坏



















