Локальный кеш и распределенный кеш

Java

Введение

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

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

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

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

локальный кеш

Преимущества и недостатки

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

выполнить

ConcurrentHashMap или HashMap: поскольку HashMap не является потокобезопасным, а локальный кеш должен считываться и записываться одновременно разными потоками сервера, ConcurrentHashMap обычно используется в качестве реализации локального кеша в программировании на Java. Но если кеш постоянный, вы также можете использовать HashMap в качестве хранилища. Инструмент Cache: использование реализации Cache в наборе инструментов Google guava, помимо функции кэширования, также имеет такие функции, как временная недействительность и перезагрузка.

Применимая сцена

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

Распределенный кеш

Преимущества и недостатки

Поддержка хранения больших данных, не зависящая от перезапуска процесса приложения. Распределенный кэш — это независимо развернутый процесс, который имеет собственное независимое пространство памяти и не будет затронут перезапуском процесса службы приложения. Распределенный кэш поддерживает масштабирование в кластере, поэтому можно кэшировать большие объемы данных. Централизованное хранение данных для обеспечения согласованности данных При развертывании экземпляра процесса приложения каждый узел развертывания получает доступ к данным из распределенного кеша, и не возникает проблемы несогласованности данных в нескольких экземплярах, когда данные обновляются, как локальный кеш. Разделение чтения и записи данных, высокая производительность, высокая доступность Распределенный кэш может реализовать разделение чтения и записи и решить проблему производительности чтения и записи данных в сценариях с высокой степенью параллелизма. Поскольку несколько узлов кэша хранят данные избыточно, можно повысить доступность кэшированных данных и избежать проблемы недоступности данных, вызванной простоем узла кэша. Данные нужно передавать по сети, а производительность ниже, чем у локального кеша Распределенный кеш не зависит от процесса приложения-службы и нуждается в передаче данных по сети.По сравнению с операцией чтения данных внутри процесса локального кеша производительность будет ниже.

выполнить

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

Применимая сцена

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