Yii2.0.14无原生cache tag,需用TagDependency手动模拟:必须复用同一实例、统一tags字符串命名、调用invalidate()显式失效;不可new多个实例或用delete()删键,且需确保dev/prod环境cache配置(keyPrefix、database)一致。

Yii2.0.14 没有原生 cache tag,所谓“缓存标签”是靠 TagDependency 手动模拟的分组机制,核心在于复用实例、统一命名、显式失效。清理不是删缓存本身,而是让依赖标记过期,触发下次读取时自动重建。
TagDependency 必须复用同一个实例
每次 new 一个 TagDependency,就会生成不同的内部标记键(如 tag_user_profile_abc123),导致后续 invalidate() 找不到目标。正确做法是预定义并全局复用:
- 在
common/components/CacheHelper.php或配置文件中提前创建:$userProfileTag = new \yii\caching\TagDependency(['tags' => 'user:profile']); - 所有关联缓存都传这个实例:
Yii::$app->cache->set('user_123_data', $data, 3600, $userProfileTag);Yii::$app->cache->set('user_123_prefs', $prefs, 3600, $userProfileTag); - 避免在循环或 action 内反复 new,否则标签失效完全不可控
清除缓存必须调用 invalidate(),不能 delete()
TagDependency 的清理逻辑是:把标记键设为过期,下次 get() 时检测到依赖变化,就跳过缓存、重新生成。这不是物理删除操作:
- 正确清除方式:
\yii\caching\TagDependency::invalidate('user:profile'); - 错误做法:
Yii::$app->cache->delete('user_123_data')—— 只删单个键,漏掉其他同标签项 - 注意:invalidate() 参数必须和构造时
tags值完全一致,且大小写敏感
生产环境需确保环境一致性
同一套标签逻辑,在 dev 和 prod 环境下失效失败,90% 是因为缓存前缀或 Redis database 不一致:
- 检查
cache组件是否配置了keyPrefix,且前后端、console 配置完全相同 - 确认 Redis 连接使用的是同一个
database,比如都设为database => 1 - console 命令调用
invalidate()时,必须加载与 web 相同的缓存组件配置(尤其注意console/config/main.php中的 cache 定义)
可组合 DbDependency 提升数据新鲜度
TagDependency 控制“属于哪一组”,DbDependency 控制“底层数据是否变了”,二者可嵌套使用(Yii2.0.14+ 支持 DependencyChain):
- 例如首页文章列表:既要按用户偏好分组(tag),又要随最新文章时间戳自动失效(db)
- 组合写法:
new \yii\caching\DependencyChain([<br> new \yii\caching\DbDependency(['sql' => 'SELECT MAX(updated_at) FROM post']),<br> new \yii\caching\TagDependency(['tags' => 'home:rec:user_789'])<br>])
- 任一依赖失效,整个缓存就跳过,比单用 tag 更可靠


















