数据库缓存预热是主动将高频稳定查询结果提前写入Redis等高性能缓存,避免冷启动卡顿;需配置Redis驱动、编写Artisan预热命令、在查询中使用remember()自动缓存,并与数据更新联动清理。

数据库缓存预热不是“等用户来触发再加载”,而是主动把高频、稳定、计算成本高的查询结果提前塞进缓存,让首请求不卡顿、定时任务不超时、页面秒开。Laravel 10 提供了清晰的路径,关键在选对时机、写对逻辑、配对驱动。
一、确认缓存驱动并启用 Redis(推荐)
预热效果高度依赖缓存后端性能。file 或 database 驱动在并发下易成瓶颈,Redis 是生产首选:
- 确保
config/cache.php中'default' => env('CACHE_DRIVER', 'redis')已生效 - 检查
.env:`CACHE_DRIVER=redis`,且 `REDIS_CONNECTION=cache` 指向可用连接 - 运行
php artisan tinker测试:`Cache::put('test', 'ok', 60)` → `Cache::get('test')` 应返回 `'ok'`
二、编写可复用的预热命令
用 Artisan 命令集中管理预热逻辑,部署后一键执行,清晰可控:
- 生成命令:
php artisan make:command DatabaseCacheWarmup - 在
handle()方法中写入真实业务数据,例如:
Cache::put('categories', Category::all(), 3600);• 热门文章(带作用域):
Cache::put('popular_posts', Post::popular()->take(10)->get(), 1800);• 全局配置(避免反复读 config()):
Cache::put('site_settings', config(['app.name', 'mail.from']), 7200);
- 运行:
php artisan cache:warmup(需在app/Console/Kernel.php的$commands中注册)
三、给关键查询加 remember() 自动缓存
预热不是替代查询缓存,而是补足冷启动缺口。所有高频 DB 查询应自带缓存策略:
- Eloquent 查询直接链式调用:
User::where('status', 1)->remember(3600)->get(); - 复杂原生查询用
Cache::remember()封装:
Cache::remember('stats:active_users:2026Q4', 3600, fn() => DB::table('users')->whereBetween('last_login', [...])->count()); - 键名建议含业务标识(如日期、状态),便于后续按前缀批量清理
四、部署后自动触发(可选但实用)
避免人工遗漏,把预热嵌入发布流程:
- 在
AppServiceProvider@boot()中轻量检查并填充(仅当缓存为空时):
if (! Cache::has('categories')) { Cache::put('categories', Category::all(), 3600); } - 或在部署脚本末尾追加:
php artisan cache:warmup && php artisan optimize:clear - 注意:勿在
register()或耗时操作中阻塞启动;大体积预热建议走队列或独立命令
不复杂但容易忽略:预热不是一次性的,而是和数据更新联动的过程。比如分类变更后,要同步 Cache::forget('categories') 或重写入;否则缓存就变成“假数据温床”了。


















