Кеширование
Способы работы с кешом
Cache Aside
- Сервис чекает есть ли данные в кеше, если нет - то в бд идет
- Усложнение логики, но надежность
Cache Through
- Сервис читает только из кеша, кеш сам ходит в бд если нет ключа
- Упрощение логики, но если кеш отвалится, то беда
Cache Ahead
- Сервис читает только из кеша, кеш не ходит в бд, данные в кеше обновляются переодически
- Очень быстро, но кеш - снова уязвимое место (единая точка отказа)
Алгоритмы вытеснения данных
- Место в кеше не бесконечное - нужно кого-то вытеснять если место кончилось
Простые Способы
- Random
- FIFO / LIFO
- LRU - вытесняем ключ, к которому давно не обращались (даже если всего обращений много)
- MRU - вытесняем последний использованный ключ
- LFU - вытесняем ключ, к которому реже всего обращаются
Специфичные способы
- Белади / Opt - вытесняем то что позднее всего по времени будем использовать (на практике сложно реализуем)
- Second Change - fifo но помечаем битиком использования
- Clock - мод Second Change, но используем не очередь, а циклический массив
- 2Q - fifo + fifo + lru
- SLRU - несколько lru: cold, warm, hot
- TLRU - LRU + TTL
- LRU-K - LRU-2 - сдвиг - то есть не последний, а предпоследний
Инвалидация
- TTL - срок жизни ключа
- Jitter - если много ключей с одинаковым сроком, то будет нагрузка на бд, важно добавлять рандомный дифф, чтобы фиксануть это
- Thundering Herd Problem - один популярный ключ протух, и все бегут в бд, лечится локом
- Инвалидация по событию - обновляем через очередь сообщений
- Как клиента заставить инвалидировать кеш - использовать префиксы с версией у ключей (icon_v1 > icon_v2)
Синхронизация разных кешей
- Есть кеш для новостей, валюты
- Если вышла новость про валюту, а в валюте еще старый кеш - то беда
- Решение - тегирование кеша - то есть каждому ключу добавляем теги, и при инвалидации сбрасываем все что имеет тот же тег
Многомерный кеш
- Кеш бразузера
- Кеш прокси
- Кеш сервиса
- Кеш внешний (Redis)
- Кеш бд
Материалы
https://www.youtube.com/watch?v=iLMlYgQoTIE&list=PL_5NbJ27RRd1geLpuexvaSkAEPpprhE8i&index=3