sec-sux-genealabs/laravel-model-caching

Eloquent 模型的自动缓存。


README

pexels-photo-325229

Laravel 模型缓存

Gitter Travis Scrutinizer Coveralls GitHub (pre-)release Packagist GitHub license

动机

我创建这个包是为了响应一个客户项目,该项目具有复杂、嵌套的表单,包含许多 <select> 元素,导致一个页面上有超过 700 次数据库查询。我需要一个可以将缓存过程从模型中抽象出来的包,同时允许我缓存自定义查询以及模型关系。这个包试图解决这些需求。

特性

  • 自动、自我无效化的关系(仅预加载)缓存。
  • 自动、自我无效化的模型查询缓存。
  • 自动使用支持它们的缓存提供程序的缓存标签(对于不支持的提供程序将清除整个缓存)。

要求

  • PHP >= 7.1.3
  • Laravel 5.4 - 5.7

可能的冲突包

任何也覆盖了 Model 类的 newEloquentModel() 方法的包都可能与此包冲突。到目前为止,这些可能包括以下

installation guide cover

安装

composer require genealabs/laravel-model-caching

配置

推荐(可选)自定义缓存存储

如果您想使用不同于您的 Laravel 应用程序默认使用的缓存存储,您可以通过在 .env 文件中将 MODEL_CACHE_STORE 环境变量设置为 config/cache.php 中配置的缓存存储名称来实现。例如

MODEL_CACHE_STORE=redis2

使用方法

为了最佳性能,建议使用可标记的缓存提供程序(redis、memcached)。虽然这是可选的,但使用非可标记的缓存提供程序将意味着每次创建、保存、更新或删除模型时都会清除整个缓存。

为了便于维护,我建议添加一个使用 CachableBaseModel 模型,然后从这个模型扩展所有其他模型。如果您不想这么做,可以直接从 CachedModel 扩展您的模型。

以下是一个 BaseModel 类的示例

<?php namespace App;

use GeneaLabs\LaravelModelCaching\Traits\Cachable;

abstract class BaseModel
{
    use Cachable;
    //
}

多个数据库连接

感谢 @dtvmedia 提出这个功能。这实际上是一个比缓存前缀更健壮的解决方案。

为多个数据库连接自动处理键的分离。这对于多租户应用程序以及使用多个数据库连接的任何应用程序都特别重要。

可选的缓存键前缀

感谢 @lucian-dragomir 提出这个功能!您可以使用缓存键前缀来为多租户应用程序保留不同的缓存条目。为此,建议将 Cachable 特性添加到基模型中,然后在其中设置缓存键前缀配置值。

请注意,在调用父方法之前包含配置设置,以便在父类中也可以使用该设置。如果您正在开发多租户应用程序,请参阅上面的说明。

以下是一个示例

<?php namespace GeneaLabs\LaravelModelCaching\Tests\Fixtures;

use GeneaLabs\LaravelModelCaching\Traits\Cachable;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;

class BaseModel extends Model
{
    use Cachable;

    public function __construct($attributes = [])
    {
        config(['laravel-model-caching.cache-prefix' => 'test-prefix']);

        parent::__construct($attributes);
    }
}

异常:用户模型

我不建议缓存用户模型,因为它是一个特殊情况,因为它扩展了 Illuminate\Foundation\Auth\User。覆盖它将破坏功能。不仅如此,缓存用户模型可能也不是一个好主意,因为您总是希望获取有关它的最新信息。

实验性:特定模型的缓存冷却期

在某些情况下,您可能希望为特定的模型添加缓存失效冷却期。例如,您可能有一个繁忙的网站,评论提交率很高,您不希望每次评论提交都使缓存无效。虽然我不一定推荐这样做,但您可以尝试实验其有效性。

它可以这样实现

(new Comment)
    ->withCacheCooldownSeconds(30)
    ->get();

禁用查询缓存

可以通过两种方法禁用模型缓存

  1. 在按查询实例中使用 ->disableCache()
  2. 在您的 .env 文件中设置 MODEL_CACHE_DISABLED=TRUE

建议:在所有您的 seeder 查询中使用选项 #1,以避免在多次重新播种时拉入缓存信息。 您可以在查询链中的任何位置使用 disableCache() 来禁用特定的查询。例如

$results = $myModel->disableCache()->where('field', $value)->get();

手动刷新特定模型

您可以使用以下 artisan 命令刷新特定模型的缓存

php artisan modelCache:clear --model=App\Model

当手动更新数据库时,这非常有用。您也可以在从 Laravel 应用外部更新数据库后触发此操作。

可能的未来改进

总结

这就是您需要做的全部内容。所有模型查询和关系现在都已缓存!

在测试中,这已将某些页面的性能优化至高达 900%!您通常应该看到大约 100% 的性能提升。

对质量的承诺

在包开发过程中,我尽可能采用良好的设计和开发实践,以确保本包尽可能好。我的包开发清单包括

  • ✅ 使用单元测试尽可能实现接近 100% 的代码覆盖率。
  • ✅ 消除 SensioLabs Insight 和 Scrutinizer 确定的任何问题。
  • ✅ 完全符合 PSR1、PSR2 和 PSR4。
  • ✅ 在 README.md 中包含全面的文档。
  • ✅ 提供最新的 CHANGELOG.md,该文件遵循 http://keepachangelog.com 中概述的格式。
  • ✅ 在所有代码中没有任何 PHPMD 或 PHPCS 警告。

贡献

请遵守和尊重所包含的《行为准则》的各个方面 https://github.com/GeneaLabs/laravel-model-caching/blob/master/CODE_OF_CONDUCT.md

报告问题

在报告问题时,请尽可能完整地填写所包含的模板。如果信息不完整,问题可能会被忽略或关闭。

提交拉取请求

请查看《贡献指南》 https://github.com/GeneaLabs/laravel-model-caching/blob/master/CONTRIBUTING.md。只有符合所有标准的 PR 才会被接受。

❤️ 开源软件 - 给 ⭐️

我们已将出色的 symfony/thanks composer 包作为开发依赖项包括在内。通过 star 您使用的包来让您的 OS 包维护者知道您感谢他们。只需在此包安装后运行 composer thanks 即可。(不用担心,由于它是开发依赖项,它不会安装到您的生产环境中。)