Laravel中Redis缓存需同时配置.env、config/database.php和config/cache.php并清除配置缓存,否则会静默降级到file或array驱动;Cache::get()返回null大概率是连接失败而非无数据,应通过Cache::store('redis')->put()验证连通性。

Redis 缓存在 Laravel 里不是设个 CACHE_DRIVER=redis 就能用的——它默认静默降级到 array 或 file,连失败都不报错。你看到 Cache::get() 返回 null,大概率是根本没连上 Redis,而不是缓存里真没数据。
为什么 Cache::get() 总是返回 null
这不是代码写错了,而是 Laravel 在连接失败时自动 fallback 到 array 驱动(内存临时存储),且不抛异常。你改了 .env 却没清配置缓存、config/cache.php 的 default 还是 'file'、或者 config/database.php 里压根没定义 cache 连接,都会导致这个现象。
- 运行
php artisan tinker -n,然后执行Cache::store('redis')->put('health', 'ok', 10)—— 如果报错或返回false,说明 Redis 连接层就断了 - 检查
config/cache.php中'default' => env('CACHE_DRIVER', 'file'):如果.env没生效,这里就会回退到file,整个缓存链路绕过 Redis -
Cache::get()默认走defaultstore,但Cache::store('redis')->get()强制走 Redis,可用于隔离验证
config/database.php 的 redis.connections 必须有 cache 键
Laravel 的缓存组件复用的是数据库配置里的 Redis 连接定义,不是靠 .env 单独驱动。如果你只在 .env 里写了 REDIS_HOST,但 config/database.php 的 'redis' => ['connections' => [...]] 里没有叫 cache 的连接项,Cache::store('redis') 就会找不到目标连接,直接 fallback。
- 在
config/database.php的'redis' => ['connections' => [...]]下加一项:'cache' => ['host' => env('REDIS_HOST', '127.0.0.1'), 'password' => env('REDIS_PASSWORD'), 'port' => env('REDIS_PORT', 6379), 'database' => env('REDIS_CACHE_DB', 1)] - 同时在
config/cache.php的'stores' => ['redis' => [...]]中确认'connection' => 'cache',不是'default'(除非你明确把default连接也配对好了) - 若用 Docker,
REDIS_HOST必须填容器名(如redis),不能填127.0.0.1—— 容器内 localhost 指向自己,不是宿主机
cache:clear 命令不清理 Redis 实际数据
这个命令只清 Laravel 缓存系统“认为该清”的键,它依赖 config/cache.php 中 stores.redis.connection 指定的连接名去操作。如果你改过连接名(比如设成 'cache'),但没同步更新 CACHE_REDIS_CONNECTION 环境变量,cache:clear 就会去连一个不存在的连接,静默失败,Redis 里的 key 一个都没动。
- 真正清 Redis 数据,用
redis-cli -h $REDIS_HOST -p $REDIS_PORT -a "$REDIS_PASSWORD" --raw keys "laravel_*"先看有哪些 key - 再用
redis-cli ... eval "return redis.call('del', unpack(redis.call('keys', ARGV[1])))" 0 "laravel_*"安全删除(带前缀的) - 更稳妥的做法是在
config/cache.php的redisstore 下加'prefix' => 'laravel_cache:',避免误删其他应用数据
remember() 存模型时属性丢失怎么办
Cache::remember() 默认序列化模型对象,但 PHP 原生 serialize() 不保存动态计算属性(如 $appends、访问器返回值)、闭包、资源句柄。读出来时看似正常,其实关键字段是空的。
- 确认
config/cache.php中redisstore 的'serialize' => true已启用(Laravel 9+ 默认开,旧版需手动加) - 不要直接
Cache::remember('user_123', 3600, fn() => User::find(123)),改用toArray():Cache::remember('user_123', 3600, fn() => User::find(123)->toArray()) - 如果必须保留模型实例行为,用
json_encode()+json_decode()显式控制结构,比原生序列化更可控、跨环境兼容性更好
最常被忽略的一点:Redis 连接失败时 Laravel 不报错,但 Cache::store('redis')->put() 会返回 false;别只测 get(),一定要测 put() 并检查返回值,这才是连接通不通的铁证。



















