如何在Drupal 8中通配符清除缓存?


8

在Drupal 7中,我们曾经能够做到这一点:

cache_clear_all('state:', 'cache', TRUE)

这将删除任何缓存斌entires 开始用字符串state:(匹配的高速缓存的ID,如state:infostate:nebraska)。

https://www.drupal.org/node/1272696上的更改记录甚至在Drupal 7示例中记录了该用例,但实际上并未提供如何在D8中进行复制的示例。

似乎我们应该使用缓存标签,考虑到简单的用例,这似乎是一个更昂贵的转换。我没有看到适用于CacheBackendInterface的任何匹配方法。请注意,这并不是要删除缓存仓中的所有项目,deleteAll()明确涵盖了该内容。

Answers:


8

不知道为什么删除现有答案,它(几乎)是正确的。

通配符缓存清除已删除。在没有通配符支持的后端(如redis和memcache)中,支持非常复杂。

缓存标签是替代标签,使用起来并不复杂。您只需传递一个字符串列表作为第4个参数(有点麻烦的是您必须设置默认的timestamp参数,一个单独的方法会很不错):

\Drupal::cache('default')->set('state:info', $your_data, Cache::PERMANENT, 
['state']);

然后致电:

\Drupal\Core\Cache\Cache::invalidateTags(array('state'));

好的,我将帮助您更新更改通知,以更明确地表明必须使用缓存标记来替代。
戴夫·里德

获得所有需要标记为删除的缓存键的可靠方法是什么?例如,是否要清除'entity_bundle_extra_fields:node:article:' . $langcode所有语言?我可以获得所有语言的列表,但是有没有更简单的东西?在这种情况下,它已经具有缓存标记“ entity_field_info”。但是也许我想使范围更广的无效。
donquixote

不,那里没有。缓存API没有查询/列表方法。而且,您不应该直接与其他人的缓存条目进行交互,而应使用API​​,例如,在这种情况下,实体字段管理器清除缓存的定义。这些缓存条目不是API,核心可以自由更改键/结构,然后您的代码将被破坏
Berdir
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.