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

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

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

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

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

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

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

1
2
3
4
5
6
$item = $cache->getItem('cache_key');
// ...
// добавьте один или несколько тегов
$item->tag('tag_1');
$item->tag(array('tag_2', 'tag_3'));
$cache->save($item);

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

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

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

// если вы не помните ключ объекта, то выможете использовать метод getKey()
$cache->deleteItem($item->getKey());

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

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

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

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

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

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

Note

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

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

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