devgroup/yii2-tag-dependency-helper

为 yii2 提供统一缓存标签名并支持失效功能的助手

安装: 424,448

依赖者: 19

建议者: 0

安全性: 0

星标: 31

关注者: 19

分支: 16

开放问题: 0

类型:yii2-extension

1.5.0 2016-09-04 14:52 UTC

This package is auto-updated.

Last update: 2024-09-11 14:07:51 UTC


README

Latest Stable Version Total Downloads Latest Unstable Version License Code Climate Scrutinizer Code Quality Build Status

为 Yii2 ActiveRecord 模型提供统一缓存标签名并支持失效功能的助手。

安装

安装此扩展的首选方式是通过 composer

运行

php composer.phar require --prefer-dist devgroup/yii2-tag-dependency-helper "*"

或添加

"devgroup/yii2-tag-dependency-helper": "*"

到您的 composer.json 文件的 require 部分。

核心概念

此扩展为 ActiveRecord 引入了 2 种标准缓存标签类型

  • 通用标签 - 如果此类型的任何模型被更新/插入,则标签失效
  • 对象标签 - 如果精确的模型记录被更新(例如,id=2 的 Product),则标签失效
  • 组合标签 - 如果指定字段的模型记录被更新,则标签失效

使用方法

在您的活动记录模型中添加行为和特性

use \DevGroup\TagDependencyHelper\TagDependencyTrait;

/**
 * @inheritdoc
 */
public function behaviors()
{
    return [
        'CacheableActiveRecord' => [
            'class' => \DevGroup\TagDependencyHelper\CacheableActiveRecord::className(),
        ],
    ];
}

此行为自动通过模型名称和模型-id 对标签进行失效

查找模型

在 TagDependencyTrait 中有一个特殊方法用于通过使用标签缓存根据 ID 查找模型

/**
 * Finds or creates new model using or not using cache(objectTag is applied, not commonTag!)
 * @param string|int $id ID of model to find
 * @param bool $createIfEmptyId Create new model instance(record) if id is empty
 * @param bool $useCache Use cache
 * @param int $cacheLifetime Cache lifetime in seconds
 * @param bool|\Exception $throwException False or exception instance to throw if model not found or (empty id AND createIfEmptyId==false)
 * @return \yii\db\ActiveRecord|null|self|TagDependencyTrait
 * @throws \Exception
 */
public static function loadModel(
    $id,
    $createIfEmptyId = false,
    $useCache = true,
    $cacheLifetime = 86400,
    $throwException = false
)
{
}

示例调用: $post = Post::loadModel('', false, false, 0, new \Exception("test2"));

对于 Post 模型实例($post),在更新、插入、删除时,缓存将自动由对象和通用标签失效。

可以通过调用 $post->invalidateTags() 进行直接失效。

在其他场景中添加缓存标签

如果您的缓存条目应该在模型中的任何行被编辑时刷新 - 使用 getCommonTag 辅助函数

$models = Configurable::getDb()->cache(
    function ($db) {
        return Configurable::find()->all($db);
    },
    86400,
    new TagDependency([
        'tags' => NamingHelper::getCommonTag(Configurable::className()),
    ])
);

如果您的缓存条目应该在模型的确切行被编辑时刷新 - 使用 getObjectTag 辅助函数

$cacheKey = 'Product:' . $model_id;
if (false === $product = Yii::$app->cache->get($cacheKey)) {
    if (null === $product = Product::findById($model_id)) {
        throw new NotFoundHttpException;
    }
    Yii::$app->cache->set(
        $cacheKey,
        $product,
        86400,
        new TagDependency(
            [
                'tags' => [
                    NamingHelper::getObjectTag(Product::className(), $model_id),
                ]
            ]
        )
    );
}

如果您的缓存条目应该在具有指定字段的模型的行被编辑时刷新 - 使用 getCompositeTag 辅助函数,并在模型中覆盖 cacheCompositeTagFields 函数

//in model for cache, in this case Comments model
protected function cacheCompositeTagFields()
{
    return ['id_app', 'object_table', 'id_object'];
}

//Data for caching
$comments = Comments::getDb()->cache(
    function ($db) use ($id_app, $id_object, $object_table) {
        return Comments::find()->where(['id_app' => $id_app, 'object_table' => $object_table, 'id_object' => $id_object])->all($db);
    },
    0,
    new TagDependency([
        'tags' => [
            NamingHelper::getCompositeTag(Comments::className(), ['id_app' => $id_app, 'object_table' => $object_table, 'id_object' => $id_object])
        ]
    ])
);

//PROFIT!

懒加载缓存

懒加载缓存是一种受到 iiifx-production/yii2-lazy-cache composer 包启发的技术。

配置后(见下文),您可以使用它如下

$pages = Yii::$app->cache->lazy(function() {
    return Page::find()->where(['active'=>1])->all();
}, 'AllActivePages', 3600, $dependency);

在此示例中,只有当没有找到具有键 AllActivePages 的缓存条目时,Pages 的查找查询才会执行。在成功检索模型数组后,结果将自动以 AllActivePages 作为缓存键存储在缓存中,有效期为 3600 秒,并带有 $dependency 作为缓存依赖。

配置 - 性能方式

出于性能原因(yii2 行为比特性慢) - 创建您自己的 \yii\caching\Cache 类,并将 LazyCacheTrait 添加到其中,例如

namespace app\components;

class MyCache extends \yii\caching\FileCache {
    use \DevGroup\TagDependencyHelper\LazyCacheTrait;
}

并修改您的应用程序配置以使用您的缓存组件

return [
    'components' => [
        'class' => '\app\components\MyCache',
    ],
];

现在您可以使用懒加载缓存

配置 - 行为方式

只需像这样修改您的配置

return [
    'components' => [
        'cache' => [
            'class' => '\yii\caching\FileCache',
            'as lazy' => [
                'class' => '\DevGroup\TagDependencyHelper\LazyCache',
            ],
        ],
    ],
];

从 0.0.x 迁移到 1.x

  1. 我们将命名空间从 devgroup 更改为 DevGroup
  2. 我们将行为拆分为 3 个组件
  • CacheableActiveRecord - 为 ActiveRecord 模型的更新/插入/删除添加失效行为
  • TagDependencyTrait - 必须也添加到 ActiveRecord 类中,处理失效并添加新的静态方法 loadModel
  • NamingHelper - 唯一一个处理缓存标签命名策略的类

DevGroup.ru 提供。查看我们的其他 开源项目