Laravel如何高效配置与使用数据库查询缓存技巧分享?
- 内容介绍
- 文章标签
- 相关推荐
本文共计897个文字,预计阅读时间需要4分钟。
直接输出结论:
为什么 remember() 缓存的是结果,不是 SQL 语句?
很多人误以为 remember() 是给 where() 或 orderBy() 这些构建器“记住了 SQL 模板”,其实不是。它只在调用 get()、first()、count() 等终端方法时,把最终返回的数组或模型对象序列化后存进缓存。
-
Post::where('status', $status)->remember(3600)->get()—— 缓存的是get()返回的那批Post实例(含关联时也一并序列化) -
toSql()看到的只是占位符(如where status = ?),但 Laravel 生成缓存键时已把$status的真实值代入,所以$status = 'draft'和$status = 'published'是两个完全不同的缓存键 - 中间链式调用(如
with('author'))会影响结果结构,也会改变缓存键——因为 SQL 和绑定参数都变了
缓存失效必须手动处理,Laravel 不监听模型变更
这是线上最常踩的坑:数据明明更新了,页面还是旧内容。
本文共计897个文字,预计阅读时间需要4分钟。
直接输出结论:
为什么 remember() 缓存的是结果,不是 SQL 语句?
很多人误以为 remember() 是给 where() 或 orderBy() 这些构建器“记住了 SQL 模板”,其实不是。它只在调用 get()、first()、count() 等终端方法时,把最终返回的数组或模型对象序列化后存进缓存。
-
Post::where('status', $status)->remember(3600)->get()—— 缓存的是get()返回的那批Post实例(含关联时也一并序列化) -
toSql()看到的只是占位符(如where status = ?),但 Laravel 生成缓存键时已把$status的真实值代入,所以$status = 'draft'和$status = 'published'是两个完全不同的缓存键 - 中间链式调用(如
with('author'))会影响结果结构,也会改变缓存键——因为 SQL 和绑定参数都变了
缓存失效必须手动处理,Laravel 不监听模型变更
这是线上最常踩的坑:数据明明更新了,页面还是旧内容。

