Стратегии кэширования
saga_itКэширование - техника, нацеленная на оптимизацию производительности веб-приложений.
Кэширование включает в себя хранение часто запрашиваемых, используемых данных или файлов во временном хранилище, называемом кэш.
Преимущества кэширования
Одно из преимуществ кэширования - это увеличение производительности веб-приложения за счет сокращения времени обработки запроса к часто используемым данным. Веб-приложения быстрее обрабатывают отдают данные пользователям из кэша, улучшая пользовательский опыт. Помимо этого, кэширование уменьшает загрузку веб-серверов и БД, а это в свою очередь позволяет сократить расходы на обслуживание и повысить масштабируемость системы в целом.
Что хранится в кэше?
В кэше обычно хранят часто запрашиваемые данные, к примеру статический контент (изображения), стили, скрипты, частые запросы к БД, ответы от API или веб-страницы.
Однако если в вашем решении требуется кэширование необходимо продумать следующие аспекты:
- какие данные будут хранится в кэше;
- как поддерживать актуальность данных в кэше;
- как часто обновлять кэш.
Эти и другие вопросы, касающиеся кэширования, обычно решаются в наборе принципов и практик, которые называют стратегиями или паттернами кэширования.
В этой статье обзорно освещаются несколько популярных стратегий кэширования, которые применимы в веб-приложениях.
В общем стратегии кэширования можно разделить на 2 группы:
1) стратегии кэширования при чтении данных
2) стратегии кэширования при записи данных

Стратегии кэширования при чтении данных
1) Cache-Aside
В данной стратегии кэширования за управление данными в кэше ответственно само веб-приложение. При входящем запросе данных веб-приложение в первую очередь проверяет наличие данных в кэше. Если запрашиваемые данные в кэше отсутствуют, то приложение делает запрос в базу данных и сохраняет ответ в кэше для обслуживания аналогичных запросов в будущем.
Плюсы:
- Поддержка большого объема запросов на чтение, благодаря тому, что нагрузка на основную базу данных снижена за счет первоначального обращения в кэш
- Кэш является отдельным компонентом в архитектуре, и в случае отсутствия доступа к кэшу, приложение не блокируется и продолжает обслуживать запросы, обращаясь в основную базу данных
Минусы:
- Продуманная настройка актуализации данных в кэше на стороне веб-приложения: использование TTL или дополнительной логики в коде приложения
- Любой первоначальный запрос новых данных, отсутствующих в кэше, будет к основной базе данных, что при большой нагрузке может снизить общую производительность решения.
2) Read-Through
При этой стратегии первоначальный запрос данных осуществляется в кэш. В случае отсутствия данных в кэше приложение выполняет запрос в основную базу данных.
Плюсы:
- Поддержка большого объема запросов на чтение
- Поддержка общей производительности веб-приложения при наличии медленной базы данных
Минусы:
- Отсутствие доступа к кэшу в случае его падения может стать блокирующим для всего веб-приложения
- Модель данных кэша и основной базы данных должны быть максимально схожими
- Кэш в данной стратегии - это дополнительный уровень задержки при записи данных
Стратегии кэширования при записи данных
3) Write-Around
Эта стратегия комбинирует в себе чтение данных из кэша как в Read-Through, однако запись данных осуществляется напрямую в базу данных.
Кэш здесь потенциальная точка отказа всего приложения в случае обработки запросов на чтение данных, но запросы на запись данных могут продолжать обслуживаться базой данных.
4) Write-Through
Данная стратегия обычно используется в комбинации с Read-Through. Запись новых данных осуществляется сначала в кэш, затем кэш инициирует запись данных в базу данных. При этом подходе гарантируется актуальность данных в кэше, но замедляется запись данных, так как кэш выступает промежуточным уровнем задержки.
5) Write-Behind (Write-back)
Запись данных осуществляется в кэш, который через определенный период времени записывает накопившийся объем данных в базу данных.
Плюсы:
- Поддержка большого объема запросов на запись данных
- Недоступность базы данных не приведет к потере новых данных, так как они хранятся в кэше
Минусы:
Кэш - потенциальная точка отказа при его недоступности. Это может привести к потере данных и неконсистентности основной базы данных
Что почитать и посмотреть про кэширование:
- https://medium.com/@mmoshikoo/cache-strategies-996e91c80303 - Cache Strategies
- https://docs.aws.amazon.com/whitepapers/latest/database-caching-strategies-using-redis/caching-patterns.html
- https://www.youtube.com/watch?v=Ez1GK2imrsY - Caching | Cache Patterns | Cache Invalidation & Eviction