gnahotelsolutions/laravel-query-cache

Laravel 6+ 的查询缓存

6.3.0 2023-05-19 08:41 UTC

This package is auto-updated.

Last update: 2024-09-19 11:40:53 UTC


README

Total Downloads Latest Stable Version Latest Unstable Version License

此包是从dwightwatson/rememberable分叉的,以便在我们公司的项目中增加灵活性。感谢您的包Dwight Watson ❤️

Laravel Query Cache 是一个为 Laravel 添加 remember() 查询方法的 Eloquent 特性。这使得缓存查询结果变得非常简单。

// Get 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.
User::first()->remember(60 * 60 * 24)->posts()->get();

它的工作原理是简单地记住所使用的 SQL 查询并存储结果。如果在缓存持续存在时尝试执行相同的查询,它将从存储中检索,而不是再次击中您的数据库。

安装

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

composer require gnahotelsolutions/laravel-query-cache

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

<?php
namespace App;

use GNAHotelSolutions\LaravelQueryCache\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();