Cache::get()返回null主因是缓存驱动未切换至Redis而静默回退file驱动;须确认config/cache.php中default为小写'redis'、stores.redis配置完整(含type、host、port、password、select)、prefix一致且非空,同时安装topthink/think-redis扩展。

Cache::get() 返回 null,八成不是 Redis 挂了,而是根本没连上 Redis —— 还在用 file 驱动。
cache.php 里 default 设成 'redis' 却不生效?检查大小写和配置块完整性
ThinkPHP 对 default 值严格区分大小写:必须是全小写 'redis',写成 'Redis' 或 'REDIS' 会静默 fallback 到 file 驱动,没有任何报错提示。
- 确认
config/cache.php中存在完整的stores.redis配置块,不能只改default - 必填字段包括:
type、host、port、password、select(注意是select,不是database) -
select必须为整数,写成字符串"0"也会静默失败 -
password即使为空,也必须显式写成'';留空或删掉该字段会导致连接被拒绝
装了 predis/predis 或启用了 PHP redis 扩展,为什么还是连不上?
ThinkPHP 5.1+ 官方推荐且实际依赖的是 topthink/think-redis 扩展包,仅装 predis/predis 或只启用 PHP 的 redis 扩展都不够。
- 运行
composer require topthink/think-redis安装专用适配器 - 验证 PHP 是否加载了原生
redis扩展:php -m | grep redis,有输出才代表可用 - 若用
predis,需手动在stores.redis.type改为'predis',但不推荐——性能差、无持久连接支持、调试信息少
redis-cli 能连,Cache::get() 却返回 null?查 key 前缀和数据库编号
ThinkPHP 默认给所有缓存 key 自动加前缀 think:,你用 redis-cli get key 当然查不到,真实 key 是 think:key。
立即学习“PHP免费学习笔记(深入)”;
- 查键是否存在:
redis-cli -h 127.0.0.1 -p 6379 -n 0 keys "think:key"(-n 0对应配置里的select => 0) - 确保 CLI 连接参数(host/port/select)与
config/cache.php中完全一致,多环境配置下容易忽略这点 - 如需关闭前缀,在
stores.redis下加'prefix' => '';更推荐换一个业务前缀,比如'prefix' => 'shop:',方便隔离和排查
缓存时间传 0 或 null,到底哪个永不过期?
cache('k', 'v', 0) 不是永不过期,而是立刻删除 —— 框架内部将 TTL=0 视为非法,直接走清除逻辑。
- 真正想让新 key “永久”存在,必须传
null:cache('k', 'v', null) - 但注意:
null在 Redis 中对应PERSIST命令,只对已存在的 key 生效;新 key 写入时 Redis 默认无 TTL,所以效果是“永久”,但长期堆积会吃光内存 - 生产环境建议用大数值替代:
31536000(1 年),比依赖null更可控、更可预期 - 高并发下连接打满?开启
'persistent' => true,并确认 PHPredis扩展已启用(predis不支持持久连接)
最容易被忽略的是:select 字段写成字符串、password 字段缺失、以及 default 大小写错误 —— 这三处出问题,连日志都不会报,只会安静地退回到 file 驱动。



















