Redis服务是否已启动并可被Laravel访问?需先验证Redis进程运行及网络连通性,再确认.env中CACHE_DRIVER=redis等配置正确、config/cache.php匹配,最后清理配置缓存并检查实际驱动是否为redis。

Redis 服务是否已启动并可被 Laravel 访问
很多“连接失败”其实不是 Laravel 配置问题,而是 Redis 服务根本没跑起来,或 Laravel 所在环境(比如 Docker 容器、Homestead、云服务器)连不到 127.0.0.1:6379。先确认基础连通性:
- 在 Laravel 项目根目录运行:
php artisan tinker >>> Redis::ping()
,若报错Connection refused,说明 Redis 进程未运行或端口被占 - 用命令行直连测试:
redis-cli -h 127.0.0.1 -p 6379 ping
,返回PONG才算通 - Docker 环境下,Laravel 容器不能用
127.0.0.1访问宿主机 Redis;应改用宿主机 IP(如172.17.0.1)或 Docker 网络别名(如redis)
如何正确配置 .env 和 cache.php
Laravel 的 Redis 缓存依赖两个地方:环境变量控制连接参数,config/cache.php 控制驱动与默认 store。常见错误是只改了 .env 却忘了 CACHE_DRIVER=redis,或误以为改了 REDIS_HOST 就自动生效。
-
.env中必须包含以下几项(按需调整值):REDIS_HOST=127.0.0.1 REDIS_PASSWORD=null REDIS_PORT=6379 REDIS_DB=0 CACHE_DRIVER=redis
-
config/cache.php中的'default' => 'redis'必须匹配'stores.redis'配置段;若使用哨兵或集群,需额外配置'options' => ['cluster' => 'redis']并改写redisstore 的'client'为predis或phpredis - 修改
.env后务必清缓存:php artisan config:clear
,否则旧配置仍被加载
为什么 Cache::get() 返回 null,但 Redis CLI 能查到 key
这通常不是连接问题,而是 Laravel 默认给所有缓存 key 加了前缀(laravel_database_),且使用了序列化协议。直接用 redis-cli get xxx 查不到,是因为 key 名不一致,且值是 PHP 序列化后的二进制数据。
- 查看真实 key:在
tinker中执行Cache::store('redis')->get('my_key'),再用redis-cli keys "*my_key*"搜索带前缀的 key - 避免混淆:开发时可在
config/database.php的redis.default.prefix设为空字符串(''),但生产环境不建议 - 如果用
phpredis扩展,注意它默认不支持unserialize,需在redisstore 配置中显式设置'options' => ['serializer' => 'php']
如何验证 Redis 缓存是否真正生效
光看 Cache::put() 不报错不代表写入成功;要确认读写路径走的是 Redis,而不是 fallback 到 file 或 array 驱动。
- 临时加日志:在
config/cache.php的redisstore 中加入'connection' => 'default',然后在tinker中运行:Cache::store('redis')->put('test_key', 'test_value', 60); Cache::store('redis')->get('test_key');,同时用redis-cli monitor观察是否有SET和GET命令发出 - 检查实际使用的驱动:
Cache::getStore()->getDriverName()
应返回redis,而非file或array - 留意
phpinfo()中是否启用了redis或phpredis扩展;仅安装predis/predisComposer 包不够,某些操作(如 pipeline、Lua 脚本)仍需原生扩展支持










