Redis驱动未生效的首要原因是cache.php中'type' => 'Redis'大小写错误,必须为全小写'redis';其次缓存键默认带'think:'前缀且受host/database配置影响,导致CLI查不到。

Redis 驱动没生效?检查 cache.php 里是否写了 'type' => 'redis' 而不是 'type' => 'Redis'
ThinkPHP 6+ 对缓存驱动类型名大小写敏感,写成 Redis 会 fallback 到默认 File 驱动,根本连不上 Redis。这不是配置路径或扩展没装的问题,是类型名硬匹配失败。
-
type必须全小写:'type' => 'redis' - 确认
think-redis扩展已安装:composer require topthink/think-redis - 若用自定义驱动类(比如
app\cache\MyRedis),type应填类的短名(不含命名空间),且该类必须实现think\CacheInterface - 别在
cache.php里直接 new 实例——驱动由容器自动实例化,手动 new 会导致连接复用失效、连接池不生效
自定义 Redis 缓存类时,init() 方法里别直接 new Predis\Client 或 Redis
TP 的缓存驱动生命周期由容器管理,连接对象应复用。自己 new 客户端会导致每次调用缓存方法都新建连接,压测时秒变连接风暴。
- 正确做法:在
init()中通过$this->handler = $this->getRedisClient();获取已注册的 Redis 实例(来自think-redis提供的redis服务) - 如果非要绕过官方 Redis 服务,至少用连接池封装:
new \RedisPool($config)(需自行实现 Pool 类),否则并发下 Redis 连接数爆炸 -
get()/set()方法里禁止再调connect()—— handler 已就绪,直接调$this->handler->get($key) - 注意
set()的第三个参数:TP 传的是「有效期秒数」,但原生Predis的set($key, $val, ['ex' => $ttl])接收数组,需做适配转换
缓存键名被自动加前缀后,用 CLI 手动查不到?看 default_prefix 和 host 是否一致
TP 默认给所有缓存 key 加 think: 前缀,且不同环境(dev/test/prod)可能配了不同 host,导致你在本地 redis-cli 查 get user:1001 返回 nil——实际存的是 think:user:1001,还可能在另一台 Redis 上。
- 查键前先确认
cache.php中的'prefix' => 'think:',或设为空字符串取消前缀(不推荐,多应用共用 Redis 时易冲突) - CLI 连接目标必须和 TP 配置的
host、port、database完全一致;尤其database默认是 0,但有些部署会切到 1~15 - 用
keys think:*user*查前缀键(生产禁用!只用于调试),更安全的方式是改代码临时打日志:var_dump($this->getRealKey($key)) - 如果用了集群模式,
keys命令不可用,只能靠业务日志或监控工具定位 key 分布
用 Tag 标签删除缓存时失效?检查驱动是否真正支持 tag 特性
TP 的 Tag 功能底层依赖 Redis 的 set + zset 模拟,但官方 redis 驱动默认关闭该功能,需显式开启,否则 clear('user') 什么都不会删。
- 在
cache.php的 redis 配置块中加:'tag_layout' => '%s_%s'(启用 tag 支持) -
Tag删除本质是查出所有带该 tag 的 key 再批量 del,所以务必确保keys命令在 Redis 服务端可用(某些云 Redis 默认禁用) - 高并发下 tag 索引可能滞后,建议关键业务不用 tag 清除,改用精确 key 清除或设置合理 ttl
- 自定义驱动若未重写
tagSet()/tagDel()方法,tag 功能直接不可用——不是 bug,是没实现
事情说清了就结束。最常卡住的地方其实是大小写和 prefix——连不上、查不到、删不掉,八成在这俩地方反复横跳。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










