Подтвердить что ты не робот

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

Современная база данных обеспечивает поддержку кэширования. Кэш-память ORM также извлекает данные. Почему это дублирование необходимо?

4b9b3361

Ответ 1

Поскольку для получения данных из кеша базы данных вам все равно необходимо:

  • Сгенерировать SQL из собственного формата запросов ORM
  • Выполняйте сетевое взаимодействие на сервере базы данных
  • Разбор SQL
  • Получение данных из кэша
  • Сериализовать данные в базе данных по проводному формату
  • Дезертициализация данных в формате клиентской библиотеки базы данных
  • Преобразование формата библиотеки данных клиента базы данных в объекты уровня языка (т.е. набор ударов)

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

Ответ 2

Вот несколько причин, по которым вам может понадобиться следующее:

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

Ответ 3

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

Структура ORM работает в том же пространстве, что и ваше приложение. Так что туда нет. Это просто доступ к памяти, который, как правило, намного быстрее.

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

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

Ответ 4

Кроме того, кеш базы данных может быть не таким практичным, как вы думаете. Я скопировал это из http://highscalability.com/bunch-great-strategies-using-memcached-and-mysql-better-together - он специфичен для MySQL, tho.

Учитывая, что MySQL имеет кеш, зачем вообще нужна memcached?

Кэш MySQL связан только с одним экземпляром. Это ограничивает кеш максимальным адресом одного сервера. Если ваша система больше памяти для одного сервера, то использование кеша MySQL не будет работать. И если один и тот же объект считывается из другого экземпляра, он не кэшируется.

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

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

Ответ 5

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

К этому следует добавить, что кеширование данных в любом месте, кроме dbms (NOT "database" ), создает проблему потенциально устаревших данных, которые все еще представлены как "обновленные".

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

Учитывайте это каждый раз, когда важна точность и согласованность.

Ответ 6

Здесь много хороших ответов. Я добавлю еще один момент: я знаю свой шаблон доступа, база данных этого не делает.

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

Я знаю, что я вернусь к кусочку данных несколько раз в течение следующего, так что важно оставаться в стороне. БД должна угадать, что хранить в кеше, у нее нет информации, которую я делаю. Поэтому, если я извлекаю его из БД снова и снова, он может быть не в кеше, если сервер занят. Я могу получить пропущенный кэш. С моим кешем я могу быть уверен, что получаю удар. Это особенно верно для данных, которые нетривиальны для получения (т.е. Нескольких объединений, некоторых функций группы), а не только одной строки. Получение строки с первичным ключом 7 легко для БД, но если она должна выполнить какую-то реальную работу, стоимость промаха в кеше намного выше.

Ответ 7

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

Ответ 8

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

Хорошим компромиссом было бы скопировать данные для того, что вы хотите кэшировать. Имейте основной сервер, который обновляет обновления кластеров, время, когда отправлять/накачивать обновления должно быть адаптировано для каждой таблицы в зависимости от настроек TTL (время жизни).

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

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

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

Если вы используете ORM-кеширование, тогда придерживайтесь простого правила... кешируйте простые объекты, которые вряд ли когда-либо меняются (например, данные о пользователе/​​роли) и которые являются небольшими по размеру и многократно ударяются в запрос... если его вне этого, я предлагаю группировать данные для производительности.