Cache::get() 返回 null 或报 Driver [redis] not supported,根本原因是 ThinkPHP 未正确连接 Redis,需检查 phpredis 扩展启用、topthink/think-redis 包安装、config/cache.php 中 redis 配置完整且格式严格正确。

Cache::get() 返回 null 或报 Driver [redis] not supported,基本就是驱动没注册或配置漏项——不是 Redis 服务没开,而是 ThinkPHP 根本没连上它。
PHP redis 扩展必须启用且版本匹配
ThinkPHP 的 Redis 驱动依赖原生 phpredis 扩展,不是 predis,也不是仅靠 Composer 包就能跑起来。缺这个扩展,new \Redis() 都会报 Class 'Redis' not found。
- 运行
php -m | grep redis(Linux/macOS)或看phpinfo()页面确认模块存在 - 没输出?Linux/macOS 执行
pecl install redis,然后在php.ini加extension=redis.so - Windows 下放对版
php_redis.dll(注意 PHP 版本和线程安全 TS/NTS),再加extension=php_redis.dll - 改完
php.ini必须重启 PHP-FPM 和 Web 服务器,否则不生效 - PHP 8.0+ 建议用 redis 扩展 ≥ 5.3.7;装错 DLL 版本(比如 PHP 8.3 装了 7.x 的)也会失败
topthink/think-redis 包必须安装且类可加载
TP6/TP8 默认不带 Redis 驱动类,composer require topthink/think-redis 是硬性前置条件。没它,Cache::store('redis') 直接抛 Driver [redis] not supported。
- 执行
composer require topthink/think-redis,完成后检查vendor/topthink/think-redis/src/Driver.php是否存在 - 别装
predis/predis或phpredis/phpredis—— 这些是底层客户端,不是 TP 的驱动适配器 - 如果用 Swoole 或命令行任务,确保
ThinkRedisServiceProvider已被自动加载;手动启动容器时可能需显式调用register()
config/cache.php 中 stores.redis 必须完整且类型严格
只改 'default' => 'redis' 不够,stores.redis 块缺失或字段错位,TP 会静默 fallback 到 file 驱动,毫无提示。
立即学习“PHP免费学习笔记(深入)”;
-
'type' => 'redis'必须全小写,写成'Redis'或'REDIS'就失效 -
'select' => 0必须是整数,写成'select' => "0"会导致连接失败但无报错 -
'password' => ''即使没密码也得显式写出,留空或写null会触发认证拒绝 -
'database' => 0在 TP8 中必须显式声明(TP6 可省略,但建议写上) - 不支持
redis://URL 格式,只能用'host'+'port'+'select'拆开配 - 调试时建议加
'prefix' => '',否则redis-cli get user_123查不到——实际存的是think:user_123
连接失败会静默降级,必须手动验证是否真通
TP8 对 Redis 连接失败采取“静默兜底”策略:首次异常记日志(搜 RedisException 或 Connection refused),后续复用连接池失败则完全无提示,直接切到 file 缓存。
- 现象包括:登录后刷新即登出、
Cache::set()成功但get()返回null、接口响应时间忽高忽低 - 最快验证方式:
php think tinker后执行(new \think\cache\driver\Redis(config('cache.stores.redis')))->handler()->ping(),返回+PONG才算通 - 生产环境务必设
'persistent' => true,否则高并发下握手开销吃掉 QPS -
'timeout' => 3.0建议设为 float,避免连接卡死;'expire'单位是秒,传null表示永不过期,传0等价于立即删除
最容易被忽略的是:TP8 完全不读 .env 里的 REDIS_HOST 或 REDIS_PORT,这些变量仅作开关用途;所有连接参数必须硬编码在 config/cache.php 的 stores.redis 数组里,一个都不能少。



















