生产环境应选redis而非file,因redis支持多机部署、高频读写及原子操作,而file仅适用于单机低流量场景;需注意CACHE_DRIVER为顶层开关,CACHE_STORE用于同一驱动下不同配置。

缓存驱动选 redis 还是 file?看场景别硬套
redis 适合多机部署、高频读写、需要原子操作(比如计数器、锁);file 只适合单机开发或低流量测试,因为文件锁在并发下容易阻塞,且不支持过期时间精确清理。生产环境用 redis 或 memcached,别被 array 驱动误导——它只存在内存里,请求一结束就丢,根本不算“缓存”。
常见错误:本地开发配了 redis,但没起 Redis 服务,结果 Cache::get() 永远返回 null,还查半天逻辑。先跑 redis-cli ping 确认连得上。
CACHE_DRIVER 和 CACHE_STORE 到底谁管谁?
Laravel 8+ 开始,CACHE_DRIVER 是顶层开关,决定用哪种底层实现;CACHE_STORE 是可选的“命名存储”,用于定义同一驱动下的不同配置(比如两个 Redis 连接,一个存 session,一个存业务数据)。
实操建议:
- 90% 的项目只需配
CACHE_DRIVER=redis,不用碰CACHE_STORE - 真要用多个 store,得在
config/cache.php里手动加stores键,再通过Cache::store('xxx')调用 -
CACHE_DRIVER=file时,storage/framework/cache/data/目录必须可写,否则报failed to open stream
php artisan cache:clear 清不掉 Redis 里的键?
这个命令默认只清 Laravel 自己注册的缓存前缀(如 laravel_database_),但如果你手写 Redis::set() 或用了其他客户端直连 Redis,那些键完全不受影响。
容易踩的坑:
- 执行
php artisan cache:clear后业务还在读旧数据?检查是否混用了Cache::和Redis:: - 想清整个 Redis 实例,得用
redis-cli flushdb(当前库)或flushall(全部库),但别在生产乱跑 -
cache:forget只能删单个键,键名必须和Cache::put()时一致,大小写敏感
缓存失效不及时?重点查 TTL 设置和时钟同步
Laravel 默认用 now()->addSeconds($seconds) 算过期时间,依赖服务器本地时间。如果 PHP 所在机器和 Redis 服务器时钟差超过 TTL,就会出现“设了 60 秒,10 秒就没了”或者“明明过期了还不删”。
实操建议:
- 所有服务器统一用
ntpd或chrony同步时间,误差控制在 1 秒内 - 避免用
Cache::rememberForever(),它本质是设 TTL 为 0,在 Redis 里变成永不过期,后期难清理 - 调试时用
redis-cli ttl your:key看剩余秒数,比猜靠谱



















