有没有办法使 Yii2 查询缓存记录无效/脏


Is there a way to invalidate / dirty Yii2 query cached record?

>我正在使用最新的(2016 年 3 月)Yii2 的查询缓存机制,在 Redis 模型中以以下形式出现:

$object = $db->cache(function ($db) use($id) {
    return self::findOne($id);
});

因此,将设置具有 GUID ID 的条目(例如"bb83d06878206d758eda3e29082dda4f"),用于保存查询结果。

有没有办法在每次调用 Model 的保存方法时仅使该记录(基于 id)或整个模型的表无效?

例如,如果保存了用户记录,我们希望弄脏该用户的记录(或"用户"表),因此下次我们获取该用户时,缓存不再有效,并且记录将从数据库中检索。

如果可能的话,我想避免使用DbDependency (例如,在记录上的"last_updated"字段上),因为如果我没记错的话,这是另一个数据库查询。

似乎要走的方法是使用TagDependency。使用该标记,您可以在认为合适时使缓存的查询失效。

创建缓存的查询,为其提供唯一标记,如下所示:

$object = $db->cache(function ($db) use($id) {
    return self::findOne($id);
}, 0, new TagDependency(['tags' => 'myquerytag']));

然后,当您想要使其失效时,您可以使用 TagDependency 的"无效"静态方法,如下所示:

TagDependency::invalidate(Yii::$app->cache, 'myquerytag');

请记住,在本例中,我为此查询指定了缓存过期时间为 0,如文档示例中所示,但您可以随时指定它。