数据库缓存是缓存查询结果,路由缓存是缓存路由注册逻辑,两者作用对象完全不同:前者针对数据库读取的数据以减少sql查询,后者针对routes/web.php等文件中的路由规则以跳过解析注册过程。

数据库缓存是缓存查询结果,路由缓存是缓存路由注册逻辑
两者作用对象完全不同:数据库缓存针对的是从数据库读取的数据(比如用户列表、文章详情),目的是减少重复 SQL 查询;路由缓存针对的是 routes/web.php 和 routes/api.php 中定义的路由规则,目的是跳过每次请求时对路由文件的解析和注册过程。
数据库缓存靠 Cache:: 类操作,路由缓存靠 artisan 命令生成 PHP 文件
数据库缓存使用 Laravel 的统一缓存接口,例如:
Cache::remember('users:all', 3600, fn() => User::with('posts')->get())- 底层可对接 Redis、Memcached、文件等驱动,配置在
config/cache.php - 键名需语义化(如
user:123)、设置合理过期时间、注意空值缓存防穿透
路由缓存则通过 Artisan 命令固化为纯 PHP 数组:
-
php artisan route:cache生成bootstrap/cache/routes.php - 该文件直接返回已编译的路由集合,绕过所有
Route::调用解析 - 不支持闭包路由(如
Route::get('/', function () { ... }))
启用后行为差异明显,开发与生产必须区分对待
数据库缓存可动态启用/跳过,适合全环境使用:
- 开发中可通过
Cache::enable()/Cache::disable()控制(需自定义逻辑) - 也可用环境变量控制驱动,例如
CACHE_DRIVER=file(本地)或redis(线上)
路由缓存则具有强约束性,仅适用于稳定路由结构的生产环境:
- 修改任何路由文件后,必须重新执行
route:cache才生效 - 开发时若开启,会导致新增路由不被识别、调试困难
- Laravel 8.x 路由缓存效率比 7.x 提升 65%,尤其在 500+ 路由项目中效果显著
常见冲突点:隐式模型绑定会干扰数据库缓存命中
这不是路由缓存的问题,但常被混淆。例如:
- 控制器方法写成
show(User $user),Laravel 会在进入方法前自动查库加载模型 - 此时再用
Cache::remember(..., fn() => User::find($user)),传入的是模型对象而非 ID,find()直接返回实例,闭包不执行真实查询 → 缓存未写入 - 正确做法是改用
show($id),显式传 ID,在闭包内调用User::find($id)
这个细节说明:数据库缓存是否生效,和你是否用了路由缓存无关,而取决于数据加载时机与方式。











