testingap/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

建议:在所有您的种子查询中使用选项 #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 中包含全面的文档。
  • ✅ 提供符合 http://keepachangelog.com 中概述格式的最新 CHANGELOG.md。
  • ✅ 在所有代码中没有任何 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 包作为一个开发依赖项包含在内。通过给使用您的包的 OS 包维护者打星来告诉他们您很感激他们。只需在安装此包后运行 composer thanks 即可。(而且不用担心,因为它是一个开发依赖项,所以它不会安装到您的实时环境中。)