切换到 rediscache 时,filedependency 不生效需替换为 dbdependency 等,tagdependency 需确保 invalidate() 由同一 rediscache 实例调用且 keyprefix 一致,db/expressiondependency 可复用但须注意上下文。

从 FileCache 切换到 RedisCache 时,缓存依赖本身不会自动“失效”,但原有依赖逻辑可能因存储机制差异而中断——尤其是 FileDependency 和 TagDependency 的行为在 Redis 下需重新适配。关键不是“依赖消失”,而是“依赖是否还能被正确识别和触发”。下面分三块讲清楚怎么做。
FileDependency 在 Redis 下不生效,必须替换
FileDependency 依赖文件系统最后修改时间(filemtime()),而 Redis 是纯内存存储,没有文件概念。一旦切换为 RedisCache,所有基于 FileDependency 的缓存项将永远不自动失效(因为依赖检查直接跳过或静默失败)。
- 必须把
FileDependency替换为其他支持 Redis 的依赖类型,如DbDependency、ExpressionDependency或TagDependency - 例如原写法:
new FileDependency(['fileName' => '@runtime/data/config.json'])→ 要改成用数据库字段或表达式判断配置是否更新 - 若仍需监听文件变更,可改用
ExpressionDependency手动读取文件时间:['expression' => 'filemtime(Yii::getAlias("@runtime/data/config.json"))'](注意:该表达式每次 get 缓存时都会执行,有 IO 开销)
TagDependency 清理逻辑要主动调用 invalidate(),且确保 keyPrefix 一致
TagDependency 在 Redis 中完全可用,但它不是“自动监听标签”,而是靠写入一个标记键(如 yii:tag:user_profile)并让缓存项显式依赖它。清除时删的是这个标记键,不是缓存本身。
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
- 切换缓存组件后,必须保证
TagDependency::invalidate()调用时使用的缓存实例与写入缓存时一致(即同是RedisCache实例) - 如果旧
FileCache里存了带 tag 的缓存,新RedisCache不会感知——那些缓存已“滞留”在文件系统中,需手动清理旧缓存目录,或等自然过期 -
关键细节:Redis 缓存配置中若设置了
keyPrefix(如'myapp_v2_'),则TagDependency内部生成的标记键也会被加前缀。因此invalidate()必须由同一个RedisCache实例调用,否则找不到对应键
DbDependency 和 ExpressionDependency 可直接复用,但要注意连接与上下文
这两类依赖不依赖存储后端,只依赖运行时环境,所以切换缓存组件后通常无需修改。
-
DbDependency仍会每次读缓存前执行 SQL 并比对结果,只要db组件配置正确(尤其多库场景下显式指定'db' => Yii::$app->get('db2')),就可照常工作 -
ExpressionDependency中的 PHP 表达式(如'Yii::$app->user->id')也照常求值,但要注意:若表达式引用了仅在 Web 环境存在的对象(如Yii::$app->request),在 Console 命令中调用invalidate()时可能报错,建议提取为独立函数或加判空 - 所有依赖实例(包括
ChainedDependency)都应复用,避免每次 new 导致标记键/SQL 执行上下文不一致
缓存依赖不是开关,而是检查条件;切换存储后,真正要重审的是“哪些条件还成立、哪些已断连”。重点不在删数据,而在让失效逻辑继续跑起来。










