Інвалідація кешу
Дата оновлення перекладу 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
реалізує TagAwareAdapterInterface,
то ви можете інваллідувати кешовані обʼєкти, викликавши
invalidateTags():
1 2 3 4 5
// інвалідувати всі обʼєкти, повʼязані з `tag_1` або `tag_3`
$cache->invalidateTags(array('tag_1', 'tag_3'));
// якщо ви знаєте ключ кешу, ви також можете видалити обʼєкт напряму
$cache->delete('cache_key');
Використання інвалідації тегів дуже корисне, коли відстежувати ключі кешу стає складно.
Адаптери, обізнані про теги
Для того, щоб зберігати теги, вам потрібно огорнути адаптер кешу класом TagAwareAdapter або реалізувати TagAwareAdapterInterface та його єдиний метод invalidateTags().
Note
При використанні бекенду Redis, розгляньте використання RedisTagAwareAdapter , що оптимізовано для цієї цілі. При використанні файлової системи, так само розгляньте використання FilesystemTagAwareAdapter .
Клас TagAwareAdapter реалізує миттєву
інвалідацію (тимчасова складність - O(N)
, де N
- кількість інвалідованих тегів).
Йому потрібно один або два адаптери кешу: перший, обовʼязковий, використовується для
зберігання кешованих обʼєктів; другий, необовʼязковий, використовується для зберігання
тегів та їхніх номерів версії інвалідації (концептуально схоже на їхню останню дату
інвалідації). Коли використовується лише один адаптер, обʼєкти та теги всі зберігаються
в одному місці. Використовуючи 2 адаптери, ви можете, наприклад, зберігати деякі великі
кешоовані обʼєкти у файловій системи або базі даних, та тримати теги у базі даних 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
TagAwareAdapter реалізує PruneableInterface, що дозволяє ручну обрізку прострочених записів кешу , шляхом виклику його методу prune() (припускаючи, що сам обгорнутий адаптер реалізує PruneableInterface).
Використання строку дії кешу
Якщо ваші дані валідні лише протягом обмеженої кількості часу, ви можете вказати їх час життя або дату закінчення строку дії з інтерфейсом PSR-6, як пояснюється у статті Обʼєкти кешу.