tp6 redis缓存需同时满足三条件:安装topthink/think-redis扩展、启用php redis扩展、在config/cache.php中完整配置stores.redis块(含type/host/port/select/password),缺一即退化为file驱动。

装了 topthink/think-redis 却报 ClassNotFoundException?不是包没装对,是 PHP 扩展、配置、autoload 三处有一处没对上,缓存就起不来。
为什么 Cache::store('redis')->get() 直接报错
TP6 不像 Laravel 那样把 Redis 驱动内置进框架。它只提供抽象层(topthink/think-cache),驱动得单独装、手动配、PHP 层还得支持。
- 只运行
composer require topthink/think-redis→ 包装进了vendor/,但 PHP 还不认识Redis类 - 没开 PHP 的
redis扩展(不是phpredis别名,是扩展模块本身)→new \Redis()就失败,驱动根本初始化不了 -
config/cache.php里只改了'default' => 'redis',但没定义'stores' => ['redis' => [...]]→ 框架找不到这个 store 实例
安装和验证必须按顺序走这三步
漏掉任意一步,缓存都只是“看起来装好了”。
- 执行
composer require topthink/think-redis(确保在项目根目录,含composer.json) - 运行
php -m | grep redis(Linux/macOS)或打开phpinfo()确认redis在已启用模块列表里 - 在
config/cache.php的'stores'数组中显式添加'redis'键,不能只靠 default 切换
示例配置片段:
return [
'default' => 'redis',
'stores' => [
'redis' => [
'type' => 'redis',
'host' => '127.0.0.1',
'port' => 6379,
'select' => 0,
'password' => '',
],
],
];
装了 think-cache 却还是用不了 Cache 门面
Cache 门面依赖 think-cache 提供的 Think\Cache\Facade,但它的类路径必须被自动加载器识别到。
- 没装
topthink/think-cache→Cache类根本不存在,直接Class not found - 装了但
composer.json中 autoload 没生效(比如你删过vendor/autoload.php或清过 classmap)→ 运行composer dump-autoload补救 - 用了
--classmap-authoritative但没把think-cache的路径收进autoload_classmap.php→ 它会被跳过,fallback 失效
Redis 驱动配置最容易忽略的细节
参数名看着像,实际含义和 TP5/TP6 差很多,填错一个就静默失败或连错库。
-
'select'是 Redis 数据库编号(0–15),不是连接池 ID;填错会导致数据写进别的 DB,查不到也清不掉 -
'timeout'和'read_timeout'默认是 0(阻塞),高并发下建议设为 1.0,避免请求卡死 -
'prefix'必须字符串,不能为null或空数组,否则序列化时出 warning,部分操作返回 false 而非抛异常 - 如果 Redis 服务启用了 ACL(如 Redis 6+),
'password'得配合'username'使用,单填 password 会认证失败
真正跑通的关键不在“装了多少”,而在“每层是否严丝合缝地对上了”。尤其当多个缓存驱动混用时,stores 配置项一旦拼写错误或缩进错位,TP6 不报错,只默默回退到 file 驱动——你根本意识不到它没走 Redis。











