Основы дизайна систем: кеширование

Кеширование - это очень фундаментальный и простой для понимания метод повышения производительности системы. Кеширование помогает уменьшить "задержку" (latency) в системе.

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

Общие сценарии кеширования

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

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

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

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

Если в вашей системе есть клиент (внешний интерфейс), а также сервер и базы данных (бекенд), то кеширование может быть добавлено на клиенте (например, в хранилище браузера), между клиентом и сервером (например, CDN) или на самом сервере. Это уменьшит количество обращений к базе данных по сети.

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

Обработка устаревших данных

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

  • операции записи требуют синхронизации кеша и базы данных
  • это может увеличить сложность, потому что необходимо выполнить больше операций, и необходимо тщательно проанализировать новые соображения, касающиеся обработки несинхронизированных или "устаревших" данных.
  • Для обработки этой синхронизации может потребоваться внедрение новых принципов проектирования - должно ли это выполняться синхронно или асинхронно? Если асинхронно, то с какими интервалами? Откуда в это время поступают данные? Как часто нужно обновлять кеш и т. д.
  • "вытеснение" данных или оборот и обновление данных, чтобы сохранять кешированные данные свежими и актуальными. К ним относятся такие методы, как LIFO, FIFO, LRU и LFU.

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

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


Читайте также:

Комментарии

Популярные сообщения из этого блога

Язык поисковых запросов в Graylog

Нормальные формы, пример нормализации в базе данных

Хэш-таблица: разрешение коллизий