Laravel怎么集成Redis_Laravel缓存与队列教程【加速】

2次阅读

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

Laravel怎么集成Redis_Laravel缓存与队列教程【加速】

redis 配置不生效?检查 .envconfig/database.php 的联动

laravel 默认不会自动启用 Redis 作为缓存或队列驱动,哪怕你装了 predis/predisphpredis 扩展。核心问题在于:环境配置和底层连接配置必须对齐。

  • REDIS_HOSTREDIS_PORTREDIS_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 连接,但 cachequeue 配置项分别指向 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=redisredis:work 启动方式

Redis 队列不靠轮询,而是用 BLPOP 阻塞读取,所以一旦配置不对或进程没起来,任务就永远“看不见”。

  • .env 中必须明确写 QUEUE_CONNECTION=redis,不能只改 config/queue.php —— Laravel 优先读环境变量
  • 启动队列监听必须用 php artisan queue:work --queue=redis,而不是 --queue=default;如果改过 config/queue.phpconnections.redis.queue 的值(比如设成 'default'),那命令里也要同步
  • Redis 默认用 DB 0 存队列,如果你在其他地方(比如缓存)也用了 DB 0,可能互相污染;建议在 config/database.phpredis.default.database 设为 0,而 redis.cacheredis.queue 分别设为 12

缓存键名被自动加前缀,但 Cache::get('user:123') 拿不到?看 prefix 配置是否冲突

Laravel 的 Redis 缓存驱动默认会给所有键加前缀(如 laravel_database_),但这个前缀在不同场景下来源不同,容易误判。

  • config/cache.php'prefix' 只影响通过 Cache:: 访问的键;而 config/database.phpredis.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 扩展到底有没有真正加载——这些地方一错,现象都像“缓存没生效”,但原因天差地别。

text=ZqhQzanResources