Laravel 8 Sail环境下Redis作为默认缓存驱动,Cache类写入数据无法在Redis客户端查看的问题
我之前也碰到过一模一样的情况,这其实是Laravel的Cache组件和Redis门面在操作Redis时的几个默认行为差异导致的,下面给你拆解具体原因和解决办法:
1. 键名被自动添加了前缀
Laravel的Cache系统默认会给所有存储的键加上前缀,默认值是laravel_cache:。也就是说,当你执行Cache::put('bar2', 'baz', 100)时,Redis里实际存储的键是laravel_cache:bar2,而不是你传入的bar2。
验证和解决:
- 直接在redis-cli里执行
KEYS laravel_cache:*,就能看到用Cache门面存储的所有键 - 你也可以打开
config/cache.php查看prefix配置项,它默认读取env('CACHE_PREFIX', 'laravel_cache'),可以自定义前缀或者查询时带上这个前缀
2. 使用了不同的Redis数据库
Laravel默认会给Cache组件分配单独的Redis数据库,而Redis门面默认用的是default连接的数据库。
打开config/database.php看Redis配置,你会看到类似这样的结构:
'redis' => [ 'client' => env('REDIS_CLIENT', 'phpredis'), 'default' => [ 'host' => env('REDIS_HOST', '127.0.0.1'), 'password' => env('REDIS_PASSWORD', null), 'port' => env('REDIS_PORT', '6379'), 'database' => env('REDIS_DB', '0'), ], 'cache' => [ 'host' => env('REDIS_HOST', '127.0.0.1'), 'password' => env('REDIS_PASSWORD', null), 'port' => env('REDIS_PORT', '6379'), 'database' => env('REDIS_CACHE_DB', '1'), ], ],
这里cache连接用的是数据库1,而default连接用的是数据库0。你用Redis门面操作的是db0,Cache门面操作的是db1,自然在默认数据库里找不到。
解决办法:
- 在redis-cli里执行
SELECT 1切换到数据库1,再执行KEYS *就能看到Cache存储的键了 - 也可以修改
config/database.php里cache连接的database值,让它和default一致,但不推荐,分开数据库能避免键名冲突
3. 数据被序列化处理了
Laravel的Cache组件默认会对存储的数据做序列化(默认用PHP的serialize函数),所以即使你找到了对应的键,用GET laravel_cache:bar2得到的是序列化后的字符串,不是原始的baz。
如果想在redis-cli直接看原始内容,可以修改config/cache.php里的序列化配置:
'stores' => [ 'redis' => [ 'driver' => 'redis', 'connection' => 'cache', 'serializer' => 'none', // 改成none就不会序列化数据 ], ],
注意:这个设置只适合存储简单字符串,存储对象、数组这类复杂数据时会出问题,因为Redis只能存字符串。
快速验证小技巧
你可以在Laravel里执行这段代码,直接拿到Redis里实际的键名:
Cache::put('bar2', 'baz', 100); // 打印Cache生成的实际键名 dd(Cache::getStore()->getPrefix() . 'bar2');
拿着这个结果去对应的Redis数据库里查询,肯定能找到数据。
内容的提问来源于stack exchange,提问作者bito_

