必须同时满足驱动启用、连接可达、配置固化三条件,否则Cache::get()静默返回null;需验证Redis服务与PHP扩展、固化配置、绑定专用连接并用redis-cli确认key写入。

要在Laravel项目中让缓存真正走Redis而不是继续写文件,必须同时满足驱动启用、连接可达、配置固化三个硬性条件,缺一不可;否则Cache::get()会静默返回null,连报错都不会有。
确认Redis服务已就绪并可被访问
这一步跳过就等于在没通电的插座上插电器——后续所有配置都白搭。先验证Redis进程是否运行,再确认Laravel能否连上它。
在终端进入项目根目录,执行:redis-cli -h $REDIS_HOST -p $REDIS_PORT -a "$REDIS_PASSWORD" ping。如果返回PONG,说明服务层通了;若报Connection refused,说明Redis根本没启动,或$REDIS_HOST填错了(Docker环境下绝不能写127.0.0.1)。
接着用Laravel命令行验证:运行php artisan tinker,然后输入Redis::ping()。如果抛出异常,说明PHP扩展未加载或认证失败;如果返回"PONG",证明Laravel底层通信链路已打通。
【关键前提】必须确保php-redis或predis扩展已安装且启用,否则Redis::ping()会直接报类不存在错误,连连接测试都进不去。
启用Redis缓存驱动并固化配置
环境变量只是开关,不执行清缓存命令,Laravel永远读取旧的编译后配置,CACHE_DRIVER=redis形同虚设。
第一步:打开.env文件,确保这五行存在且值合理:
CACHE_DRIVER=redisREDIS_HOST=127.0.0.1(Docker请改用容器名如redis)REDIS_PORT=6379REDIS_PASSWORD=null(若设密码,此处填真实密码)REDIS_DB=0
第二步:执行php artisan config:clear,强制删除bootstrap/cache/config.php缓存文件。
第三步:立即执行php artisan config:cache,把当前.env和配置文件重新编译固化——这一步漏掉,改一百遍.env都没用。
绑定专用Redis连接避免键冲突
默认cache和session共用database 0,缓存key和session id混在一起,轻则查不到数据,重则Cache::flush()把用户登录态全删了。
方法一:配置独立数据库分区
打开config/database.php,找到'redis' => ['connections' => [...]]部分,在connections数组里新增一个cache连接块:
'cache' => [ 'host' => env('REDIS_HOST', '127.0.0.1'), 'password' => env('REDIS_PASSWORD'), 'port' => env('REDIS_PORT', 6379), 'database' => env('REDIS_CACHE_DB', 1),],
然后打开config/cache.php,定位到'stores' => ['redis' => [...]],把其中'connection' => 'default'改为'connection' => 'cache'。
最后在.env中追加REDIS_CACHE_DB=1,确保与代码中database值严格一致。
方法二:直接强制调用Redis store(适合调试或临时绕过default配置)
在控制器或tinker中,不用Cache::get(),改用:Cache::store('redis')->put('test_key', 'alive', 60);读取时同样写Cache::store('redis')->get('test_key')。这样完全跳过config/cache.php里的default设置,百分百走Redis。
验证缓存是否真实生效
别信配置文件,只信Redis里有没有东西。最直接的办法是用命令行查key。
执行Cache::store('redis')->put('verify_redis', 'hit', 30)(在tinker里)。
立刻切换到终端,运行redis-cli -h $REDIS_HOST -p $REDIS_PORT -a "$REDIS_PASSWORD"进入交互模式,再输入keys *verify*——如果返回1) "laravel_database_verify_redis",说明缓存已写入;若为空,说明前面某步断在了驱动、连接或配置固化环节。
【易错点】直接用get verify_redis查不到,因为Laravel默认给所有key加了laravel_database_前缀,且值是PHP序列化后的二进制,肉眼不可读。


















