yii2缓存依赖
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 标签,读的时候没有额外开销。