opgginc/rememberable

针对 Laravel 5 和 jenssegers 的 MongoDB ORM 的查询缓存

3.2.1.0 2022-06-13 10:13 UTC

README

这是针对 jenssegers 的 MongoDB ORM 的 rememberable 的分支版本。

Rememberable,Laravel 5 查询缓存

Rememberable 是 Laravel 5.0+ 的 Eloquent 特性,它恢复了 Laravel 4.2 中的 remember() 查询函数。这使得缓存查询结果变得非常容易。

// Get a the first user's posts and remember them for a day.
User::first()->remember(1440)->posts()->get();

它是通过记住所使用的 SQL 查询并存储结果来工作的。如果在缓存持续存在的情况下尝试执行相同的查询,它将直接从存储中检索,而不是再次击中数据库。

安装

使用 Composer 安装,就像安装其他任何东西一样。

composer require watson/rememberable

要开始使用 Eloquent,最简单的方法是创建一个抽象的 App\Model,您可以从它扩展应用程序模型。在这个基本模型中,您可以导入 rememberable 特性,这将扩展相同的缓存功能到您从模型构建的任何查询。

<?php
namespace App;

use Watson\Rememberable\Rememberable;
use Illuminate\Database\Eloquent\Model as Eloquent;

abstract class Model extends Eloquent
{
    use Rememberable;
}

现在,只需确保您使用新的 App\Model 而不是 Eloquent 的应用程序模型。

<?php
namespace App;

class Post extends Model
{
    //
}

或者,您可以直接将特性应用于您想要使用 remember() 的每个模型。

用法

使用 remember 方法非常简单。只需传递您想要将查询结果存储在缓存中的分钟数,在这个时间段内,相同的查询将再次从缓存中提取,而不是再次从数据库中提取。

// Remember the number of users for an hour.
$users = User::remember(60)->count();

缓存标签

如果您想对某些查询进行标记,可以在查询中添加 cacheTags('tag_name')。请注意,不是所有的缓存驱动程序都支持缓存标签。

// Remember the number of users for an hour and tag it with 'user_queries'
User::remember(60)->cacheTags('user_queries')->count();

缓存前缀

如果您想在每个查询的缓存键上添加一个唯一的前缀(例如,如果您的缓存不支持标记),可以在查询中添加 prefix('prefix')

// Remember the number of users for an hour and prefix the key with 'users'
User::remember(60)->prefix('users')->count();

或者,您可以将 ``$rememberCachePrefix` 属性添加到您的模型中,以始终使用该缓存前缀。

模型范围缓存标签

您可以通过设置 $rememberCacheTag 属性,使用一个唯一的字符串来标记查询,为所有模型的查询设置一个缓存标签。

关系

验证通过按查询缓存查询来工作。这意味着当您执行预加载时,除非显式指定,否则不会缓存额外的查询。您可以通过使用回调来执行此操作。

$users = User::where("id", ">", "1")
    ->with(['posts' => function ($q) { $q->remember(10); }])
    ->remember(10)
    ->take(5)
    ->get();

始终启用

您可以通过设置 $rememberFor 属性,使用您想要缓存结果的分钟数来选择缓存一个模型的全部查询。在您熟悉其工作原理之前,请谨慎使用此功能,因为它可能导致意外的行为和应用程序中的过时数据。

缓存刷新

根据该软件包的架构,无法删除单个查询的缓存。但如果您使用缓存标签标记了任何查询,则可以刷新该标签的缓存。

User::flushCache('user_queries');

如果您使用了 $rememberCacheTag 属性,则可以使用不带参数的方法,并刷新由 $rememberCacheTag 设置的标签缓存。

User::flushCache();