Стратегии работы с кэшем
Ранее мы описывали процесс кэширования. В этом материале рассмотрим подходы к работе с кэшем.
Стратегии чтения данных
Кэширование на стороне (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 СУБД.
Материалы
Статьи
- По полочкам: Кэширование
- [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).)
- Стратегия кеширования в приложении
- Все о кэшировании: стратегии, проблемы и оптимизация
- Все о кэшировании и кэшах
- Основные принципы кэширования веб-приложений
- Проектирование эффективной системы кэширования для высоконагруженной системы
- Cache-aside паттерн
- Введение в кэширование со сквозным чтением с помощью NCache
- Продуманные запросы: стратегии кэширования в век PWA
- Когда и как следует инвалидировать кэш
- What is Pre-Caching?
- Что такое многоуровневые кэши?
- Подробное руководство по настройке TTL для записей DNS
- TTL в сети: как работает и значение для кэширования
- Как мы в Спортмастере выбирали систему кеширования
- Redis для кэширования. Ускоряем взаимодействие с основной базой
- Как в 3 раза снизить затраты на отказоустойчивую инфраструктуру, переехав с Hazelcast на Redis
- Кэширование и memcached
- Знакомство с Apache Ignite: первые шаги
- Apache Ignite — кеш для баз данных
- Как использовать Apache Ignite как in-memory caching layer для ускорения доступа к данным
- Как мы внедряли распределенный кеш на Tarantool в одной АБС
- Tarantool как кэш основной БД
- Как ВТБ внедрил кэш для горячих данных объемом 2ТБ
- Yota реализовала кэширование данных на платформе Tarantool
- HazelCast и синхронизация метода между несколькими нодами
- 100500 способов кэширования в Oracle Database
- Когда и как следует инвалидировать кэш
Видео
- Как кэшировать данные | Теория кэширования
- Стратегии применения кэширования | Саша Сахаров, тимлид в Avito
- Highload 2. Кэширование | Highload 3. Инвалидация кешей
- Redis за 20 минут
- Данил Ахтаров. Кеширование — делаем всё правильно