高并发写多读少选redis,少量配置且无redis可用database但需加key唯一索引;config:cache仅缓存config数组,不涉及驱动配置;cache_driver变更需重启fpm或队列worker;file驱动禁用于生产;cache::get与config()互不相通。

缓存驱动选 redis 还是 database?看并发和一致性要求
高并发写多读少的场景下,redis 是更稳妥的选择;如果只是缓存少量配置(比如后台开关、版本号),且项目已用 MySQL 且没上 Redis,database 驱动也能跑,但要注意它默认用 cache 表 + 全表锁查询,压测时容易卡住。
-
redis驱动支持原子操作、过期自动清理、无锁读写,Laravel 的Cache::remember在它上面表现稳定 -
database驱动底层调用DB::table('cache')->where(...)->first(),没有索引的话查key字段会全表扫描 - 若坚持用
database,务必给cache表的key字段加唯一索引:ALTER TABLE cache ADD UNIQUE KEY key_unique (`key`)
config:cache 命令到底缓存了什么?
它只把 config/*.php 文件里 return 的数组合并成一个 PHP 文件(bootstrap/cache/config.php),不碰任何缓存驱动配置本身。也就是说,CACHE_DRIVER=redis 这个环境变量或 .env 设置,是在运行时才被读取的,跟 config:cache 无关。
- 执行
php artisan config:cache后,所有config()调用都从那个静态 PHP 数组里取值,不再 require 每个 config 文件 - 但
Cache::get()、Cache::put()这些依然走你当前配置的驱动(由CACHE_DRIVER决定) - 改了
.env里的CACHE_DRIVER,必须重启 FPM 或队列 worker 才生效,光清 config 缓存没用
本地开发用 file 驱动,上线切 redis 为什么还报错?
常见原因是 config/cache.php 里写了死配置,比如 'redis' => ['connection' => 'default'],但线上 Redis 连接名其实是 cache,或者 .env 里漏配了 REDIS_HOST。
- 检查
config/cache.php中stores.redis.connection的值是否匹配config/database.php里redis.clients下的真实连接名 - 运行
php artisan tinker,输入Cache::store('redis')->get('test')看是否连得上,比看日志更快定位连接问题 -
file驱动在 Windows 和某些 NFS 挂载路径下会出现权限/锁异常,别在生产环境用它
缓存配置键名冲突:为什么 Cache::get('app.name') 返回 null?
Laravel 的配置缓存机制和应用缓存是两套体系。config('app.name') 读的是 config:cache 生成的 PHP 数组,而 Cache::get('app.name') 是往你选的缓存驱动里查一个叫 app.name 的 key —— 它们完全不互通。
- 不要指望
config:cache会让Cache::get()自动命中配置项 - 如果真要缓存某个配置值,显式地
Cache::put('my_app_name', config('app.name'), 3600) - 避免用点号命名缓存 key,比如
user.123.profile,某些驱动(如memcached)对点号敏感,可能解析失败
最常被忽略的一点:缓存驱动切换后,旧缓存不会自动清空。Redis 里还留着上周的 view 缓存,新配置却指向 database,这时候查不到数据不是配置错了,而是根本没查对地方。











