因为Laravel从config/database.php的redis.default数组读连接参数,而非直接读.env;必须确保该数组中host、port等均调用env()函数,且执行config:clear刷新缓存,再通过Cache::store('redis')->put/get验证连通性。

为什么改了 .env 里的 REDIS_HOST 还连不上远程 Redis?
不是环境变量没生效,而是 Laravel 启动时从 config/database.php 的 redis.default 数组里读连接参数,env() 只是被调用一次——如果那里写死了 'host' => '127.0.0.1',改 .env 没用。
必须同时满足三件事:
-
config/database.php中'redis' => ['default' => ['host' => env('REDIS_HOST', '127.0.0.1'), 'port' => env('REDIS_PORT', 6379), 'password' => env('REDIS_PASSWORD', null), 'database' => 0]] -
config/cache.php中'stores.redis.connection'值为'default'(不能是'cache'或其他未定义的 key) - 执行
php artisan config:clear,否则旧配置仍被缓存
验证方式:进 php artisan tinker,运行 Cache::store('redis')->put('test', 'ok', 10),再 Cache::store('redis')->get('test') 返回 'ok' 才算通。
Cache::remember() 缓存不更新,是 TTL 设置太长还是逻辑错了?
根本不是 TTL 的问题。TTL 控制的是“最多保留多久”,但业务要求是“数据一改就失效”。靠等过期等于放弃一致性。
正确做法是主动失效:
- 在模型事件里触发清除:
User::updated(function ($user) { Cache::forget('user_'.$user->id); }); - 如果用了缓存标签:
Cache::tags(['users'])->flush(),但注意:只有redis驱动支持标签,redis-cluster不支持 - 别用
php artisan cache:clear清全库——它只清当前stores.redis.connection对应的 DB,不是FLUSHALL
顺便提醒:Cache::remember() 写入和 Cache::get() 读取必须走同一套序列化逻辑。如果服务器装了 phpredis 扩展(默认用 igbinary),而本地用 predis(默认用 serialize()),就会始终返回 null。运行 php --ri redis 看是否加载了扩展。
单机 Redis 该选 redis 还是 redis-cluster 驱动?
除非你明确部署了 Redis Cluster(至少 3 主 3 从 + cluster-enabled yes),否则一律用 redis 驱动。
redis-cluster 是个陷阱:
- 它绕过 Laravel 的键哈希逻辑,交由客户端分片,但代价是不支持
Cache::tags()、Cache::lock()和所有SCAN类命令 - 单机或主从场景下,性能比
redis驱动慢 15%~20%,因为多了集群路由判断 - 检查方法:看
config/cache.php里'default' => 'redis',再用redis-cli -h your-host info | grep role确认输出是role:master而非cluster_enabled:1
缓存、Session、队列共用一个 Redis DB 会出什么问题?
会互相污染。比如执行 php artisan cache:clear,实际是 FLUSHDB,结果用户 Session 全掉线;或者队列任务堆积把缓存内存挤爆。
必须分库:
- 在
.env里定义不同 DB:REDIS_CACHE_DB=1、REDIS_QUEUE_DB=2、REDIS_SESSION_DB=3 - 在
config/database.php的redis数组里加独立连接:'cache' => ['database' => env('REDIS_CACHE_DB', 1)]、'queue' => ['database' => env('REDIS_QUEUE_DB', 2)] - 对应修改
config/cache.php中'stores.redis.connection'为'cache',config/queue.php中'redis.queue'指向'queue'
缓存键也得加前缀,比如 prod:users:123,不然测试服和线上共用 Redis 时会覆盖彼此数据。



















