redis配置不生效需检查.env与config/database.php联动:确保环境变量被正确引用、扩展已安装启用、缓存/队列驱动名匹配、连接参数(如scheme、database、prefix)按需区分,且queue_connection等关键环境变量已设置。

redis 配置不生效?检查 .env 和 config/database.php 的联动
laravel 默认不会自动启用 Redis 作为缓存或队列驱动,哪怕你装了 predis/predis 或 phpredis 扩展。核心问题在于:环境配置和底层连接配置必须对齐。
-
REDIS_HOST、REDIS_PORT、REDIS_PASSWORD在.env中设了,但config/database.php里的'redis'配置段没引用它们——Laravel 会 fallback 到默认的127.0.0.1:6379,连错实例也不报错 - 用
phpredis扩展时,config/database.php必须把'scheme' => 'tcp'改成'scheme' => 'unix'(如果走 socket),否则连接超时且错误信息只显示Connection refused - 缓存和队列共用同一套 Redis 连接,但
cache和queue配置项分别指向redis连接名,别漏改config/cache.php的'default' => 'redis'和config/queue.php的'default' => 'redis'
Cache::store(‘redis‘) 报错 class redis does not exist?确认驱动注册和扩展加载
这个错误不是 Laravel 没配好,而是 PHP 层根本没准备好 Redis 客户端。Laravel 的 redis 缓存驱动依赖底层扩展,不是纯 PHP 实现。
- 运行
php -m | grep redis,确认输出里有redis(对应 phpredis)或没输出但composer show predis/predis有结果(对应 predis) - 用了
predis就不能在config/database.php里写'client' => 'phpredis',否则 Laravel 会尝试调用不存在的类,报Class redis does not exist - Mac M1/M2 用户常见坑:用
brew install redis装了服务端,但没装pecl install redis,导致 PHP 无扩展;或者装了但php.ini没加extension=redis.so
队列任务卡在 pending 状态?检查 QUEUE_CONNECTION=redis 和 redis:work 启动方式
Redis 队列不靠轮询,而是用 BLPOP 阻塞读取,所以一旦配置不对或进程没起来,任务就永远“看不见”。
-
.env中必须明确写QUEUE_CONNECTION=redis,不能只改config/queue.php—— Laravel 优先读环境变量 - 启动队列监听必须用
php artisan queue:work --queue=redis,而不是--queue=default;如果改过config/queue.php里connections.redis.queue的值(比如设成'default'),那命令里也要同步 - Redis 默认用 DB 0 存队列,如果你在其他地方(比如缓存)也用了 DB 0,可能互相污染;建议在
config/database.php的redis.default.database设为0,而redis.cache和redis.queue分别设为1和2
缓存键名被自动加前缀,但 Cache::get('user:123') 拿不到?看 prefix 配置是否冲突
Laravel 的 Redis 缓存驱动默认会给所有键加前缀(如 laravel_database_),但这个前缀在不同场景下来源不同,容易误判。
-
config/cache.php的'prefix'只影响通过Cache::访问的键;而config/database.php中redis.default.prefix影响所有基于该连接的操作(包括队列、session) - 如果你用
Redis::get('user:123')直连,它走的是database.redis.default配置,不受cache.prefix控制,但受database.redis.default.prefix控制 - 本地开发和线上环境用了不同 Redis 实例,但
cache.prefix都是默认值laravel_database_,会导致缓存互相覆盖;建议按环境设成env('APP_ENV').'_cache_'
事情说清了就结束。Redis 集成最麻烦的从来不是代码怎么写,而是哪一层在控制前缀、哪个配置项实际生效、PHP 扩展到底有没有真正加载——这些地方一错,现象都像“缓存没生效”,但原因天差地别。