В серверной системе из-за ограниченной производительности чтения и записи базы данных часто возникают узкие места производительности в базе данных.Чтобы уменьшить нагрузку на доступ к базе данных, такие методы, как кэширование, разделение чтения и записи базы данных и таблица можно принять разделение.
Среди них можно сказать, что кэширование является предпочтительным решением в случае чрезмерного давления на чтение базы данных.
Кэши различают по местам хранения данных.Кэши можно разделить на два типа: внутрипроцессные кеши и внепроцессные кеши.
-
Внутрипроцессный кеш: самый простой из них может напрямую использовать хеш-таблицу языка (Java HashMap, словарь Python и т. д.) или некоторые сторонние библиотеки с более полными функциями.
-
Кэш вне процесса: распространенный, такой как Redis, Memcache и т. д.
В следующей таблице представлено сравнение некоторых преимуществ и недостатков между ними, а в следующей таблице эти преимущества и недостатки будут проанализированы один за другим.
/ | Кэш внутри процесса | Redis |
---|---|---|
Горизонтальное расширение | трудность | Простой |
надежный / простой в использовании | Без истечения срока действия, вытеснения памяти и т. д. | надежный |
скорость доступа | Прямая манипуляция переменными с низкой задержкой | Требуется передача по сети и сериализация |
может сохранять ссылочные типы | Может сохранять ссылочные типы | может хранить только строки |
Недостатки внутрипроцессного кэша
Недостаток 1. Не способствует горизонтальному расширению
Текущим внутренним программам часто требуется несколько узлов для балансировки нагрузки для предоставления внешних служб, а доступ к внутрипроцессному кешу может получить только этот узел.
В этом сценарии, если используется внутрипроцессный кеш, это означает, что каждый узел имеет свое собственное «состояние», что приводит к изменению кеша на узле A, но кэшированные данные на узле B не изменяются. из узла B снова вы получите старые данные, которые не изменились, что несовместимо с узлом A.
Это несоответствие может быть разрешено следующим образом:
Способ 1: синхронизировать данные
- Метод: при обновлении кеша в узле синхронизировать изменения данных со всеми другими узлами.
- недостаток:
- Одни и те же данные имеют копию на каждом узле, что приводит к трате памяти.
- Задержка синхронизации неизвестна, и синхронизация может быть не завершена в течение определенного периода времени после модификации, а старые данные считываются.
- Объем синхронизируемых данных велик, а сетевые накладные расходы велики; с количеством узлов
N
рост, потому что для синхронизации с каждым другим узлом отправьтеN-1
данные, неприемлемые - Поскольку этот метод эквивалентен наличию нескольких мастер-узлов с возможностью записи, синхронизация приведет к тому, что данныенепоследовательный(Значение, измененное первым, может быть перезаписано и изменено позже), как показано ниже:
Способ 2: липкая сессия:
Среди недостатков, перечисленных выше, проблема несогласованности данных, вызванная многоузловой записью, является наиболее серьезной.
Столкнувшись с этой проблемой, ее можно избежать, отправив все записи на один и тот же ключ на один и тот же узел.
- Метод: отправить на указанный узел во время балансировки нагрузки
- Недостатки: служба балансировки нагрузки требует дополнительной логики, сложная реализация
Недостаток 2. Низкая надежность и неполные функции
Redis предоставляет такие функции, как истечение срока действия ключа, регулярная очистка и удаление памяти, а также поддерживает различные стратегии устранения; и после многих лет широкомасштабного использования он имеет высокую надежность.
Еще одна проблема с внутрипроцессным кешем заключается в том, что он относительно прост и часто не имеет этих функций, с переполнением памяти и другими ситуациями, возможно, придется разбираться самостоятельно, что, несомненно, сложно.
Преимущества внутрипроцессного кэша
Преимущество 1. Более быстрый доступ
Из-за задержки ожидания сетевого взаимодействия между клиентом и Redis и дополнительной сериализации и десериализации данных скорость доступа, естественно, ниже, чем у внутрипроцессного кеша, который напрямую обращается к переменным памяти.
Преимущество 2. Можно сохранять ссылочные типы
Еще одним преимуществом внутрипроцессного кэширования является то, что оно может сохранять ссылочные типы, в то время как Redis может хранить только строки, что очень полезно в некоторых сценариях.
Например: Кэшировать объект запланированной задачи
В бизнесе часто необходимо разрешить выполнение задачи в определенный момент времени, и она может быть отменена до выполнения; В настоящее время с помощью внутрипроцессного кеша для сохранения объекта запланированного задания можно легко выполнить метод отмены запланированного задания на объекте, но с Redis это сделать сложно.
Суммировать
Функции кэширования вне процесса, такие как Redis, относительно полны, и, как правило, вы можете использовать их напрямую.
Но внутрипроцессное кэширование также может быть полезно в определенных сценариях, например:
- Данные относительно фиксированы: для данных, которые не сильно меняются, не важна проблема согласованности, вызванная обновлением данных.Использование внутрипроцессного кеша может обеспечить более высокую скорость доступа и избежать накладных расходов на сеть и сериализацию.
- Необходимо кэшировать ссылочные типы