Инвалидация кеша

Дата обновления перевода: 2023-08-21

Инвалидация кеша

Инвалидация кеша - это процесс удаления всех кешированных объектов, связанных с изменениями в состоянии вашей модели. Наиболее распространённым типом инвалидации является прямое удаление объектов. Но если состояние первоначального источника распространилось на несколько кешированных объектов, то содержать их в синхронизрованном состоянии может быть сложно.

Компонент Symfony Cache предоставляет два механизма, чтобы помочь решить эту проблему:

  • Инвалидация, основанная на тегах для управления зависимостями данных;
  • Инвалидация, основанная на сроке действия для зависимостей, связанных со временем.

Использование тегов кеша

Чтобы получить преимущества инвалидации, основанной на тегах, вам нужно присоединить к каждому кешированному объекту правильные теги. Каждый тег - это простой идентификатор строки, который вы можете использовать в любое время, чтобы запустить удаление всех объектов, связанных с этим тегом.

Чтобы присоединить теги к кешированным объектам, вам нужно использовать метод tag(), который реализуется объектами кеша, возвращёнными адаптерами кеша:

1
2
3
4
5
6
7
8
$item = $cache->get('cache_key', function (ItemInterface $item): string {
    // [...]
    // добавьте один или несколько тегов
    $item->tag('tag_1');
    $item->tag(['tag_2', 'tag_3']);

    return $cachedValue;
});

Если $cache реализует TagAwareCacheInterface, то вы можете нивалидировать кешированные объекты, вызвав invalidateTags():

1
2
3
4
5
// инвалидировать все объекты, связанные с `tag_1` или `tag_3`
$cache->invalidateTags(['tag_1', 'tag_3']);

// если вы знаете ключ кеша, то вы также можете удалить объект напрямую
$cache->delete('cache_key');

Использование инвалидации тегов очень полезно, когда отслеживать ключи кеша становится сложно.

Адаптеры, знающие о тегах

Для того, чтобы хранить теги, вам нужно обернуть адаптер кеша классом TagAwareAdapter или реализовать TagAwareAdapterInterface и его единственнй метод invalidateTags().

Note

При использовании бэк-энда Redis, рассмотрите использование RedisTagAwareAdapter , который оптимизирован для этих целей. При использовании файловой системы также рассмотрите использование FilesystemTagAwareAdapter .

Класс TagAwareAdapter реализует мгновенную инвалидацию (временная сложность - O(N), где N - количество инвалидированных тегов). Ему требуется один или два адаптера кеша: первый, обязательный, используется для хранения кешированных объектов; второй, необязательный, используется для хранения тегав и их номера версии инвалидации (концептуально схоже с их последней датой инвалидации). Когда используется только один адаптер, объекты и теги все хранятся в одном месте. Используя 2 адаптера, вы можете, к примеру, хранить некоторые большие кешированные объекты в файловой системе или в DB, и держать теги в DB Redis, чтобы синхронизировать все ваши фронты и проводить очень быстрые проверки инвалидации:

1
2
3
4
5
6
7
8
9
10
use Symfony\Component\Cache\Adapter\FilesystemAdapter;
use Symfony\Component\Cache\Adapter\RedisAdapter;
use Symfony\Component\Cache\Adapter\TagAwareAdapter;

$cache = new TagAwareAdapter(
    // адаптер для кешированных объектов
    new FilesystemAdapter(),
    // адаптер для тегов
    new RedisAdapter('redis://localhost')
);

Note

TagAwareAdapter реализует PruneableInterface, включая ручную обрезку записей кеша с истёкшим сроком хранения , путём вызова его метода prune() (предполагается, что сам обёрнутый адаптер реализует PruneableInterface).

Использование срока действия кеша

Если ваши данные валидны только в течение ограниченного количества времени, вы можете указать из время жизни или дату истечения срока действия с интерфейсом PSR-6, как объясняется в статье Объекты кеша.