cache::store('redis')能用但默认不生效,必须安装topthink/think-redis扩展、配置完整stores.redis块、确保redis服务可连通,三者缺一不可;driver [redis] not supported错误源于驱动未注册,非配置错误。

直接说结论:Cache::store('redis') 能用,但默认不生效——必须装扩展、配 store、连得上 Redis 服务,三者缺一不可。不是写完配置就能跑,更不是改个 default 就自动切换。
Driver [redis] not supported 是驱动没注册,不是配置写错了
这个错误最常见,但原因很明确:TP6 默认只内置 file 和 array 驱动,redis 需要额外装 topthink/think-redis 扩展。
- 运行
composer require topthink/think-redis(注意不是predis/predis或原生phpredis包) - 确认 PHP 环境已启用
redis扩展:执行php -m | grep redis,有输出才算真正就绪 -
config/cache.php中不能只改'default' => 'redis',还必须存在完整的'stores' => ['redis' => [...]]配置块 - 如果配置里写了
'type' => 'redis'却没装扩展,TP6 会静默 fallback 到file,不会报错,但Cache::store('redis')就永远抛Driver [redis] not supported
Cache::store('redis') 和 new \Redis() 的行为完全不一样
前者走 TP 的缓存抽象层,后者是裸连 Redis。混用会导致读不到、数据错乱、前缀不一致等问题。
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
-
Cache::store('redis')->get('user_123')实际查的是think:cache:user_123(默认前缀think:cache:) - 而
(new \Redis())->get('user_123')查的就是纯user_123,两者根本不在一个 key 空间 - 想用原子操作(如
incr、hGetAll)别硬套Cache::方法,改用think\facade\Cache::store('redis')->handler()或更推荐的think\cache\driver\Redis::instance()获取底层实例 - 命令行任务里用
new \Redis()写入,Web 请求用Cache::get()读不到——这不是 bug,是设计差异,得统一入口
缓存时间传 0 或 null 的效果截然不同
很多人以为 Cache::set($k, $v, 0) 是“永不过期”,其实它等价于立刻删除;真正永不过期得传 null。
-
Cache::set('key', 'val', 0)→ 底层触发删除逻辑,key 被清掉 -
Cache::set('key', 'val', null)→ Redis 执行PERSIST,前提是 key 已存在且之前有 TTL;如果是新 key,Redis 本身不支持“新建即永不过期” - 想让新 key 永久存在?得先
setEx设个临时过期,再persist,此时必须绕过Cache::,用Redis::instance()->setEx(...)+persist()分步控制 - 配置里的
expire单位是秒,别把 JS 时间戳除以 1000 后忘了intval(),传进去小数会被截断或出错
多环境部署时最容易漏掉的三个连接项
Docker、远程 Redis、ACL 认证这三种场景下,光填 host 和 port 远远不够。
- Docker 环境下
host别写127.0.0.1,得换成host.docker.internal(Mac/Win)或宿主机真实 IP(Linux) - Redis 开启 ACL(如 Redis 6+)时,
password字段无效,得用'auth' => 'your-password',且用户需有+@all权限 - 多个应用共用一个 Redis 实例时,
database必须填数字(如0),不能写成字符串"0",否则静默失败,Cache::get()返回null却无提示 - 高并发场景建议开启
'persistent' => true,防连接耗尽;但开发环境可关掉,避免连接复用导致调试困难
真正麻烦的从来不是“怎么配”,而是配完之后 Cache::get() 静默返回 null —— 它可能因为前缀不一致、database 选错、ACL 权限不足、甚至只是 redis.conf 里 bind 地址没放开。上线前务必用 redis-cli -h X -p Y ping 和 get 命令直连验证通路,别只信框架日志。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










