生产环境必须用Redis缓存驱动,需三步确认:config/database.php中存在正确参数的'cache'连接、config/cache.php中'redis'的connection设为'cache'、redis-cli ping验证服务可达;仅改CACHE_DRIVER=redis无效。

生产环境必须用 redis,别碰 file 或 array 驱动——前者并发锁死,后者请求一结束就丢,根本不算缓存。
怎么配 Redis 缓存驱动?
不是只改 CACHE_DRIVER=redis 就完事。你得确认三件事:
-
config/database.php里redis配置块中'cache'连接存在且参数正确(host、port、password、database) -
config/cache.php的'stores.redis.connection'值设为'cache'(不是'default') - 运行
redis-cli -h your-host -p 6379 ping确认服务可达;连不上时Cache::get()永远返回null,不是代码问题
示例关键配置片段:
/* .env */ CACHE_DRIVER=redis REDIS_HOST=127.0.0.1 REDIS_PORT=6379 REDIS_PASSWORD=null REDIS_DB=1
/* config/database.php 中 redis 部分 */
'redis' => [
'cache' => [
'url' => env('REDIS_URL'),
'host' => env('REDIS_HOST', '127.0.0.1'),
'password' => env('REDIS_PASSWORD', null),
'port' => env('REDIS_PORT', 6379),
'database' => env('REDIS_DB', 1),
],
],为什么 php artisan cache:clear 不起作用?
这个命令只清 Laravel 自己管理的键(带 laravel_database_ 前缀),如果你直接用 Redis::set()、Predis\Client 或其他客户端写入的键,它完全看不见。
- 想清整个 Redis 库:用
redis-cli -n 1 flushdb(注意-n指定 database) - 想清全部库(慎用):
redis-cli flushall - 混用
Cache::和Redis::是最常见误操作——缓存失效后查半天逻辑,结果是两套键名体系在打架 -
cache:forget只删单个键,键名大小写敏感,且必须和Cache::put()时完全一致
缓存过期时间不准,有时秒没就没了?
Laravel 默认用 PHP 本地时间算 TTL,Redis 用自己服务器时间判断过期。两边时钟不同步超过 TTL 值,就会出现“设了 60 秒,10 秒就失效”或“明明过期还不删”。
- 所有服务器(PHP 所在机 + Redis 服务器)必须统一用
chrony或ntpd同步时间,误差压到 1 秒内 - 避免用
Cache::rememberForever()——它本质是 TTL=0,在 Redis 里变成永不过期,后期难定位难清理 - 调试时直接跑
redis-cli ttl your:key看剩余秒数,比猜靠谱
路由缓存和配置缓存能一起开吗?
能,但顺序不能错:必须先 php artisan config:cache,再 php artisan route:cache。因为 route:cache 会 require 路由文件,而这些文件里可能调用 config() ——如果配置还没缓存,它读的就是原始 config/*.php,导致缓存内容和实际运行不一致。
-
route:cache只认routes/web.php和routes/api.php顶层静态定义的路由,闭包、Route::fallback()、中间件里动态注册的全被跳过 - 生成的
bootstrap/cache/routes-v7.php是 PHP 文件,web server 进程必须有读权限 - 部署时务必确保
git pull或rsync完成后再执行缓存命令,否则缓存的是旧代码的路由
缓存不是开关一开就自动变快——驱动选错、键名混乱、时间不同步、多客户端混用,任何一个点都可能让缓存从加速器变成故障放大器。


















