redis未生效主因是配置未对齐:php扩展缺失、database.php连接名/客户端不匹配、cache.php默认驱动与store未联动、env参数不可达;须逐项验证扩展、连接、序列化、前缀及命令作用域。

直接改 CACHE_DRIVER=redis 不等于 Redis 就开始工作了——90% 的缓存失效、静默返回 null、连接拒绝,都卡在配置没对齐或驱动没真正路由过去。
确认 Redis 扩展和连接配置是否真正生效
PHP 层没装扩展,Laravel 根本发不出 Redis 请求;config/database.php 里配错 connection 名,Cache 门面就找不到目标实例。
- 运行
php -m | grep redis,必须看到redis(phpredis)或无输出但composer show predis/predis有版本(predis) - 检查
config/database.php中'redis' => [ 'client' => 'phpredis' ]是否与实际扩展一致;若用 predis,此处必须是'client' => 'predis' -
config/database.php的'default'连接块中,'host'、'port'、'password'、'database'必须全部可被env()解析,且值真实可达(Docker 内访问宿主 Redis 别填127.0.0.1,改用host.docker.internal或容器名) - 执行
redis-cli -h $REDIS_HOST -p $REDIS_PORT -a "$REDIS_PASSWORD" ping,返回PONG才算通
让 Cache::get() 真正走 Redis 而不是 file 或 array
只改 .env 的 CACHE_DRIVER=redis 不够,config/cache.php 的 default 和 stores.redis.connection 也得匹配上,否则 Laravel 会 fallback 到默认的 file 驱动。
- 确保
config/cache.php中'default' => env('CACHE_DRIVER', 'redis'),且'stores' => ['redis' => [...]]存在并完整 -
stores.redis.connection值(如'default')必须与config/database.php中redis数组下的对应 key 一致 - 清配置缓存:运行
php artisan config:clear,再验证php artisan tinker --execute="dd(Cache::store('redis')->get('test'))",不报错且返回null(非异常)说明连通 - 别依赖全局
Cache::get()—— 显式写Cache::store('redis')->get('key')更可靠,避免被default意外覆盖
TTL 单位、序列化和 key 冲突这三处最容易踩坑
缓存存进去了却读不出来?可能过期时间单位错了,也可能序列化开关没开,还可能是 key 被其他服务覆盖。
-
Cache::put('x', $val, 5)的5是秒,不是分钟;Cache::remember('key', 5, fn() => ...)同理 - 若缓存 Eloquent 模型或数组,确认
config/cache.php中stores.redis.serialize为true(Laravel 9+ 默认开启),否则 phpredis 会把对象存成字符串,取出来是乱码 - 多个项目共用一个 Redis 实例时,务必在
config/cache.php的stores.redis.prefix加前缀,比如'prefix' => 'myapp_cache:',否则Cache::flush()会误删别人的数据 -
Cache::tags()在 Redis 中是模拟实现,会产生额外 key(如tags:users:ids),高并发下慎用,压测后再上线
最常被忽略的是:cache 命令(如 php artisan cache:clear)操作的是 cache 连接,而这个连接名由 config/cache.php 的 stores.redis.connection 决定——它未必等于 config/database.php 里的 default。一旦不一致,你清了半天,Redis 里 key 还在。











