Сравнение внутрипроцессного кеша и Redis

Redis

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

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

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

  • Внутрипроцессный кеш: самый простой из них может напрямую использовать хеш-таблицу языка (Java HashMap, словарь Python и т. д.) или некоторые сторонние библиотеки с более полными функциями.

  • Кэш вне процесса: распространенный, такой как Redis, Memcache и т. д.

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

/ Кэш внутри процесса Redis
Горизонтальное расширение трудность Простой
надежный / простой в использовании Без истечения срока действия, вытеснения памяти и т. д. надежный
скорость доступа Прямая манипуляция переменными с низкой задержкой Требуется передача по сети и сериализация
может сохранять ссылочные типы Может сохранять ссылочные типы может хранить только строки

Недостатки внутрипроцессного кэша

Недостаток 1. Не способствует горизонтальному расширению

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

В этом сценарии, если используется внутрипроцессный кеш, это означает, что каждый узел имеет свое собственное «состояние», что приводит к изменению кеша на узле A, но кэшированные данные на узле B не изменяются. из узла B снова вы получите старые данные, которые не изменились, что несовместимо с узлом A.

Это несоответствие может быть разрешено следующим образом:

Способ 1: синхронизировать данные

  • Метод: при обновлении кеша в узле синхронизировать изменения данных со всеми другими узлами.
  • недостаток:
    1. Одни и те же данные имеют копию на каждом узле, что приводит к трате памяти.
    2. Задержка синхронизации неизвестна, и синхронизация может быть не завершена в течение определенного периода времени после модификации, а старые данные считываются.
    3. Объем синхронизируемых данных велик, а сетевые накладные расходы велики; с количеством узловNрост, потому что для синхронизации с каждым другим узлом отправьтеN-1данные, неприемлемые
    4. Поскольку этот метод эквивалентен наличию нескольких мастер-узлов с возможностью записи, синхронизация приведет к тому, что данныенепоследовательный(Значение, измененное первым, может быть перезаписано и изменено позже), как показано ниже:
      在这里插入图片描述

Способ 2: липкая сессия:

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

Столкнувшись с этой проблемой, ее можно избежать, отправив все записи на один и тот же ключ на один и тот же узел.

  • Метод: отправить на указанный узел во время балансировки нагрузки
  • Недостатки: служба балансировки нагрузки требует дополнительной логики, сложная реализация

Недостаток 2. Низкая надежность и неполные функции

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

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


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

Преимущество 1. Более быстрый доступ

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

Преимущество 2. Можно сохранять ссылочные типы

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

Например: Кэшировать объект запланированной задачи

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

Суммировать

Функции кэширования вне процесса, такие как Redis, относительно полны, и, как правило, вы можете использовать их напрямую.

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

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