This is the Trace Id: 171a30622cbeb2cb1b1169b18986a04d
Перейти к основному контенту
Azure
градиентный фон

Что такое кэширование?

Узнайте, как кэширование повышает производительность и эффективность системы.

Значение термина "кэширование"

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

Основные выводы

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

Общие сведения о принципах кэширования

Что такое кэш?

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

Как работает кэширование?

Большинство систем хранят надежный "источник истины»" (базу данных) для полных наборов данных, а также используют кэш для временных подмножеств, к которым часто обращаются при чтении. При поступлении запроса приложение сначала проверяет кэш; если данные там есть, оно быстро возвращает их, не обращаясь повторно к серверной части. Разработчики также кэшируют обработанные данные и повторно используют их для более быстрой обработки запросов по сравнению со стандартными запросами к реляционным базам данных, SQL-базам данных или базам данных PostgreSQL с открытым кодом.

Основные принципы кэширования

1. Кэшируйте то, что часто читаете

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

2. Кэшируйте результаты повторяющихся операций

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

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

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

4. Храните состояние сеанса поблизости для обеспечения высокой отзывчивости приложений

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

Влияние на производительность системы

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

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

Как работает кэширование?

Базовая схема: кэш + исходное хранилище данных

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

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

Уровни кэширования: более одного "быстрого пути"

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

Что кэшируется (и зачем)

Команды обычно кэшируют данные, относящиеся к нескольким категориям:

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

Распространенные шаблоны кэширования (сценарии чтения и записи)

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

  • Cache-aside: загрузка данных из хранилища по требованию.
  • Read-through: чтение из кэша, при этом кэш при необходимости подгружает данные из хранилища.
  • Write-through: запись производится в кэш, который повторно синхронизируется с хранилищем данных в синхронном режиме.
  • Обратная запись: запись производится в кэш, а затем данные записываются в основное хранилище пакетами.
  • Write-around: запись производится в хранилище данных, а чтение — из кэша; обновление кэша происходит по запросу.

Почему это снижает нагрузку и ускоряет работу

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

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

Краткое руководство: выбор шаблона

Используйте их в качестве отправной точки при выборе рабочего процесса:

  • Отдавайте предпочтение стратегии cache-aside, если ваше приложение может самостоятельно решать, что именно хранить и когда обновлять данные.
  • Выбирайте стратегию read-through, если хотите, чтобы кэш брал на себя выборку данных из хранилища "при необходимости".
  • Рассмотрите возможность использования стратегий write-through или write-back, если важен характер выполнения операций записи и вам требуется четко определенный подход к повторной синхронизации.

Преимущества и области применения кэширования

Более быстрые ответы при меньшем объеме работы на сервере

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

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

Более эффективное использование вычислительных ресурсов и ресурсов хранения данных

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

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

Практическое применение (где используется кэширование)

Веб-сайты: более быстрая загрузка страниц и сокращение числа циклов обмена данными

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

Типовые варианты использования на веб-сайтах
  • Кэшировать вывод всей страницы для повторных просмотров.
  • Кэшируйте статические ресурсы с помощью механизмов кэширования в сети или CDN.
Приложения и API: ускоренное чтение общих данных

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

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

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

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

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

Примеры, которые можно сопоставить с бизнес-нагрузками
  • Данные сеансов для веб- и мобильных приложений (кратковременные, большие объемы).
  • Часто считываемые операционные справочные данные (ценообразование, общие ресурсы).

Типы кэша

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

Кэш браузера (на стороне клиента)

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

Типичные варианты использования
  • Статические ресурсы сайта, такие как изображения, CSS-файлы и файлы JavaScript.
  • Сокращение числа обращений к исходному серверу за ранее полученными ресурсами.

Кэш на стороне сервера

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

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

Кэш CDN

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

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

Кэш ЦП или оперативной памяти

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

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

Кэш памяти (в оперативной памяти) — это простейший тип программного кэша: хранилище данных, размещенное в адресном пространстве одного процесса и доступное этому процессу напрямую.

Типичные варианты использования
  • Кэш ЦП: многократное обращение к одним и тем же инструкциям или данным без частых обращений к основной памяти.
  • Кэш в оперативной памяти: быстрое чтение небольших объемов относительно статических данных в рамках одного запущенного сервиса.

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

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

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

Начните использовать кэширование

Почему кэширование по-прежнему важно

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

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

Практический способ начать

Начните с малого и сосредоточьтесь на данных, которые приносят наиболее очевидную отдачу:

  • Кэшируйте данные, которые редко изменяются, но часто считываются и требуют много времени для получения (например, справочные данные).
  • Определите, когда данные попадают в кэш:
    • По запросу — начиная с первого обращения, — поэтому вы храните только то, что действительно используется.
    • Предварительно загрузите (заполните) некоторые элементы при запуске, если знаете, что они понадобятся на раннем этапе, — при этом следите за нагрузкой на исходное хранилище в процессе запуска.
  • Выберите шаблон, который сможете поддерживать. Шаблон cache-aside широко распространен, и связанные с ним рекомендации подчеркивают, как истечение срока действия, вытеснение и согласованность данных влияют на результаты.

Поддерживайте актуальность кэшированных данных (и обеспечивайте устойчивость системы)

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

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

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

градиентный фон
Ресурсы

Ресурсы

Обучение
Ресурсы Azure
Изучайте новейшие технологии для разработчиков и осваивайте новые навыки.
Образование
Ресурсы для разработчиков-учащихся
Приобретите навыки, которые помогут вам ускорить свою карьеру с первых шагов и изменить мир к лучшему.
Мероприятия
Мероприятия и вебинары Azure
Приобретайте новые навыки, знакомьтесь с новыми технологиями и налаживайте контакты с сообществом — как в онлайн-формате, так и лично.
Вопросы и ответы

Вопросы и ответы

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