genealabsaraf/laravel-model-caching

Eloquent 模型的自动缓存。

dev-master 2024-05-11 19:03 UTC

This package is auto-updated.

Last update: 2024-09-11 19:54:19 UTC


README

Laravel Package Scrutinizer BCH Compliance Coveralls GitHub (pre-)release Packagist GitHub license

Model Caching for Laravel masthead image

支持此包

这是一个 MIT 许可的开源项目,其持续发展得益于社区的赞助。如果您想支持这个项目,以及我们的其他包,请考虑成为赞助商

感谢以下赞助商的慷慨,请花点时间了解他们

Impetus

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

特性

  • 自动、自我验证的关系(仅懒加载)缓存。
  • 自动、自我验证的模型查询缓存。
  • 对于支持缓存标签的缓存提供者,自动使用缓存标签(对于不支持标签的提供者将清空整个缓存)。

缓存驱动器

此包最适合可标签化的缓存驱动器。

+ Redis
+ MemCached
+ APC
+ Array

它不能与非标签化驱动器一起使用。

- Database
- File
- DynamoDB

要求

  • PHP 7.3+
  • Laravel 8.0+
    - Please note that prior Laravel versions are not supported and the package
    - versions that are compatible with prior versions of Laravel contain bugs.
    - Please only use with the versions of Laravel noted above to be compatible.

可能的包冲突

任何覆盖 newEloquentModel() 的包都可能与这个包冲突。当然,任何实现了自己的 Querybuilder 类的包实际上绕过了这个包,使其不兼容。

以下是我们已识别出冲突的包:

目前不起作用的功能

以下项目目前不能与这个包一起使用

- caching of lazy-loaded relationships, see #127. Currently lazy-loaded belongs-to relationships are cached. Caching of other relationships is in the works.
- using select() clauses in Eloquent queries, see #238 (work-around discussed in the issue)
- using transactions. If you are using transactions, you will likely have to manually flush the cache, see [issue #305](https://github.com/GeneaLabs/laravel-model-caching/issues/305).

installation guide cover

安装

确保在需要时不要指定此包的特定版本

composer require genealabs/laravel-model-caching

使用 Lumen 时的注意事项

以下步骤需要您自己解决并在您的 Lumen 应用程序中实现。搜索如何做到这一点提供了多种方法。

  1. 将包注册到 Lumen 中
    $app->register(GeneaLabs\LaravelModelCaching\Providers\Service::class);
  2. 确保您的 Lumen 应用程序可以加载配置文件。
  3. 将此包的配置文件发布到您的应用程序从那里加载配置文件的位置。

升级说明

0.6.0

禁用此包的环境变量和配置变量已更改。

  • 如果您已发布配置文件,请再次发布并相应调整。

    php artisan modelCache:publish --config
  • 如果您已在 .env 文件中禁用了该包,请将条目从 MODEL_CACHE_DISABLED=true 更改为 MODEL_CACHE_ENABLED=false

0.5.0

以下实现已更改(请参阅以下各部分)

  • 特定模型的缓存前缀

配置

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

如果您想使用与 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;

    protected $cachePrefix = "test-prefix";
}

缓存前缀也可以在配置中设置,以便对所有缓存模型使用前缀

    'cache-prefix' => 'test-prefix',

异常:用户模型

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

实验性:在特定模型中添加缓存冷却期

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

要使用它,必须在模型中启用(或如果要在多个或所有模型中使用,则在基础模型中启用)

class MyModel extends Model
{
    use Cachable;

    protected $cacheCooldownSeconds = 300; // 5 minutes

    // ...
}

然后它可以在查询中实现

(new Comment)
    ->withCacheCooldownSeconds(30) // override default cooldown seconds in model
    ->get();

(new Comment)
    ->withCacheCooldownSeconds() // use default cooldown seconds in model
    ->get();

禁用查询缓存

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

  1. 在按查询实例中使用->disableCache()
  2. .env文件中设置MODEL_CACHE_ENABLED=false
  3. 如果您只需要禁用代码块或非Eloquent查询的缓存,这可能是更好的选择
    $result = app("model-cache")->runDisabled(function () {
        return (new MyModel)->get(); // or any other stuff you need to run with model-caching disabled
    });

建议:在所有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,该文件符合在https://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。只有符合所有标准的拉取请求才会被接受。

如果你喜欢开源软件,请给你的使用仓库点个⭐️。

我们包含了出色的symfony/thanks composer包作为开发依赖。通过给你的使用包点星来告知你的操作系统包维护者你对他们的感激。只需在安装此包后运行composer thanks即可。(而且不用担心,由于它是开发依赖项,它不会安装在你的生产环境中。)