Cache::get()返回null或报Driver [redis] not supported,说明Redis驱动未加载成功;必须启用PHP redis扩展、安装topthink/think-redis包、配置stores.redis完整且字段正确(如select为整数0、password为空字符串),三者缺一不可。

Cache::get() 返回 null 或报 Driver [redis] not supported,基本可以断定 Redis 驱动根本没加载成功,不是缓存键没存、也不是 Redis 挂了——是 TP 连 Redis 的路子压根没走通。
PHP redis 扩展没启用,Class 'Redis' 直接报错
ThinkPHP 6 的 Redis 缓存底层依赖原生 Redis 类,不是 Predis,也不是纯 PHP 实现。没这个扩展,连实例化都失败。
- 执行
php -m | grep redis,无输出就说明扩展没启;Windows 用户还要确认phpinfo()页面里有没有 redis 模块 - Linux/macOS:用
sudo apt install php-redis(Debian/Ubuntu)或sudo yum install php-pecl-redis(CentOS),别用pecl install redis后手动改php.ini,容易漏重启 PHP-FPM - Windows:必须下载与 PHP 版本、TS/NTS、架构(x64/x86)完全匹配的
php_redis.dll,放进ext/目录后,在php.ini显式加extension=php_redis.dll - 改完一定要重启 Web 服务或 PHP-FPM,否则
php -m看不到,TP 启动时也找不到Redis类
topthink/think-redis 没装,驱动注册就不存在
TP6 默认只内置 file 和 array 驱动。redis 驱动类由 topthink/think-redis 提供,不装这个包,配置写得再全也没用。
- 运行
composer require topthink/think-redis,注意不是predis/predis或phpredis - 装完检查
vendor/topthink/think-redis/src/Provider.php是否存在,TP6.0+ 会自动发现并注册服务提供者 - 若在 Swoole、CLI 任务或自定义容器中使用,需手动调用
ThinkRedisServiceProvider::register(),否则驱动不进容器 - 验证方式:在控制器里写
var_dump(app('cache')->getStore('redis')),能打出实例说明驱动已注册;报Driver [redis] not supported就是没注册
config/cache.php 配置字段写错,静默 fallback 到 file 驱动
配置错一个字段,TP 就放弃 Redis,默默切回 file 驱动——你查不到数据、Cache::get() 返回 null,但日志里啥都不报。
立即学习“PHP免费学习笔记(深入)”;
-
'default' => 'redis'必须是全小写字符串,写成'Redis'或'REDIS'会静默失败 -
stores.redis块必须完整存在,不能只改default;漏掉'select' => 0(注意是整数,不是字符串"0")或'password' => ''(空密码也得显式写空字符串),连接会直接被拒绝 -
'host'和'port'要和你实际 Redis 服务一致;Docker 内访问宿主机 Redis,别写127.0.0.1,Mac/Windows 用host.docker.internal,Linux 用宿主机真实 IP - 别在配置里直接 new 实例,比如
'handler' => new \Redis()—— 这会破坏连接复用和连接池,高并发下秒变Connection refused
缓存键被加前缀 + Redis 数据库选错,redis-cli 查不到
你在代码里 Cache::get('user_123') 返回 null,但 redis-cli get user_123 也返回 (nil),大概率是因为 key 被加了前缀,或者连错了 database。
- TP 默认给所有缓存 key 加
think:前缀,Cache::get('user_123')实际查的是think:user_123;想确认,用redis-cli keys "think:user*"(仅调试,生产禁用) -
'select' => 0对应 Redis 的 database 0,如果你配置了select => 1,就得用redis-cli -n 1 get "think:user_123"才能查到 - 前缀可改但别删:
'prefix' => 'shop:'比''更安全,多应用共用 Redis 时避免 key 冲突 - 用
Cache::store('redis')->getRealKey('user_123')能打印出真实 key 名,比猜靠谱
最常被忽略的是:配置里 'type' => 'redis' 大小写错误、'select' 写成字符串、password 字段留空或缺失——这三项错任意一个,TP 都不会报错,而是安静地退回到 file 驱动,所有缓存操作都在本地文件里完成,你却以为连上了 Redis。



















