watson/rememberable

Laravel 的查询缓存

6.2.0 2024-02-27 23:09 UTC

This package is auto-updated.

Last update: 2024-09-13 22:59:41 UTC


README

Total Downloads Latest Stable Version Latest Unstable Version License

Rememberable 是 Laravel 的一个 Eloquent 特性,它添加了 remember() 查询方法。这使得缓存查询结果变得非常简单,你可以调整缓存时间。

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

// You can also pass the number of seconds if you like (before Laravel 5.8 this will be interpreted as minutes).
User::first()->remember(60 * 60 * 24)->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 * 60)->count();

缓存标签

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

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

缓存前缀

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

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

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

缓存驱动程序

如果你想使用自定义缓存驱动程序(在 config/cache.php 中定义),可以在你的查询中添加 cacheDriver('cacheDriver')

// Remember the number of users for an hour using redis as cache driver
User::remember(60 * 60)->cacheDriver('redis')->count();

或者,你可以将 $rememberCacheDriver 属性添加到你的模型中,以始终使用该缓存驱动程序。

模型范围缓存标签

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

关系

验证通过基于查询的查询缓存来工作。这意味着当你执行预加载时,除非明确指定,否则那些额外的查询不会被缓存。你可以通过使用回调来实现这一点。

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

始终启用

你可以通过将 $rememberFor 属性设置为想要缓存结果的秒数来选择性地缓存模型的所有查询。使用此功能时请谨慎,因为如果你不熟悉它的工作方式,可能会导致应用程序中出现意外的行为和过时的数据。

缓存清除

基于包的架构,无法删除单个查询的缓存。但是,如果你使用缓存标签标记了任何查询,你可以清除该标签的缓存。

User::flushCache('user_queries');

如果你使用了 $rememberCacheTag 属性,你可以使用不带参数的方法,清除由 $rememberCacheTag 设置的标签的缓存。

User::flushCache();

跳过缓存

如果您需要禁用特定查询的缓存,可以使用 dontRemember 方法

User::latest()->dontRemember()->get();