生产环境应选phpredis(c扩展),性能比predis高3–5倍;需启用redis.so扩展、移除predis包并删除配置中client指定;验证用php -m | grep redis和redis::connection()->ping()。

Redis扩展没装,phpredis 和 predis 到底选哪个
Laravel 默认用 predis(纯 PHP 实现),但生产环境强烈建议切到 phpredis(C 扩展),性能差 3–5 倍不是夸张。装错或漏装扩展,php artisan tinker 里一调 Redis::get() 就报 Class 'Predis\Client' not found 或 Connection refused——其实根本没连上,是驱动层就崩了。
-
phpredis:需在 PHP 配置里启用extension=redis.so(Linux/macOS)或php_redis.dll(Windows),然后composer remove predis/predis,再删掉config/database.php里'redis' => ['client' => 'predis']这行(Laravel 9+ 默认自动识别) -
predis:纯 Composer 包,composer require predis/predis即可,适合开发机没权限装扩展的场景,但别在压测或高并发服务里用 - 验证是否生效:
php -m | grep redis看输出里有没有redis;Laravel 中执行Redis::connection()->ping()返回+PONG才算通
config/database.php 里的 Redis 配置项哪些不能乱改
很多人直接抄网上的配置,把 'host'、'port' 改完就以为完了,结果缓存不命中、队列卡死。关键不是连得上,而是连得“对”——Laravel 的 Redis 连接池、序列化、数据库索引都藏在这些字段里。
-
'database'不是 Redis 的 DB 编号(默认 0),而是 Laravel 内部用来区分缓存/队列/Session 的逻辑库名。比如缓存用0,队列用1,Session 用2,必须和config/cache.php、config/queue.php里对应上,否则写进去了读不出来 -
'password'如果 Redis 有密码,必须填字符串,空字符串''和null效果不同:前者会发AUTH ""命令(可能被拒绝),后者跳过认证 -
'prefix'是全局键前缀,cache.table.users最终存成myapp:cache.table.users,别设成带:的变量名,否则Redis::keys('myapp:*')会误匹配
本地用 Docker 跑 Redis,127.0.0.1 死活连不上
Laravel 容器和 Redis 容器不在同一网络下,127.0.0.1 指的是 Laravel 容器自己的回环地址,不是宿主机。常见错误是 .env 里写 REDIS_HOST=127.0.0.1,结果 docker-compose exec app php artisan tinker 里 Redis::ping() 直接超时。
- 用 Docker Compose 时,
REDIS_HOST必须填服务名,比如redis(对应docker-compose.yml里services.redis的名字) - 确保两个服务在同一个自定义网络(不要用默认
bridge),并在app服务里加depends_on: [redis]和networks: [app-network] - 测试连通性别只信
ping,进 Laravel 容器执行telnet redis 6379或nc -zv redis 6379,通了再试 PHP 层
Redis 连接偶尔超时,read_write_timeout 和 timeout 怎么设
线上偶尔报 Redis server went away 或 Connection timed out,不是网络问题,是 Laravel 默认连接参数太激进。Redis 默认响应很快,但遇到大 key、慢命令、主从同步延迟时,短超时会让请求直接失败,而不是排队等。
-
'timeout'控制建立 TCP 连接的最长时间(单位秒),设2.0太短,Docker 网络或云厂商内网抖动就断,建议5.0 -
'read_write_timeout'控制读写操作等待响应的时间,-1表示永不超时(危险),60.0是较稳妥值,尤其用在BLPOP队列消费场景 - 这两个值必须在
config/database.php的 Redis 配置块里显式声明,.env不支持直接映射,别想靠REDIS_TIMEOUT=5自动生效











