[英]Designing Laravel Cache(Redis) Architecture
我正在为我的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关系,否则此方法效果很好。 例如,如果在我的情况下更新Author,则Post缓存也应更新,因为Post对Author的依赖性。 我找不到一种干净的方法来做到这一点。
有什么好的解决办法吗? 还是缓存整个响应是一个坏主意,我应该切换到缓存模型。 我真的不喜欢存储库模式增加项目的复杂程度。
因此,按照我的看法,您有两个问题:
1.您应该对此类请求使用缓存吗?
好吧,这取决于用例。
通常,您将对频繁查询使用缓存(当您需要频繁执行特定的读取操作,但写入频率不那么频繁时)。 如果不是这种情况,通常会退回到数据库。
当您针对相反的情况射击时,就会出现问题-开始缓存不频繁的查询。 这会给您的应用造成巨大损失,数据库通常是实现此目的的最佳方法。
因此,例如,在您的情况下,仅缓存最流行/最常访问的帖子并回退到其余数据库即可。
2.如何缓存具有关系的内容?
在Laravel中使用缓存标签 。 只需使用相同的标签(例如posts.postid.authorid)为您的缓存的帖子和缓存的作者添加标签,然后就可以像这样刷新该标签: Cache::tags('tagname')->flush();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.