laravel缓存驱动必须通过.env中cache_driver=redis显式启用,仅改config/cache.php无效;需同步配置redis连接参数、执行config:clear与config:cache,并用cache::store('redis')->put()验证连通性。

缓存驱动必须在 .env 里配对生效
只改 config/cache.php 不起作用,Laravel 5.5 的缓存驱动由 CACHE_DRIVER 环境变量决定,它才是开关。不设这个值,哪怕 Redis 已装好、配置写得再全,Cache::get() 也默认走 file 驱动。
常见错误现象:本地开发时 Redis 连接正常,但 Cache::put('test', 'ok', 60) 写进去后查不到——其实是写到了 storage/framework/cache/ 目录下,不是 Redis。
-
.env中必须明确设置:CACHE_DRIVER=redis(生产)或CACHE_DRIVER=file(开发) - 若用 Redis,还需确认
REDIS_HOST、REDIS_PORT、REDIS_PASSWORD正确,且config/database.php中redis.default.database值与实际 Redis DB 编号一致(默认是 0) -
config/cache.php中的'default'键只是 fallback,真正生效的是.env里的CACHE_DRIVER
Cache::remember() 默认缓存 null 是个坑
直接用 Cache::remember('users', 30, function () { return DB::table('users')->first(); }),如果数据库没查到数据,返回 null,这个 null 会被原样缓存 30 分钟。之后所有请求都走缓存、直接返回 null,形成缓存穿透。
这不是 Laravel 的 bug,而是设计如此——remember 只管“执行回调 + 存结果”,不区分结果真假。
- 安全写法:显式判断查询结果,只缓存非空值:
$user = DB::table('users')->first(); return $user ? Cache::put('users', $user, 30) : null; - 或者用短时效空标记:
if (!$user = Cache::get('users')) { $user = DB::table('users')->first(); if ($user) { Cache::put('users', $user, 30); } else { Cache::put('users:miss', true, 60); } } - 读取时先检查空标记:
if (Cache::has('users:miss')) { return null; }
php artisan cache:clear 清的不是你想象的“全部”
运行 php artisan cache:clear 默认只清当前 default store,也就是 CACHE_DRIVER 指定的那个驱动下的数据。如果你同时用了 redis 和 file 两个 store,它不会清 file 的缓存。
更隐蔽的问题:Redis 驱动下,cache:clear 实际执行的是 FLUSHDB,只清当前 database(比如 database => 0),但如果你把 Session 也放在同一个 Redis DB(比如 database => 0),这一命令会把所有用户踢下线。
- 清指定 store:
php artisan cache:clear --store=redis或php artisan cache:clear --store=file - 彻底清 Redis 当前 DB:
redis-cli -h 127.0.0.1 -p 6379 -n 0 FLUSHDB(注意-n 0对应 config 中的database值) - 避免 Session 被连带清除:务必让 Session 和 Cache 使用不同 Redis DB,比如 Cache 用
database => 0,Session 用database => 1
路由缓存和配置缓存不能共存于开发环境
php artisan route:cache 和 php artisan config:cache 都会生成静态 PHP 文件(routes-v7.php 和 config.php),它们跳过原始文件解析,大幅提升性能,但也带来硬性限制:一旦缓存生成,.env 修改、配置文件增删、路由文件改动都不会实时生效。
开发阶段频繁改路由或配置时,这两个命令反而成为障碍,不是“开了就更快”,而是“开了就不能热更新”。
- 仅在部署后执行:
php artisan route:cache和php artisan config:cache应该放进 CI/CD 脚本,而不是本地开发流程 - 改了
routes/web.php后必须先php artisan route:clear,否则新路由永远不生效 -
config:cache失败常见原因:配置文件里写了闭包、调用了app()或未加载类、.env有语法错误(如漏引号、中文等号)
cache:clear 意外清掉 Session,都是线上事故高频原因。











