美文网首页
如何在 Laravel 6 中缓存数据库查询结果?

如何在 Laravel 6 中缓存数据库查询结果?

作者: summerbluet | 来源:发表于2019-12-09 15:43 被阅读0次
    Laravel

    文章转发自专业的Laravel开发者社区,原始链接:https://learnku.com/laravel/t/37712

    在加快应用程序速度方面,缓存可能是最有效的。Laravel 预先安装了缓存驱动程序。因此你可以直接使用 Redis, Memcached 或者使用本地文件进行缓存操作。Laravel 附带了此功能。

    这一次,我们将讨论直接从模型缓存 Eloquent 查询,从而使数据库缓存变的轻而易举。


    这个包可以在 GitHub 找到,此文档将介绍该应用程序的所有要点。但是,这篇文章,我仅仅介绍缓存和清除缓存的知识。

    安装

    可以通过 Composer 安装

    $ composer require rennokki/laravel-eloquent-query-cache
    

    在你的模型中添加 use QueryCacheable :

    use Rennokki\QueryCache\Traits\QueryCacheable;class Article extends Model
    {
        use QueryCacheable;    ...
    }
    

    默认情况下启动缓存行为

    默认情况下,该包不开启查询缓存。为此,可以在模型中添加 $cacheFor 变量。

    use Rennokki\QueryCache\Traits\QueryCacheable;class Article extends Model
    {
        use QueryCacheable;    protected $cacheFor = 180; // 3 minutes
    }
    

    每当执行一个查询时,缓存将会干预。如果此查询在缓存中为空,那么会去数据库中获取数据,并且缓存它,以便下次可以从缓存中获取。如果此查询存在于缓存中,那么直接返回。

    // 数据库访问,查询结果存储在缓存中
    Article::latest()->get();// 未访问数据库,查询结果直接从缓存中返回。
    Article::latest()->get();
    

    如果你只是想要避免命中缓存,你可以在命中最后一个方法之前使用 ->dontCache()

    Article::latest()->dontCache()->firstOrFail();
    

    启用逐个查询的缓存行为

    另一种方法是,如果默认情况下的缓存机制并不是太好的选择,你可以启用逐个查询的缓存。

    首先,从模型中移除变量 $cacheFor

    对于每个查询,你可以调用 ->cacheFor(...) 方法去指定你想缓存的那个查询。

    Article::cacheFor(now()->addHours(24))->paginate(15);
    

    用 tags 更好地组织缓存

    一些缓存存储,像 Redis 或者 Memcached,提供了对 key 的标记支持。这很有用,因为我们可以在缓存中标记查询,并在需要时再通过 tag 使所需的缓存失效。
    举一个简单的例子,如果我们要在更新一篇文章时使文章列表不进行缓存,你可以像这样写。

    $articles = Article::cacheFor(60)->cacheTags(['latest:articles'])->latest()->get();
    $article = Article::find($id);
    $article->update(['title' => 'My new title']);
    Article::flushQueryCache(['latest:articles']);
    

    flushQueryCache方法使用 latest:articles标记使缓存无效。如果其他的一些查询中没有被 latest:articles标记,那么将被保留缓存。

    了解更多

    有关此软件包的更多信息,请在 GitHub 上查看该项目。

    相关文章

      网友评论

          本文标题:如何在 Laravel 6 中缓存数据库查询结果?

          本文链接:https://www.haomeiwen.com/subject/sxabgctx.html