Deprecated: parse_url(): Passing null to parameter #1 ($url) of type string is deprecated in /www/wwwroot/blog_qqvbc_com/usr/plugins/Access/Access_Core.php on line 339

Deprecated: parse_url(): Passing null to parameter #1 ($url) of type string is deprecated in /www/wwwroot/blog_qqvbc_com/usr/plugins/Access/Access_Core.php on line 392

Deprecated: parse_url(): Passing null to parameter #1 ($url) of type string is deprecated in /www/wwwroot/blog_qqvbc_com/usr/plugins/Access/Access_Core.php on line 394
yii2缓存依赖 - Joyber 的博客

Yii2 内置全部常用缓存依赖

1. FileDependency 文件依赖

yii\caching\FileDependency
原理:校验文件最后修改时间,文件改动则缓存失效。
适用:配置文件、静态模板、json元数据。

use yii\caching\FileDependency;

$query->cache(60, new FileDependency([
    'fileName' => '@config/menu.json'
]))

2. ExpressionDependency PHP表达式依赖

yii\caching\ExpressionDependency
原理:每次读取缓存,执行一段PHP表达式;返回值变化,缓存失效。
适用:自定义逻辑,比如读取Redis里的版本号、全局配置版本。

use yii\caching\ExpressionDependency;

$query->cache(0, new ExpressionDependency([
    'expression' => 'Yii::$app->redis->get("global_version")'
]));

3. TagDependency 标签依赖(业务开发最推荐)

yii\caching\TagDependency
原理:缓存打上标签;不需要自动检测,代码手动根据标签批量清除缓存。

你当前统计count场景非常适合这个,比DbDependency少一条额外SQL。

示例:

use yii\caching\TagDependency;

// 写入缓存,绑定标签 estate-{$merchantId}
$count = PropertyCommunity::find()
    ->where(['estate_id' => $merchantId])
    ->cache(0, new TagDependency([
        'tags' => ["estate:{$merchantId}"]
    ]))
    ->count();

// 新增/修改/删除数据后,一行代码清空该标签下所有缓存
TagDependency::invalidate(Yii::$app->cache, ["estate:{$merchantId}"]);

优点:读缓存时不会额外执行SQL;缺点:数据变更需要手动调用 invalidate。

4. ChainedDependency 组合依赖

yii\caching\ChainedDependency
原理:组合多个依赖,任意一个依赖触发变更 → 缓存失效。

use yii\caching\ChainedDependency;

new ChainedDependency([
    'dependencies' => [
        new FileDependency(['fileName'=>'@config/conf.json']),
        new TagDependency(['tags'=>['estate:1001']])
    ]
]);

5. DbQueryDependency(DbDependency升级版)

yii\caching\DbQueryDependency
接收 QueryInterface 对象,而不是原生SQL字符串,支持参数绑定,防SQL注入。

use yii\caching\DbQueryDependency;
use yii\db\Query;

new DbQueryDependency([
    'query' => (new Query())
        ->select('MAX(updated_at)')
        ->from('property_community')
        ->where(['estate_id' => $merchantId])
]);

选型对比(结合你的项目)

依赖读缓存额外SQL触发方式适合场景
DbDependency✅ 每次读执行1条SQL自动检测SQL结果低并发,不想手动清缓存
DbQueryDependency✅ 同上自动检测Query结果同上,推荐替代DbDependency
TagDependency❌ 无额外SQL代码手动清除标签高并发统计count,优先选这个
FileDependency❌文件修改时间配置文件
ExpressionDependency❌php表达式返回值Redis版本号、自定义变量
ChainedDependency看子依赖任一子依赖变更多条件组合

重点建议

你现在 PropertyCommunity count统计:优先 TagDependency。
理由:
DbDependency每次访问count都会额外跑一条MAX(updated_at),并发上来会增加数据库压力;TagDependency在新增/删除数据时手动 invalidate 标签,读的时候没有额外开销。

标签: none

添加新评论