Cache::get() 返回 null 的根本原因是 phpredis 扩展未加载且 think-redis 包未安装,导致驱动缺失或配置无效。

phpredis扩展没装好,Cache::get() 就永远返回 null
不是配置写错了,而是驱动根本没加载——php -m | grep redis 没输出,说明 PHP 进程压根不认识 redis 扩展。ThinkPHP 6 的 Redis 缓存底层强依赖 phpredis(C 扩展),不是 Predis(纯 PHP 实现)。装错或漏装,所有缓存操作都会静默退化到 file 驱动。
- Linux/macOS:运行
pecl install redis,然后在php.ini加extension=redis.so - Windows:下载对应 PHP 版本的
php_redis.dll,放进ext/目录,php.ini加extension=php_redis.dll - 重启 PHP-FPM 或 Web 服务器后,必须再次执行
php -m | grep redis确认生效 - 别用
predis/predis替代——它和 phpredis 共存时可能引发连接冲突,且对 Redis 6+ ACL 支持不全,容易报NOAUTH
topthink/think-redis 不装,type => 'redis' 就是无效字符串
ThinkPHP 6 默认不内置 Redis 驱动类。config/cache.php 里写 'type' => 'redis' 看似合理,但没装 topthink/think-redis,运行时直接抛 Driver [redis] not supported 异常,不是连接失败,是连驱动类都找不到。
- 执行
composer require topthink/think-redis(注意不是predis/predis) - 确认
vendor/topthink/think-redis/src/Provider.php已被自动注册(TP6.0+ 通过 composer autoload 自动发现) - 若用 Swoole 或自定义 CLI 环境,需手动调用
ThinkRedisServiceProvider::register() -
type值必须全小写'redis',写成'Redis'或'REDIS'会 fallback 到 file 驱动
stores.redis 配置字段缺一不可,select 写成 "0" 就静默失败
ThinkPHP 不接受 URL 形式连接(如 redis://127.0.0.1:6379),只认键值对参数;而且字段校验严格,少一个或类型不对,就用不了 Redis。
- 必填字段:
host、port、password(空密码也得写'')、select(整数,不能是字符串"0") -
timeout建议设为3或5,设0表示永不超时,生产环境易阻塞请求 -
prefix默认是'think:',和其它语言服务共用 Redis 时,要么设为'',要么统一加相同前缀 - 别写
database键名(那是 Laravel 风格),TP6 只认select
cache('key', $val, 0) 不是永不过期,是立刻删
ThinkPHP 对第三个参数的语义是硬编码的:0 表示「立即删除」,null 才表示「永不过期」。这个行为和 Redis 原生命令无关,是框架层约定。
立即学习“PHP免费学习笔记(深入)”;
-
cache('token', $data, 0)→ 底层等价于$this->handler->set('token', null),写入即删 -
cache('token', $data, null)→ Redis 不设 TTL,靠内存淘汰或手动清理 - 生产环境慎用
null:Redis 没有真正永久 key,建议设大值如31536000(1 年)更可控 - 如果想用原生命令(如
incr、hGetAll),别套Cache::,改用Redis::instance()获取底层实例
select 字段类型和 cache() 第三个参数的语义——前者写错不会报错但静默失效,后者传错会导致缓存数据瞬间消失。



















