Инвалидация кэша это процесс удаления данных из кэша при изменении состояния источника. Причем очень желательно, чтобы кэш сбрасывался сразу же за изменением. Например, мы закэшировали выборку из БД, рано или поздно исходные данные таблицы изменятся, и кэш перестает быть валидным.
Способы инвалидации:
- По истечению срока действия - TTL.
- Самая простая реализация.
- При малом TTL будет высокий CacheMissRate
- При большом TTL данные могут быть не консистентны
- По событию
- Опасно из-за риска мгновенной инвалидации и сопутствующей перестройки кэша
- Использование алгоритмов вытеснения
Дополнительно для работы со статическими файлами можно отменить Fingerprint.
Инвалидация по TTL
Один из подходов это инвалидация по времени. Для кэшированных данных устанавливается TTL, и по прошествию времени кэш удаляется. Такое вариант подходит для редко изменяемых данных, устаревание которых не приводит к серьезным проблемам в бизнес-логике, например словари.
При таком варианте важно подобрать оптимальное время жизни кэша, слишком маленькое время жизни будет давать плохую производительность, слишком большое ухудшит опыт пользователей. В оценке эффективности кэша поможет метрика CacheMissRate.
Инвалидация по событию
В этом случае мы удаляем данные кэша по какому-то событию. Например, при вызове метода обновления данных можно удалить кэш, который связан с этими данными. В некоторых случаях можно не удалять, а сразу класть новые данные в кэш, если понимаете, что они скоро потребуются.
Инвалидацию по событию можно комбинировать с TTL. В таком случае при запросе данных из кэша можно проверять оставшееся время жизни, и если оно меньше, чем некоторое заданное значение, то установить TTL заново. Таким образом данные остаются в кэше, если ими активно пользуются.
Пример реализации механизма обновления TTL на Lua:
Мета информация
Область:: 00 HighLoad
Родитель:: Кэширование
Источник::
Автор::
Создана:: 2024-06-18