Cache::get()静默返回null的根源是Redis缓存未真正启用,需同时满足驱动启用、连接配置对齐、配置固化三条件。先验证redis-cli ping通且PHP扩展加载,再确保.env含CACHE_DRIVER=redis等五项并执行config:clear与config:cache,最后确认config/database.php中redis.cache连接存在且client匹配实际扩展。

Cache::get() 静默返回 null,不是代码写错了,而是迁移后 Redis 缓存根本没走通——驱动未启用、连接未对齐、配置未固化,三者缺一不可。
确认 Redis 服务可达且 PHP 扩展已加载
跳过这步,后续所有配置都是空转。Laravel 不会报错,但 Cache::get() 永远拿不到值。
- 终端执行
redis-cli -h $REDIS_HOST -p $REDIS_PORT -a "$REDIS_PASSWORD" ping,必须返回PONG;Docker 环境下$REDIS_HOST不能是127.0.0.1,得填容器名(如redis)或宿主机网关(如172.17.0.1) - 运行
php artisan tinker,输入Redis::ping():若报Class 'Redis' not found,说明phpredis扩展没启用;若报认证失败,检查REDIS_PASSWORD是否对应 Redis 的 ACL 用户密码(Redis 6+ 不再用requirepass) -
php -m | grep redis必须输出redis,否则扩展未加载
驱动启用 + 配置固化必须同步完成
CACHE_DRIVER=redis 写进 .env 只是开关,不执行清缓存命令,Laravel 仍读 bootstrap/cache/config.php 里的旧配置。
- 确保
.env包含这五行(值按实际调整):CACHE_DRIVER=redisREDIS_HOST=redisREDIS_PORT=6379REDIS_PASSWORD=nullREDIS_DB=0 - 立刻执行:
php artisan config:clear→ 删除编译缓存php artisan config:cache→ 重新固化配置(漏掉这步,改一百遍.env都无效) - 验证是否生效:
php artisan tinker→ 输入config('cache.default'),返回"redis"才算成功
检查 config/database.php 中的 redis 连接定义
Laravel 缓存复用的是 config/database.php 里的 redis 配置,不是 .env 单独控制。常见故障是只改了环境变量,却忘了配对连接。
- 打开
config/database.php,找到'redis'数组,确认其中存在名为'cache'的连接(默认 key):'cache' => [ 'host' => env('REDIS_HOST', '127.0.0.1'), 'password' => env('REDIS_PASSWORD'), 'port' => env('REDIS_PORT', 6379), 'database' => env('REDIS_CACHE_DB', 1) ] -
'client'值必须与已安装扩展一致:'client' => 'phpredis'(对应phpredis扩展)或'client' => 'predis'(对应predis/predisComposer 包) - 如果
config/cache.php里'stores.redis.connection'被改成其他名字(如'production_cache'),那config/database.php里也必须有同名连接定义,否则Cache::store('redis')会静默失败
避免键冲突和前缀混淆
默认 cache 和 session 共用 database 0,Cache::flush() 会清掉用户登录态;另外,没设 prefix 会导致多项目共用 Redis 时 key 冲突。
- 在
config/cache.php的'redis'store 下加一行:'prefix' => env('CACHE_PREFIX', 'laravel_app_v2:') - 确保
config/database.php中'redis.cache.database'和'redis.session.database'分开(如 cache 用 db 1,session 用 db 2) - 验证前缀是否生效:
Cache::store('redis')->put('test', 'ok'),然后用redis-cli -n 1 KEYS "laravel_app_v2:*"查看是否命中
最易被忽略的是:config:cache 命令执行前,APP_KEY 必须已生成且未被注释;而 Cache::get() 返回 null 时,90% 情况下是因为 config/database.php 里 redis.cache 连接压根不存在,或者 client 值写成了 phpredis 但实际装的是 predis。


















