Инвалидация кеша
Дата обновления перевода: 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, как объясняется в статье Объекты кеша.