'Есть только две сложные вещи в информатике: инвалидация кэша и именование вещей.' - Фил Карлтон
Основная цель кэша - повысить производительность извлечения данных, уменьшая необходимость доступа к более медленному слою хранения данных. Жертвуя ёмкостью ради скорости, кэш обычно хранит подмножество данных временно, в отличие от баз данных, данные в которых обычно полные и постоянные.
Кэши используют принцип локальности ссылок: 'недавно запрошенные данные скорее всего будут запрошены снова'.
Как и память компьютера, кэш представляет собой компактную, быстродействующую память, которая хранит данные в иерархии уровней, начиная с первого уровня и последовательно переходя к последующим. Они обозначаются как L1, L2, L3 и так далее. Кэш также обновляется по запросу, например, когда происходит обновление, и новое содержимое должно быть сохранено в кэше, заменяя старое.
Независимо от того, читается кэш или записывается в него, это делается блок за блоком. У каждого блока также есть тег, который включает местоположение, где данные были сохранены в кэше. Когда данные запрашиваются из кэша, происходит поиск по тегам для нахождения нужного содержимого на первом уровне (L1) памяти. Если нужные данные не найдены, поиск продолжается на L2.
Если данные не найдены там, поиск продолжается на L3, затем на L4 и так далее, пока они не будут найдены, затем они читаются и загружаются. Если данные не найдены в кэше вообще, то они записываются в него для быстрого извлечения в следующий раз.
Попадание в кэш описывает ситуацию, когда содержимое успешно обслуживается из кэша. Теги в памяти быстро ищутся, и когда данные найдены и прочитаны, это считается попаданием в кэш.
Холодные, тёплые и горячие кэши
Попадание в кэш также может быть описано как холодное, теплое или горячее. В каждом из этих случаев описывается скорость чтения данных.
Горячий кэш - это случай, когда данные читаются из памяти на самой быстрой возможной скорости. Это происходит, когда данные извлекаются из L1.
Холодный кэш - это самая медленная возможная скорость чтения данных, хотя это всё ещё успешное попадание в кэш. Данные просто находятся ниже в иерархии памяти, например, в L3 или ниже.
Теплый кэш используется для описания данных, найденных в L2 или L3. Он не так быстр, как горячий кэш, но всё же быстрее, чем холодный. Обычно, когда говорят о теплом кэше, это выражает, что он медленнее и ближе к холодному кэшу, чем к горячему.
Промах кэша относится к случаю, когда в памяти происходит поиск, и данные не найдены. Когда это происходит, содержимое передается и записывается в кэш.
Инвалидация кэша - это процесс, при котором компьютерная система объявляет записи кэша недействительными и удаляет или заменяет их. Если данные изменяются, они должны быть инвалидированы в кэше, в противном случае это может привести к несогласованному поведению приложения. Существуют три типа систем кэширования:
Данные записываются одновременно в кэш и соответствующую базу данных.
Плюсы: Быстрое извлечение, полное соответствие данных между кэшем и хранилищем.
Минусы: Высокая задержка при операциях записи.
Запись напрямую поступает в базу данных или постоянное хранилище, минуя кэш.
Плюсы: Это может уменьшить задержку.
Минусы: Увеличивает промахи кэша, поскольку системе кэша приходится читать информацию из базы данных в случае промаха кэша. В результате это может привести к увеличению времени чтения из-за медленного бэк-энд хранилища и повышенной задержки.
Запись выполняется только в слой кэширования, и запись подтверждается, как только запись в кэш завершена. Затем кэш асинхронно синхронизирует эту запись с базой данных.
Плюсы: Это приводит к уменьшению задержек и высокой пропускной способности для приложений с интенсивной записью.
Минусы: Существует риск потери данных в случае сбоя слоя кэширования. Мы можем улучшить это, имея более одной реплики, подтверждающей запись в кэш.
Ниже перечислены некоторые из наиболее распространенных политик вытеснения кэша:
Распределённый кэш - это система, которая объединяет оперативную память (RAM) нескольких сетевых компьютеров в единое хранилище данных в памяти, используемое в качестве кэша данных для обеспечения быстрого доступа к данным. В то время как большинство кэшей традиционно находятся в одном физическом сервере или аппаратном компоненте, распределённый кэш может вырасти за пределы памяти одного компьютера, объединяя вместе несколько компьютеров.
Как следует из названия, у нас будет один общий кэш, который будут использовать все узлы приложения. Когда запрашиваемые данные не найдены в глобальном кэше, кэш должен самостоятельно найти недостающую часть данных из основного хранилища данных.
Кэширование может иметь множество реальных примеров использования, таких как:
Когда не следует использовать кэширование?
Давайте также рассмотрим некоторые сценарии, когда мы не должны использовать кэш:
Важно отметить, что кэш не следует использовать в качестве постоянного хранилища данных. Они почти всегда реализуются в летучей памяти, так как она быстрее, и поэтому их следует рассматривать как временные.
Ниже перечислены некоторые преимущества кэширования:
Вот некоторые из обычно используемых технологий для кэширования: