【问题标题】:Designing Laravel Cache(Redis) Architecture设计 Laravel 缓存(Redis)架构
【发布时间】:2018-05-25 07:02:59
【问题描述】:

我正在为我的 api 设计一个缓存架构,但我遇到了 laravel 关系的问题。这就是我当前的解决方案的工作原理:

我的目标是缓存整个响应而不是缓存单个模型,因此我将 Laravel 的命名路由与实际 url 的组合用于我的缓存名称。例如:

http://api.site.com/posts/1?with=author&status=1

Route::group(['prefix' => 'posts','as' => 'Posts::'], function () {
   Route::get('/{id}', 'PostController@find')->name('find')->middleware('check_cache');
});

将在 Redis 中存储为 Api::Posts::find::http://api.site.com/posts/1?with=author&status=1 这使我能够使用 Redis 通配符 (*) 在不同级别刷新缓存。这很好用,除非响应中有 Laravel 关系。例如,如果我在我的情况下更新了作者,则由于 Post 对 Author 的依赖性,也应该更新 Post 缓存。我找不到一个干净的方法来做到这一点。

有什么好的解决办法吗?或者缓存整个响应是一个坏主意,我应该切换到缓存模型。我真的不喜欢存储库模式给项目增加的复杂程度。

【问题讨论】:

    标签: laravel caching laravel-5 redis


    【解决方案1】:

    所以,我认为你有两个问题:

    1.您应该对此类请求使用缓存吗?

    嗯,这取决于用例。

    通常情况下,您会为频繁查询使用缓存(当您需要频繁执行特定的读取操作但写入频率不高时)。如果不是这种情况,您通常会回退到 DB。

    当您针对相反的情况进行拍摄时会出现问题 - 您开始缓存不常见的查询。这会对您的应用程序造成影响,而 DB 通常是执行此操作的最佳方式。

    因此,例如,在您的情况下,仅缓存 最受欢迎/最常访问的帖子,其余的回退到数据库。

    2。如何缓存有关系的东西?

    在 Laravel 中使用 cache tags。只需使用相同的标签(例如 posts.postid.authorid)标记您的缓存帖子和缓存作者,然后您可以像这样刷新标签:Cache::tags('tagname')->flush();

    【讨论】:

    • 感谢您的回复,但关系并不总是 1 值。例如 1 个 Post 可以有 200 cmets。这是否意味着我必须创建一个类似 Post.1.2...200 的名称?
    • 它必须是一个通用标签,例如您可以选择将 cmets 和帖子的 Post.post_id 作为标签。如果有任何变化,请刷新标签,并且 cmets 和帖子都将“未缓存”。当然,缓存 cmets 可能不是一个好的解决方案,除非它们经常被访问
    猜你喜欢
    • 2015-03-10
    • 2018-01-30
    • 2014-08-16
    • 2012-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-12
    相关资源
    最近更新 更多