Перейти к основному содержимому

Стратегии работы с кэшем

Ранее мы описывали процесс кэширования. В этом материале рассмотрим подходы к работе с кэшем.

Стратегии чтения данных

Кэширование на стороне (Cache Aside)

  • Приложение запрашивает данные из кэша.
  • Если данные отсутствуют, приложение запрашивает их из базы данных (БД).
  • После получения данные записываются в кэш для последующих запросов.

Обновление кэша: только после запроса данных из БД.

Плюсы:

  • Простота реализации.
  • Контроль за кэшированием на уровне приложения.

Минусы:

  • Кэш может устареть, если данные изменяются в базе.

Пример: каталог товаров в интернет-магазине. При запросе карточки товара данные сначала проверяются в кэше, а при отсутствии запрашиваются из базы и сохраняются в кэше.


Сквозное чтение (Read Through)

  • Приложение запрашивает данные только из кэша.
  • Если данных нет, кэш сам обращается к БД, извлекает данные, возвращает их приложению и сохраняет в кэше.

Обновление кэша: автоматически при первом запросе данных из БД.

Плюсы:

  • Облегчает работу приложения.
  • Данные автоматически кэшируются при первом запросе.

Минусы:

  • Задержка при первом запросе.

Пример: новостной сайт, где статьи хранятся в кэше. Если статья отсутствует, кэш автоматически получает её из базы, обновляет и передает пользователю.

Стратегии записи данных

Сквозная запись (Write Around)

  • Приложение записывает данные напрямую в БД.
  • Кэш не обновляется сразу, последующее чтение вызывает обновление через Cache Aside.

Обновление кэша: только при следующем запросе данных.

Плюсы:

  • Подходит для данных с редкими операциями чтения.

Минусы:

  • Кэш может быть неактуальным до первого запроса.

Пример: в системе учета заказов новые заказы записываются напрямую в БД, а кэш обновляется только при чтении.


Сквозная запись (Write Through)

  • Приложение записывает данные сначала в кэш.
  • Кэш автоматически обновляет данные в БД.

Обновление кэша: синхронно с записью в БД.

Плюсы:

  • Согласованность данных между кэшем и БД.

Минусы:

  • Более медленные операции записи из-за синхронного обновления БД.

Пример: в банковских системах каждая транзакция записывается одновременно в кэш и БД для обеспечения согласованности.


Обратная запись (Write Back)

  • Приложение записывает данные в кэш.
  • Кэш откладывает обновление БД и выполняет его асинхронно.

Обновление кэша: моментальное, БД обновляется позже.

Плюсы:

  • Быстрая запись данных.

Минусы:

  • Риск потери данных при сбое кэша до обновления БД.

Пример: в соцсетях изменения профиля сначала сохраняются в кэш, а запись в БД откладывается для ускорения.

Предварительное кэширование (Preemptive Caching)

  • Кэш предварительно заполняется данными, которые могут понадобиться в будущем, без ожидания запроса от приложения.
  • Данные могут загружаться на основе аналитики использования, предположений или предсказательных моделей.

Обновление кэша: выполняется до того, как данные будут запрошены.

Плюсы:

  • Сокращает задержки при чтении, так как нужные данные уже находятся в кэше.

Минусы:

  • Риск кэширования данных, которые могут не понадобиться.

Пример: платформа с видео кэширует популярные фильмы и сериалы на основе аналитики, чтобы ускорить доступ к ним.


Инвалидизация кэша (Cache Invalidation)

  • Неактуальные данные автоматически удаляются из кэша по истечении времени или при изменении данных в БД (или других событиях).
  • Может использоваться вместе с другими стратегиями, такими как Cache Aside или Write Through.

Обновление кэша: в зависимости от срока жизни или изменений в источнике данных.

Плюсы:

  • Предотвращает использование устаревших данных.

Минусы:

  • Увеличивает задержки при первом запросе, так как данные нужно извлечь заново после очистки.

Пример: в онлайн-магазине с быстрым обновлением ассортимента данные о товарах кэшируются с коротким сроком действия, чтобы избежать устаревших предложений.


