我为我的api设计了一个缓存架构,而且我遇到了laravel关系问题。这就是我目前的解决方案的工作原理:
我的目标是缓存整个响应,而不是缓存单个模型,因此我使用Laravel的命名路由作为我的缓存名称与实际url的组合。例如:
Route::group(['prefix' => 'posts','as' => 'Posts::'], function () {
Route::get('/{id}', 'PostController@find')->name('find')->middleware('check_cache');
});
将以Api::Posts::find::http://api.site.com/posts/1?with=author&status=1
的形式存储在Redis中
这使我能够使用Redis通配符(*)在不同级别上刷新缓存。这种方法很有效,除非响应中有Laravel关系。例如,如果我在我的情况下更新作者,由于Post on Author的依赖性,也应该更新Post缓存。我无法找到一个干净的方法来做到这一点。
这有什么好的解决方案吗?或者缓存整个响应是一个坏主意,我应该切换到缓存模型。我真的不喜欢存储库模式为项目添加的复杂程度。
答案 0 :(得分:0)
所以,我认为你有两个问题:
<强> 1。您是否应该对此类请求使用缓存?
嗯,这取决于用例。
通常,您会使用缓存进行频繁查询(当您需要经常执行特定的读取操作但不经常写入时)。如果不是这种情况,通常会回退到DB。
当您针对相反的情况进行拍摄时会出现问题 - 您开始缓存不常见的查询。这会对你的应用程序产生影响,数据库通常是最好的方法。
因此,例如,在你的情况下,缓存它可能是有意义的 最受欢迎/经常访问的帖子以及其余的数据库后备。
<强> 2。如何使用关系缓存内容?
在Laravel中使用cache tags。只需使用相同的标记(例如posts.postid.authorid)标记缓存的帖子和缓存的作者,然后就可以像这样刷新标记:Cache::tags('tagname')->flush();