Разъяснение по кешированию базы данных - PullRequest
0 голосов
/ 29 января 2020

Поправьте меня, если я ошибаюсь, но, насколько я понимаю, «кэши базы данных» обычно реализуются с базой данных в памяти, локальной для веб-сервера (той же машины, что и веб-сервер). Кроме того, эти «кэши базы данных» хранят фактические результаты запросов. Я также ознакомился с несколькими стратегиями кэширования, такими как - кэширование в стороне, чтение через, запись через, запись сзади, запись вокруг.

В некоторых условиях стратегия сквозной записи выглядит следующим образом: Write Through strategy и стратегия Cache Aside выглядит следующим образом: Cache Aside strategy

Я считаю, что «Приложение» относится к внутреннему серверу с API REST.

Мой первый вопрос: как это работает в стратегии Write Through (приложение записывает в кэш, затем кэширует в базу данных)? Насколько я понимаю, наиболее часто используемые кэши баз данных - это Redis или Memcached, которые являются просто хранилищами значений ключей. Предположим, у вас есть реляционная база данных в качестве основной базы данных. Как эти хранилища значений ключей собираются выполнить обратную запись в реляционную базу данных? Применяются ли эти стратегии только в том случае, если ваша основная база данных также является хранилищем значений ключей?

В стратегии сквозной записи (или сквозной чтения) кэш находится между приложением и базой данных. Как это вообще работает? Как вы получаете кеш для общения с сервером базы данных? Насколько я понимаю, веб-сервер (приложение) всегда обеспечивает связь между кешем и основной базой данных, что по сути является стратегией Cache Aside. Если Redis не обладает какой-либо функциональностью, позволяющей ему общаться с другой базой данных, я не совсем понимаю, как это работает.

Разве нельзя смешивать и сопоставлять стратегии кэширования? Насколько я понимаю, Cache Aside и Read Through - это стратегии кеширования для чтения приложения (пользователь хочет прочитать данные), а Write Through и Write Behind - это стратегии кеширования записи приложения (пользователь хочет записать данные). Не могли бы вы иметь стратегию, которая использует как Cache Aside, так и Write Through? Почему большинство статей всегда изображают их как независимые стратегии?

Что произойдет, если у вас есть кластер веб-серверов? У каждого из них есть своя собственная локальная база данных в памяти, которая действует как кеш?

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

1 Ответ

0 голосов
/ 29 января 2020

Введение и уточнение

Полагаю, у вас есть одно недопонимание, что кэш НЕ хранится явно на том же сервере, что и сервер werb. Иногда даже база данных не работает на своем собственном сервере с веб-сервера. Если вы думаете об API, таких как HTTP REST API, вы можете использовать кэширование, чтобы не тратить слишком много ресурсов на соединения и запросы к базе данных. Как правило, вы хотите использовать как можно меньше соединений и запросов к базе данных. Теперь представьте следующую настройку:

У вас есть werbserver, который обслуживает ваше приложение, и REST API, который используется веб-сервером для работы с некоторыми ресурсами. Эти ресурсы поступают из базы данных (скажем, реляционной базы данных), которая также хранится на том же сервере. Теперь есть одна конечная точка, которая обслуживает, например, список posts (например, посты в блоге). Каждый пользователь может получить все сообщения (для простоты в этом примере). Теперь у нас есть случай, когда можно сказать, что этот запрос API можно кэшировать, чтобы не позволить всем пользователям всегда запускать базу данных, просто запрашивать одни и те же ресурсы (через REST API) снова и снова. Вот идет кеширование . Redis - это один из многих инструментов, которые можно использовать для кэширования. Поскольку redis - это простое хранилище значений ключей в памяти, вы можете просто поместить все свои сообщения (вспомните REST API) после первого запроса DB в кэш. Все будущие запросы на список постов будут сначала проверять, кэшированы ли посты или нет. Если это так, API вернет кеш-контент для этого указанного c запроса.

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

Ответы на ваш вопрос

Мой первый вопрос: зачем вам запись в кеш?

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

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

Это не поможет вам с обновлением, но вместо этого поможет вам тратить меньше ресурсов. Это также помогает вам с точки зрения «временного резервного копирования» некоторых данных - но это лишь очень небольшой побочный эффект. Для этого есть более привлекательные решения (так как redis также не является постоянным по умолчанию. Но он поддерживает постоянство. )

Применяют ли эти стратегии записи в кэш только если ваш основной база данных также является хранилищем значений ключей?

Нет, не важно, какую базу данных вы используете. Будь то No SQL или SQL DB. Это сильно зависит от того, что вы хотите кэшировать и как база данных и ее таблицы настроены. Есть ли у вас частые изменения в ваших ресурсах? Обновляются ли ресурсы вручную или только по действиям, инициированным пользователем? Это вопросы, которые приведут вас к правильной реализации кэширования.

Разве нельзя смешивать и подбирать стратегии кэширования?

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

Что произойдет, если у вас есть кластер веб-серверов? У каждого из них есть своя собственная локальная база данных в памяти, которая действует как кеш?

Полагаю, что оба варианта возможны. Обычно у вас есть одна база данных, может быть кластеризованная или синхронизированная с копиями, к которой ваши веб-серверы (например, API REST) ​​делают свои запросы. Затем, будь у каждого из ваших серверов API свой собственный кеш, чтобы вообще не запрашивать базу данных (в облачных приложениях ваша база данных также может быть на другом отдельном сервере - так что еще один «скачок» с точки зрения сетевого взаимодействия). ИЛИ (что я также могу себе представить) у вас есть другое промежуточное ПО между вашими API (кластеризованными) и вашей БД (возможно, также кластеризованными) - но я думаю, что никто не сделает этого из-за сетевого трафика c. Это может привести к более высокому времени отклика, что вы обычно хотите предотвратить.

Не могли бы вы реализовать кеш, используя обычную (не в памяти) базу данных?

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

Заключение

В общем, все дело в том, чтобы быть быстрым с точки зрения времени отклика и чтобы предотвратить много трафика сети c. Я надеюсь, что смогу немного помочь вам.

...