Кэширование по времени жизни (Time-to-Live Caching, TTL)

  • Каждому кэшированному объекту задается время жизни (TTL), после которого данные считаются устаревшими и автоматически удаляются из кэша.
  • После истечения TTL данные должны быть снова получены из БД.

Обновление кэша: выполняется по истечении заданного срока жизни.

Плюсы:

  • Контролируемая актуальность данных.

Минусы:

  • При слишком коротком TTL увеличивается частота обращений к БД, что снижает эффективность.
  • Кэш может содержать устаревшую информацию до истечения TTL, даже если данные в БД уже изменились.

Пример: система отслеживания спортивных результатов, где данные о матчах обновляются с заданным TTL.


Многослойное кэширование (Multi-level Caching)

  • Используются несколько уровней кэширования, например, в памяти на стороне клиента (L1) и на стороне сервера (L2).
  • Запросы сначала идут в ближайший кэш (например, локальный), а затем передаются на следующий уровень, если данные не найдены.

Обновление кэша: выполняется на всех уровнях по мере использования или изменения данных.

Плюсы:

  • Улучшает производительность за счет быстрого доступа к данным на разных уровнях.

Минусы:

  • Сложное управление кэшем, сложнее синхронизировать все уровни.

Пример: веб-платформа, использующая кэш на уровне браузера пользователя и серверов, чтобы сократить задержки при загрузке.

Хранение кэша

Кэш может быть локальным (внутри приложения) или распределённым (на внешних серверах). Для быстрого доступа кэш располагают ближе к приложению.

Примеры ПО для кэширования:

  • Redis — распределённый кэш, поддержка множества структур данных.
  • Memcached — лёгкое решение для кэширования часто запрашиваемых данных.
  • Apache Ignite — кэш с поддержкой транзакций.
  • Hazelcast — распределённый кэш с возможностями кластеризации.
  • Tarantool — высокопроизводительная in-memory СУБД.

Материалы

Статьи

  1. По полочкам: Кэширование
  2. [SE: Проектирование эффективной системы кэширования](https://systems.education/efficient-caching#:~:text=%D0%9A%D1%8D%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%20%D0%BD%D0%B0%20%D1%81%D1%82%D0%BE%D1%80%D0%BE%D0%BD%D0%B5%20(Cache%2DAside,%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D1%8C%20(Write%2DThrough).)
  3. Стратегия кеширования в приложении
  4. Все о кэшировании: стратегии, проблемы и оптимизация
  5. Все о кэшировании и кэшах
  6. Основные принципы кэширования веб-приложений
  7. Проектирование эффективной системы кэширования для высоконагруженной системы
  8. Cache-aside паттерн
  9. Введение в кэширование со сквозным чтением с помощью NCache
  10. Продуманные запросы: стратегии кэширования в век PWA
  11. Когда и как следует инвалидировать кэш
  12. What is Pre-Caching?
  13. Что такое многоуровневые кэши?
  14. Подробное руководство по настройке TTL для записей DNS
  15. TTL в сети: как работает и значение для кэширования
  16. Как мы в Спортмастере выбирали систему кеширования
  17. Redis для кэширования. Ускоряем взаимодействие с основной базой
  18. Как в 3 раза снизить затраты на отказоустойчивую инфраструктуру, переехав с Hazelcast на Redis
  19. Кэширование и memcached
  20. Знакомство с Apache Ignite: первые шаги
  21. Apache Ignite — кеш для баз данных
  22. Как использовать Apache Ignite как in-memory caching layer для ускорения доступа к данным
  23. Как мы внедряли распределенный кеш на Tarantool в одной АБС
  24. Tarantool как кэш основной БД
  25. Как ВТБ внедрил кэш для горячих данных объемом 2ТБ
  26. Yota реализовала кэширование данных на платформе Tarantool
  27. HazelCast и синхронизация метода между несколькими нодами
  28. 100500 способов кэширования в Oracle Database
  29. Когда и как следует инвалидировать кэш

Видео

  1. Как кэшировать данные | Теория кэширования
  2. Стратегии применения кэширования | Саша Сахаров, тимлид в Avito
  3. Highload 2. Кэширование | Highload 3. Инвалидация кешей
  4. Redis за 20 минут
  5. Данил Ахтаров. Кеширование — делаем всё правильно

Конференции