paint-brush
Как улучшить пользовательский опыт и сократить расходы: вот почему вам следует использовать кешированиек@brilianfird
790 чтения
790 чтения

Как улучшить пользовательский опыт и сократить расходы: вот почему вам следует использовать кеширование

к Brilian Firdaus8m2024/05/10
Read on Terminal Reader

Слишком долго; Читать

Сегодня мы погружаемся в мир кэширования. Кэширование — это секретное оружие для создания масштабируемых высокопроизводительных систем. Существует много типов кэширования, но в этой статье мы сосредоточимся на кэшировании внутренних объектов (бэкэнд-кешировании). Его освоение поможет вам создавать высокопроизводительное и надежное программное обеспечение.
featured image - Как улучшить пользовательский опыт и сократить расходы: вот почему вам следует использовать кеширование
Brilian Firdaus HackerNoon profile picture
0-item

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


В этой статье мы рассмотрим:

  1. Что такое кэширование? Мы рассмотрим кэширование и объясним, как оно временно хранит данные для более быстрого доступа.


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


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


  4. Рекомендации по кэшированию . Теперь вы знаете, как хранить и извлекать кэшированные данные. Но как обеспечить актуальность кэшированных данных? А что произойдет, когда кэш достигнет своей емкости?


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

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

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


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


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

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

Основным преимуществом кэширования является его скорость. Чтение данных из кэша происходит значительно быстрее, чем их извлечение из базы данных (например, SQL или Mongo). Эта скорость достигается за счет кэшей, использующих структуры данных словаря (или HashMap) для быстрых операций и хранения данных в высокоскоростной памяти, а не на диске.


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


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


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

Шаблоны кэширования

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

Написание шаблонов

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

Написать ответ


Шаблон кэша с обратной записью

Как это работает:

  • Ваше приложение взаимодействует только с кешем.
  • Кэш мгновенно подтверждает запись.
  • Затем фоновый процесс копирует вновь записанные данные в базу данных.


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


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

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


Недостатки:

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


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


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

Написать через


Политика кэширования со сквозной записью

Как это работает:

  • Ваше приложение одновременно записывает данные как в кеш, так и в базу данных.


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


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

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


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


Недостатки:

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


  • Высокое использование кэша: все записи выполняются в кэш, что потенциально занимает место, даже если к данным обращаются нечасто.

Напишите вокруг


Шаблон кэша с обходом записи

Благодаря Write-Around ваше приложение записывает данные непосредственно в базу данных, минуя кеш во время процесса записи. Для заполнения кэша он использует стратегию, называемую шаблоном кэширования :


  1. Приходит запрос на чтение: Приложение проверяет кэш.


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


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

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


Недостатки:

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

Кэш-промах шаблона


Кэш-промах шаблона

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


  1. Кэш-отложенный
    • Приложение проверяет кэш.

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

    • Ключевой момент: приложение отвечает за управление кешем.


Использование шаблона Cache-Aside означает, что ваше приложение будет управлять кешем. Этот подход является наиболее распространенным в использовании, поскольку он прост и не требует разработки в других местах, кроме приложения.


  1. Прочитать
    • Приложение делает запрос, не зная о кеше.

    • Специализированный механизм проверяет кэш и при необходимости извлекает данные из базы данных.

    • Кэш обновляется прозрачно.


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


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

Лучшие практики кэширования

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

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

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


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


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

Политики замены кэша

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


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


  2. Наименее часто используемый (LFU): аналогичен LRU, но ориентирован на частоту доступа. Вновь записанные данные могут быть удалены, поэтому рассмотрите возможность добавления периода прогрева, в течение которого данные не могут быть удалены.


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

Когда не кэшировать

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


  1. Низкий трафик. Если у вашего приложения низкий трафик и время ответа по-прежнему приемлемое, вам, скорее всего, пока не нужно кэширование. Добавление кэша увеличивает сложность, поэтому его лучше всего применять, когда вы сталкиваетесь с узкими местами в производительности или ожидаете значительного увеличения трафика.


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

Вынос

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


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


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


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


  4. Управление политикой замены: выберите политику замены кэша (например, LRU), чтобы обрабатывать удаления, когда кэш достигает своей емкости.

Рекомендации

  1. https://gist.github.com/jboner/2841832
  2. https://www.bytesizedpieces.com/posts/cache-types
  3. https://www.techtarget.com/searchstorage/definition/cache
  4. https://www.youtube.com/watch?v=dGAgxozNWFE