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

时间:2016-03-04 21:37:48

标签: php mysql caching activerecord yii2

我在使用Redis的模型中使用最新的(2016年3月)Yii2的查询缓存机制:

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

因此,设置了具有GUID ID的条目(例如“bb83d06878206d758eda3e29082dda4f”),其中包含查询结果。

每次调用Model的save方法时,是否有办法使该记录(基于id)或整个Model的表无效?

E.g。如果保存了用户记录,我们想要弄脏该用户的记录(或“用户”表),因此下次我们获取该用户时,缓存不再有效,并且从数据库中检索记录。

如果可能,我想避免DbDependency(例如记录上的“last_updated”字段),因为那是另一个数据库查询,如果我没有弄错的话。

1 个答案:

答案 0 :(得分:1)

似乎要走的路是使用TagDependency。使用该标记,您可以在认为合适时使无效的查询无效。

您可以创建缓存查询,为其提供如下唯一标记:

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

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

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

请记住,在这种情况下,我为此查询提供了一个缓存过期时间,如文档示例中所示,但您可以在任何适合的时候给它。