Предлагаем ознакомиться с переводом статьи Антонелло Занини о кешировании: что это такое, как оно работает и какие типы кеширования являются наиболее важными.
За последние несколько лет информационные технологии значительно улучшили любой вид бизнеса. Между тем архитектуры программного обеспечения становятся все более сложными, и число их пользователей растет в геометрической прогрессии. Это вызывает проблемы с точки зрения работы любого приложения. Низкая производительность может подорвать стратегические цели любой компании, поэтому очень важно найти разумные способы ее улучшения. Как следствие, необходимо избежать накладных расходов и сократить время поиска и обработки данных. Вот почему в игру вступает кеширование, и ни один разработчик больше не может его игнорировать.
Сперва углубимся в концепцию кеширования, поймем, почему это важно, и возможные риски, связанные с этим. Затем мы изучим наиболее важные типы кеширования.
Кеширование — это механизм повышения производительности любого типа приложений. Технически кеширование — это процесс хранения и доступа к данным из кеша. Но подождите, что такое кеш? Кеш — это программный или аппаратный компонент, предназначенный для хранения данных, будущие запросы на которые могли бы обслуживаться быстрее.
Основная причина появления кеширования заключается в том, что доступ к данным из постоянной памяти занимает значительное время. Таким образом, всякий раз, когда данные извлекаются или обрабатываются, они должны храниться в быстрой оперативной памяти. Мы называем такую память «кешем», рассматриваемым как высокоскоростной уровень хранения данных, основная цель которого — уменьшить потребность в доступе к более медленным слоям хранения данных. Чтобы быть рентабельными и эффективными, кеши должны быть относительно небольшими, особенно по сравнению с традиционной памятью. Вот почему они обычно реализуются с использованием оборудования с быстрым доступом, такого как RAM (Random Access Memory, или оперативная память), плюс программный компонент.
Благодаря кешам можно реализовать механизм для эффективного повторного использования ранее извлеченных или вычисленных данных. При поступлении нового запроса запрашиваемые данные сначала ищутся в кэше. Попадание в кеш происходит, когда запрашиваемые данные могут быть найдены в кеше. Напротив, промах в кеш-памяти происходит тогда, когда запрашиваемые данные отсутствуют в кеше. Очевидно, предполагается, что считывание нужных данных из кешей происходит быстрее, чем повторное вычисление результата или его чтение из исходного хранилища данных. Таким образом, чем больше запросов обработается из кеша, тем быстрее будет работать система.
В заключение, кеширование — довольно простой способ добиться повышения производительности. Это особенно верно по сравнению с оптимизацией алгоритмов, которая обычно является очень сложной и трудоемкой задачей.
Кеширование чрезвычайно важно, поскольку позволяет разработчикам добиться повышения производительности, иногда значительно. Как говорилось выше, это жизненно необходимо.
В частности, ни пользователи, ни разработчики не хотят, чтобы приложения долго обрабатывали запросы. Как разработчикам, нам хотелось бы создавать наиболее производительную версию приложений. Как пользователи, мы не готовы ждать несколько секунд, а иногда и миллисекунд. На самом деле никто не любит тратить время на загрузку сообщений.
Кроме того, важность обеспечения высокой производительности настолько критична, что кеширование быстро стало неизбежной концепцией в компьютерных технологиях. Это значит, что все больше и больше сервисов используют его, так что оно практически вездесуще. Как следствие, если мы хотим конкурировать с множеством приложений на рынке, нужно правильно реализовать системы кеширования. Более того, достаточно проблематично объяснять пользователям, почему наши системы медленные.
Еще один значимый аспект кеширования — оно позволяет нам каждый раз избегать создания новых запросов или повторной обработки данных. Так что можно избежать накладных расходов, таких как накладные расходы на сеть, и уменьшить использование центрального процессора, особенно если запросы связаны со сложной обработкой. Это может продлить срок службы машин или серверов. Кроме того, отказ от создания новых запросов снижает общее количество необходимых запросов, что может снизить стоимость вашей инфраструктуры. Фактически, при работе с облачными платформами или поставщиками общедоступных API, например, принято выставлять счет за любую сетевую связь между их службами. Отличные побочные эффекты, не правда ли?
Кеширование — отнюдь не простая практика, и этому предмету присущи неизбежные проблемы. Давайте разберемся с самыми коварными.
Проблема согласованности
Поскольку всякий раз, когда данные кешируются, создается их копия, существует теперь две копии одних и тех же данных. Это значит, что со временем они могут расходиться. В двух словах, это вопрос согласованности — наиболее важная и сложная проблема, связанная с кешированием. Не существует конкретного решения, которое было бы предпочтительнее другого, и лучший подход зависит от требований. Определение наилучшего механизма обновления или аннулирования кеша — одна из самых больших проблем, связанных с кешированием, и, возможно, одна из самых сложных задач в научных изысканиях.
Выбор данных для кэширования
Кешировать можно практически любые данные. Значит, выбор того, что должно находиться в нашем кеше, а что следует исключить, открывает бесконечные возможности и, соответственно, может стать очень сложным. При решении этой проблемы необходимо учитывать некоторые аспекты. Во-первых, если мы ожидаем, что данные будут часто меняться, не следует кешировать их слишком долго. В противном случае мы можем предложить пользователям неточные данные. С другой стороны, это также зависит от того, сколько времени мы готовы хранить устаревшие данные. Во-вторых, кеш должен хранить часто запрашиваемые данные, для генерации или извлечения которых требуется много времени. Идентификация этих данных — непростая задача, и вы рискуете заполнить кеш бесполезными данными. В-третьих, кешируя большие данные, можно очень быстро заполнить кеш или, что еще хуже, использовать всю доступную память. Если оперативная память используется совместно приложением и системой кеширования, это легко может стать проблемой, поэтому следует ограничить объем оперативной памяти, зарезервированной для кеширования.
Работа с кеш-промахами
Промахи кеша увеличивают время, расходуемое на использование кеша. Фактически, недочеты в кеше приводят к задержкам, которых не было бы в системе, не использующей кеширование. Таким образом, для получения выгоды от увеличения скорости, обусловленной наличием кэша, количество промахов в кэше должно быть относительно низким. В частности, они должны быть минимальными по сравнению с попаданиями в кеш. Достичь этого результата непросто, а если его не достичь, система кэширования может превратиться в не более чем накладные расходы.
Хотя кеширование — это общая концепция, есть несколько типов, которые выделяются среди остальных. Они представляют собой ключевые концепции для любых разработчиков, заинтересованных в понимании наиболее распространенных подходов к кешированию, и их нельзя пропустить. Рассмотрим их все.
Кеширование в памяти
При таком подходе кэшированные данные хранятся непосредственно в оперативной памяти, которая, предположительно, работает быстрее, чем типичная система хранения, в которой расположены исходные данные. Наиболее распространенная реализация этого типа кэширования основана на базах данных типа «ключ-значение». Их можно рассматривать как наборы пар «ключ-значение». Ключ представлен уникальным идентификатором, а значение — кешированными данными.
По сути, это значит, что каждая часть данных идентифицируется уникальным значением. Указав это значение, база данных «ключ-значение» вернет связанные данные. Такое решение быстрое, эффективное и простое для понимания. Вот почему разработчики, пытаясь создать слой кеширования, обычно предпочитают такой подход.
Кеширование базы данных
Каждая база данных обычно имеет определенный уровень кеширования. В частности, внутренний кеш обычно используется, чтобы избежать чрезмерных запросов к базе данных. Кешируя результат последних выполненных запросов, база данных может немедленно предоставить ранее кешированные данные. Таким образом, в течение периода времени, когда желаемые кешированные данные действительны, база данных может избегать выполнения запросов. Хотя каждая база данных реализует это по-разному, наиболее популярный подход основан на использовании хеш-таблицы, в которой хранятся пары ключ-значение. Как и раньше, ключ используется для поиска значения. Обратите внимание, что такой тип кеша обычно предоставляется по умолчанию технологиями ORM (Object Relational Mapping).
Веб-кеширование
Его можно разделить на две дополнительные подкатегории:
Кеширование веб-клиента
Этот тип кеша знаком большинству пользователей Интернета и хранится на клиентах. Поскольку он обычно является частью браузеров, его также называют кешированием веб-браузера. Он работает очень интуитивно. При первой загрузке веб-страницы браузер сохраняет ресурсы страницы, такие как текст, изображения, таблицы стилей, сценарии и мультимедийные файлы. При следующем открытии той же страницы браузер может поискать в кеше ресурсы, которые ранее были кешированы, и получить их с компьютера пользователя. Обычно это намного быстрее, чем загружать их из сети.
Кеширование веб-сервера
Это механизм, предназначенный для хранения ресурсов на стороне сервера для повторного использования. В частности, такой подход полезен при работе с динамически генерируемым контентом, для создания которого требуется время. И наоборот, он бесполезен в случае статического содержимого. Кеширование веб-сервера позволяет избежать перегрузки серверов, сокращая объем работы, которую необходимо выполнить, и улучшает скорость доставки страниц.
Кеширование CDN
CDN расшифровывается как Content Delivery Network, и он предназначен для кеширования контента, такого как веб-страницы, таблицы стилей, сценарии и мультимедийные файлы, на прокси-серверах. Его можно рассматривать как систему шлюзов между пользователем и исходным сервером, хранящую его ресурсы. Когда пользователю требуется ресурс, прокси-сервер перехватывает его и проверяет, есть ли у него копия. Если есть, ресурс немедленно доставляется пользователю; в противном случае запрос пересылается на исходный сервер. Прокси-серверы размещены в огромном количестве мест по всему миру, а запросы пользователей динамически направляются к ближайшему из них. Таким образом, ожидается, что они будут ближе к конечным пользователям, чем исходные серверы, что подразумевает сокращение задержки в сети. Кроме того, это также снижает количество запросов к исходным серверам.
В этой статье мы рассмотрели, что такое кеширование и почему оно приобретает всё большее значение в информатике. В то же время важно учитывать угрозы и риски, связанные с кешированием. Внедрение работающей системы кеширования — непростая задача, требующая времени и опыта. Вот почему знание наиболее важных типов кеша является основополагающим для разработки правильной системы. Освоить их все — миссия каждого разработчика.
Переведено со статьи, полный текст доступен по ссылке.