模型关系查询如何缓存

项目里有模型关系渴求式查询,比如:

GoodsSku::with(['image','goods','favorites' => function(Builder $query) {$query->where('user_id', auth()->id())}])->paginate();

在赶进度时,这些查询写着舒服一时,现在要加缓存,请问怎么处理能少改一些代码?

我的想法是:最好能拆分成实体的缓存和列表的缓存。我在接触 Laravel 框架之前的经验都是自己组织in查询解决N+1问题,这样就比较容易加缓存:列表缓存一般只存有序的主键,列表缓存会冗余一些数据(比如固定查询头部1000条数据的主键,之后的不走缓存),再通过主键加载不同的实体数据,这时再查实体数据的缓存或根据主键的IN条件去库里查询数据。

大家平时是怎么加缓存的哪?

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
最佳答案

这个包你值得拥有:laravel-model-caching

3年前 评论
sanders (楼主) 3年前
sanders (楼主) 3年前
sanders (楼主) 3年前
讨论数量: 6

好问题,建议用英文给 laravel 提 issue

3年前 评论

这个包你值得拥有:laravel-model-caching

3年前 评论
sanders (楼主) 3年前
sanders (楼主) 3年前
sanders (楼主) 3年前

@leslieeilsel 如果更新了数据缓存可以自动更新吗?

3年前 评论
sanders (楼主) 3年前
jamesZhao (作者) 3年前
sanders (楼主) 3年前
jamesZhao (作者) 3年前
sanders (楼主) 3年前
jamesZhao (作者) 3年前
sanders

试用了一下 laravel-model-caching 这个包还是存在较大问题的无法用于生产环境,我用 tinker 试了一下:

$group=UserTagGroup::find(1); // 模型查询生成缓存
User::with('tags', 'tags.group')->get(); // 列表查询同时生成了缓存
$group->name='groupA';
$group->save();
UserTagGroup::find(1); // 这里的结果显示缓存已经被更新
User::with('tags', 'tags.group')->get(); // 这里的查询结果显示关系模型中的缓存没有被更新
3年前 评论
leslieeilsel 3年前
sanders (作者) (楼主) 3年前

@sanders 这个包对缓存器和 Laravel 版本的要求还挺苛刻的,请务必满足这些要求再进行测试。

file

3年前 评论
sanders (楼主) 3年前
sanders (楼主) 3年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!