System Design: От Идеи к Реальной Системе
Кэширование
Артемий Мазаев
1 янв. 2024 г.

'Есть только две сложные вещи в информатике: инвалидация кэша и именование вещей.' - Фил Карлтон

Основная цель кэша - повысить производительность извлечения данных, уменьшая необходимость доступа к более медленному слою хранения данных. Жертвуя ёмкостью ради скорости, кэш обычно хранит подмножество данных временно, в отличие от баз данных, данные в которых обычно полные и постоянные.

Кэши используют принцип локальности ссылок: 'недавно запрошенные данные скорее всего будут запрошены снова'.

Кэширование и память

Как и память компьютера, кэш представляет собой компактную, быстродействующую память, которая хранит данные в иерархии уровней, начиная с первого уровня и последовательно переходя к последующим. Они обозначаются как L1, L2, L3 и так далее. Кэш также обновляется по запросу, например, когда происходит обновление, и новое содержимое должно быть сохранено в кэше, заменяя старое.

Независимо от того, читается кэш или записывается в него, это делается блок за блоком. У каждого блока также есть тег, который включает местоположение, где данные были сохранены в кэше. Когда данные запрашиваются из кэша, происходит поиск по тегам для нахождения нужного содержимого на первом уровне (L1) памяти. Если нужные данные не найдены, поиск продолжается на L2.

Если данные не найдены там, поиск продолжается на L3, затем на L4 и так далее, пока они не будут найдены, затем они читаются и загружаются. Если данные не найдены в кэше вообще, то они записываются в него для быстрого извлечения в следующий раз.

Попадание в кэш и промах кэша

Попадание в кэш

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

Холодные, тёплые и горячие кэши

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

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

Холодный кэш - это самая медленная возможная скорость чтения данных, хотя это всё ещё успешное попадание в кэш. Данные просто находятся ниже в иерархии памяти, например, в L3 или ниже.

Теплый кэш используется для описания данных, найденных в L2 или L3. Он не так быстр, как горячий кэш, но всё же быстрее, чем холодный. Обычно, когда говорят о теплом кэше, это выражает, что он медленнее и ближе к холодному кэшу, чем к горячему.

Промах кэша

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

Инвалидация кэша

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

Кэш с прямой записью

Данные записываются одновременно в кэш и соответствующую базу данных.

Плюсы: Быстрое извлечение, полное соответствие данных между кэшем и хранилищем.

Минусы: Высокая задержка при операциях записи.

Кэш с обходом записи

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

Плюсы: Это может уменьшить задержку.

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

Кэш с отложенной записью

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

Плюсы: Это приводит к уменьшению задержек и высокой пропускной способности для приложений с интенсивной записью.

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

Политики вытеснения

Ниже перечислены некоторые из наиболее распространенных политик вытеснения кэша:

  • Первым Пришёл — Первым Ушёл (FIFO): Кэш вытесняет первый доступный блок без учёта того, насколько часто или сколько раз он был доступен ранее.
  • Последним Пришёл — Первым Ушёл (LIFO): Кэш вытесняет последний доступный блок без учёта того, насколько часто или сколько раз он был доступен ранее.
  • Наименее Недавно Использованные (LRU): Удаляет первыми элементы, которые использовались наименее недавно.
  • Наиболее Недавно Использованные (MRU): В отличие от LRU, первыми удаляет наиболее недавно использованные элементы.
  • Наименее Часто Использованные (LFU): Подсчитывает, насколько часто требуется элемент. Те, которые используются наименее часто, удаляются первыми.
  • Случайная Замена (RR): Случайным образом выбирает кандидата на удаление и удаляет его для освобождения места при необходимости.

Распределённый Кэш

Распределённый кэш - это система, которая объединяет оперативную память (RAM) нескольких сетевых компьютеров в единое хранилище данных в памяти, используемое в качестве кэша данных для обеспечения быстрого доступа к данным. В то время как большинство кэшей традиционно находятся в одном физическом сервере или аппаратном компоненте, распределённый кэш может вырасти за пределы памяти одного компьютера, объединяя вместе несколько компьютеров.

Глобальный Кэш

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

Примеры использования

Кэширование может иметь множество реальных примеров использования, таких как:

  • Кэширование баз данных
  • Сеть доставки контента (CDN)
  • Кэширование системы доменных имён (DNS)
  • Кэширование API

Когда не следует использовать кэширование?

Давайте также рассмотрим некоторые сценарии, когда мы не должны использовать кэш:

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

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

Преимущества

Ниже перечислены некоторые преимущества кэширования:

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

Примеры

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

Have a doubt?
Post it here, our mentors will help you out.