Інвалідація кеша

Дата оновлення перекладу 2022-10-27

Інвалідація кеша

Інвалідація кеша - це процес видалення всіх кешованих обʼєктів, повʼязаних зі змінами у стані вашої моделі. Найрозповсюдженішим типом інвалідації є пряме видалення обʼєктів. Але якщо стан початкового джерела розповсюдився на декілька кешованих обʼєктів, то утримувати їх у синхронізованому стані може бути складно.

Компонент Symfony Кеш надає два механізми, щоб допомогти вирішити цю проблему:

  • Інвалідація, заснована на тегах для управління залежностями даних;
  • Інвалідація, заснована на строку дії для залежностей, повʼязаних з часом.

Використання тегів кеша

Щоб отримати переваги інвалідації, заснованої на тегах, вам потрібно приєднати до кожного кешованого обʼєкта правильні теги. Кожний тег - це проостий ідентифікатор рядку, який ви можете використати у будь-який час, щоб запустити видаллення всіх обʼєктів, повʼязаних з цим тегом.

Щоб додати теги до кешованих обʼєктів, вам потрібно використати метод tag(), який реалізується обʼєктами кеша, що повернені адаптерами кеша:

1
2
3
4
5
6
7
8
$item = $cache->get('cache_key', function (ItemInterface $item) {
    // [...]
    // додайте один або більше тегів
    $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, як пояснюється у статті Обʼєкты кеша.