Когда Redis? Когда в MongoDB? [закрыто]

466

То, что я хочу, это не сравнение между Redis и MongoDB. Я знаю, что они разные; производительность и API совершенно разные.

Redis очень быстрый, но API очень «атомарный». MongoDB потребляет больше ресурсов, но API очень прост в использовании, и я очень доволен этим.

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

Так что вы думаете об использовании их обоих? Когда выбрать Redis? Когда выбрать MongoDB?

гуйлинь 桂林
источник

Ответы:

308

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

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

MongoDB предлагает простоту, намного более короткую кривую обучения для разработчиков с традиционным опытом работы с БД и SQL. Тем не менее, нетрадиционный подход Redis требует больше усилий для обучения, но большую гибкость.

Например. Кэш слой , вероятно , может быть лучше реализована в Redis. Для данных с большим количеством схем MongoDB лучше. [Примечание: и MongoDB, и Redis технически не имеют схем]

Если вы спросите меня, мой личный выбор - Redis для большинства требований.

Наконец, я надеюсь, что вы уже видели http://antirez.com/post/MongoDB-and-Redis.html

Шекхар
источник
16
К вашему сведению, mongodb не имеет схемы.
Озгюр
18
MogoDB не имеет схемы. и поскольку данные, хранящиеся в базе данных, становятся все больше и больше, MongoDB доказывает, что это намного быстрее, чем Redis. Redis работает быстрее только тогда, когда хранимых данных мало.
Андерсон
4
Мне нравится, что MongoDB не использует схемы, а затем оставляет авторам ORM возможность реализовывать схемы для тех, кто в них нуждается. Mongoose - отличный ORM, который представляет простые в использовании схемы, если они вам нужны :)
Chev
18
Вы должны знать, что размер базы данных redis ограничен объемом оперативной памяти в машине. Больше, чем это, и вы должны думать о кластеризации, которая является ручной и интенсивной.
Акаш Агравал
4
MongoDB не применяет схему, но я хотел бы видеть случай, когда кто-то использует ее без схемы ... это все, как вы определяете слово схема
Робби Гилфойл
236

Я только заметил, что этот вопрос довольно старый. Тем не менее, я считаю, что стоит добавить следующие аспекты:

  • Используйте MongoDB, если вы еще не знаете, как собираетесь запрашивать ваши данные.

    MongoDB подходит для хакатонов, стартапов или каждый раз, когда вы не знаете, как будете запрашивать вставленные вами данные. MongoDB не делает никаких предположений относительно вашей базовой схемы. Хотя MongoDB не имеет схемы и не является реляционной, это не означает, что схемы вообще нет. Это просто означает, что ваша схема должна быть определена в вашем приложении (например, с помощью Mongoose). Кроме того, MongoDB отлично подходит для создания прототипов или тестирования. Его производительность не так уж велика и не может сравниться с Redis.

  • Используйте Redis для ускорения вашего существующего приложения.

    Redis может быть легко интегрирован как LRU-кеш . Очень редко использовать Redis в качестве автономной системы баз данных (некоторые люди предпочитают называть ее хранилищем «ключ-значение»). Такие сайты, как Craigslist, используют Redis рядом с их основной базой данных . Antirez (разработчик Redis) продемонстрировал с помощью Lamernews, что действительно возможно использовать Redis в качестве отдельной системы баз данных.

  • Redis не делает никаких предположений на основе ваших данных.

    Redis предоставляет кучу полезных структур данных (например, Sets, Hashes, Lists), но вы должны явно определить, как вы хотите хранить ваши данные. Короче говоря, Redis и MongoDB могут быть использованы для достижения аналогичных целей. Redis просто быстрее, но не подходит для прототипирования. Это один из случаев, когда вы предпочитаете MongoDB. Кроме того, Redis действительно гибкий. Базовые структуры данных, которые он предоставляет, являются строительными блоками высокопроизводительных систем БД.

Когда использовать Redis?

  • Кэширование

    Кэширование с использованием MongoDB просто не имеет большого смысла. Это было бы слишком медленно.

  • Если у вас есть достаточно времени, чтобы подумать о дизайне вашей БД.

    Вы не можете просто добавить свои документы в Redis. Вы должны думать о том, как вы хотите хранить и систематизировать свои данные. Одним из примеров являются хэши в Redis. Они сильно отличаются от «традиционных» вложенных объектов, а это означает, что вам придется переосмыслить способ хранения вложенных документов. Одним из решений будет сохранение ссылки внутри хеша на другой хеш (что-то вроде ключа: [идентификатор второго хеша] ). Другой идеей было бы сохранить его как JSON, что кажется нелогичным для большинства людей с * SQL-фоном.

  • Если вам нужна действительно высокая производительность.

    Превзойти производительность Redis практически невозможно. Представьте, что ваша база данных работает так же быстро, как и ваш кеш. Вот каково это использовать Redis в качестве реальной базы данных.

  • Если вы не заботитесь , что много о масштабировании.

    Масштабирование Redis не так сложно, как раньше. Например, вы можете использовать своего рода прокси-сервер для распределения данных между несколькими экземплярами Redis. Подчиненная репликация не что сложно, но распределяя вам ключи между несколькими потребностями Redis-экземплярам быть сделано на месте применения (например , с использованием хэш-функции, Modulo и т.д.). Масштабирование MongoDB для сравнения намного проще.

Когда использовать MongoDB

  • Прототипирование, Стартапы, Хакатоны

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

  • Когда вам нужно быстро изменить схему.

    Потому что нет схемы! Изменение таблиц в традиционных реляционных СУБД мучительно дорого и медленно. MongoDB решает эту проблему, не делая много предположений о ваших базовых данных. Тем не менее, он пытается оптимизировать, насколько это возможно, не требуя определения схемы.

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

Дальнейшее чтение:

Александр Гугель
источник
3
Если у вас есть достаточно времени, чтобы подумать о дизайне вашей БД. Чтобы понять это: предположим, что вы хотите хранить SO данные. В Mongo : просто сбросьте полные вопросы с вложенными ответами и комментариями, но в redis вы должны сделать следующее: ТАК на redis
Абхишек Гупта
223

Redis. Допустим, вы написали сайт на php; по какой причине, он становится популярным, и это впереди своего времени или имеет порнографический на нем. Вы понимаете, что этот php так чертовски медленен: «Я потеряю своих фанатов, потому что они просто не будут ждать страницу 10 секунд». Вы внезапно осознали, что веб-страница имеет постоянный URL (он никогда не меняется, воу), если хотите, первичный ключ, и затем вы вспоминаете, что память работает быстро, а диск медленный, а php - медленнее. :( Затем вы создаете механизм хранения, используя память и этот URL, который вы называете «ключом», а контент веб-страницы вы решаете назвать «значением». Это все, что у вас есть - ключ и контент. Вы называете это «кэш мемов». Тебе нравится Ричард Докинз, потому что он клевый. Ты кешируешь свой html, как белки кешируют свои орехи. Тебе не нужно переписывать свой дерьмовый php-код. Вы счастливы. Затем вы видите, что другие сделали это, но вы выбираете Redis, потому что у другого запутанные изображения кошек, некоторые с клыками.

Монго. Вы написали сайт. Черт, ты написал много и на любом языке. Вы понимаете, что большую часть своего времени вы тратите на написание этих вонючих предложений SQL. Вы не dba, но все же вы пишете глупые SQL-заявления ... не просто одно, а бесит везде. msgstr "выбрать это, выбрать это". Но, в частности, вы помните раздражающее предложение ГДЕ. Где фамилия равна «Торнтон», а фильм - «плохой Санта». Urgh. Вы думаете: «Почему эти dbas просто не выполняют свою работу и не дают мне некоторые хранимые процедуры?» Затем вы забываете какое-то второстепенное поле, такое как middlename, и затем вам нужно удалить таблицу, экспортировать все 10 ГБ больших данных и создать другое с этим новым полем, а также импортировать данные - и это будет продолжаться 10 раз в течение следующих 14 дней, пока вы продолжать помнить дерьмо, как приветствие, название, плюс добавление внешнего ключа с адресами. Затем вы понимаете, что фамилия должна быть фамилией. Почти одна смена в день. Тогда вы говорите, Дарнит. Я должен войти и написать веб-сайт / систему, не говоря уже о модели данных бс. Так что вы гуглите: «Я ненавижу писать SQL, пожалуйста, не используйте SQL, остановите его», но всплывает «nosql», а затем вы читаете некоторые вещи, и они говорят, что они просто сбрасывают данные без какой-либо схемы. Вы помните фиаско на прошлой неделе, бросая больше столов и улыбаться. Затем вы выбираете монго, потому что некоторые крупные парни, такие как «airbud», используют этот сайт. Сладкий. Больше не нужно менять модель данных, потому что у вас есть модель, которую вы продолжаете изменять.

Gabe Rainbow
источник
что вы подразумеваете под You don't need to rewrite your crap php code?, как kv store решает это? :)
Рой Ли
13
@Roylee он имеет в виду, что медленный и дрянной php выводит веб-страницу в html. Вместо того, чтобы старательно переписывать код, чтобы сделать его быстрее / эффективнее, вы запускаете php один раз в начале, а потом навсегда, просто вспомните предварительно созданную веб-страницу в html, используя ваш kv store.
Mikepote
То, как вы рассказали эту историю, помогло мне, наконец, осмыслить, почему без схемы это круто! Просто избавил меня от пары лет работы с SQL, чтобы понять всю мощь.
Ник Пинеда
4
«Больше никаких изменений в модели» на самом деле не отражает ситуацию. Если вы не пишете код движения данных для обновления всех существующих записей, то, скорее всего, у вас есть «N» немного разных моделей, которые все живут в одной и той же БД в одно и то же время, и вы должны выяснить, с какой моделью она работает, когда он читает что-то из БД.
Терри Коатта
2
Один из самых лучших ответов, которые я когда-либо видел. У этого есть большой контент и фактически заставляет меня смеяться вслух (буквально не lol)
colbyJax
16

Может быть, этот ресурс полезен, помогая решить между ними. Он также обсуждает несколько других баз данных NoSQL и предлагает краткий список характеристик, а также объяснение «что я бы использовал» для каждой из них.

http://kkovacs.eu/cassandra-vs-mongodb-vs-couchdb-vs-redis

stackex
источник
11

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

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

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

Брайан Мильориси
источник
10

Redis - это хранилище данных в памяти , которое может сохранять свое состояние на диске (чтобы включить восстановление после перезапуска). Однако наличие хранилища данных в памяти означает, что размер хранилища данных (на одном узле) не может превышать общее пространство памяти в системе (физическое ОЗУ + пространство подкачки). В действительности это будет намного меньше, поскольку Redis разделяет это пространство со многими другими процессами в системе, и если он исчерпывает пространство системной памяти, он, вероятно, будет уничтожен операционной системой.

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

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

aaa90210
источник
10

Все ответы (на момент написания этой статьи) предполагают, что каждый из Redis, MongoDB и, возможно, реляционной базы данных на основе SQL, по сути, является одним и тем же инструментом: «хранить данные». Они вообще не рассматривают модели данных.

MongoDB: сложные данные

MongoDB - это хранилище документов. Для сравнения с реляционной базой данных на основе SQL: реляционные базы данных упрощаются до индексированных CSV-файлов, каждый из которых представляет собой таблицу; хранилища документов упрощаются до индексированных файлов JSON, каждый из которых является документом, с несколькими файлами, сгруппированными вместе.

Файлы JSON похожи по структуре на файлы XML и YAML, а также на словари, как в Python, поэтому подумайте о своих данных в такой иерархии. При индексации структура является ключом: документ содержит именованные ключи, которые содержат дополнительные документы, массивы или скалярные значения. Рассмотрим приведенный ниже документ.

{
  _id:  0x194f38dc491a,
  Name:  "John Smith",
  PhoneNumber:
    Home: "555 999-1234",
    Work: "555 999-9876",
    Mobile: "555 634-5789"
  Accounts:
    - "379-1111"
    - "379-2574"
    - "414-6731"
}

Приведенный выше документ имеет ключ PhoneNumber.Mobile, который имеет значение 555 634-5789. Вы можете искать в коллекции документов, где ключ PhoneNumber.Mobileимеет значение; они проиндексированы.

Он также имеет массив, Accountsкоторый содержит несколько индексов. Можно запросить документ, который Accountsсодержит ровно некоторое подмножество значений, все некоторое подмножество значений или какое -либо подмножество значений. Это означает, что вы можете искать Accounts = ["379-1111", "379-2574"]и не найти выше; Вы можете найти Accounts includes ["379-1111"]и найти вышеуказанный документ; и вы можете найти Accounts includes any of ["974-3785","414-6731"]и найти вышеупомянутое, и любой другой документ включает в себя учетную запись "974-3785", если таковая имеется.

Документы идут так глубоко, как вы хотите. PhoneNumber.Mobileможет содержать массив или даже поддокумент ( PhoneNumber.Mobile.Workи PhoneNumber.Mobile.Personal). Если ваши данные хорошо структурированы, документы являются большим шагом по сравнению с реляционными базами данных.

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

Для большинства проектов вам придется идти на компромисс, принимая небольшой обходной путь в некоторых небольших областях, где хранилища SQL или документов не подходят; для некоторых крупных и сложных проектов, в которых хранится широкий разброс данных (много столбцов; строки не имеют значения), имеет смысл хранить некоторые данные в одной модели и другие данные в другой модели. Facebook использует и базу данных SQL, и графическую базу данных (где данные помещаются в узлы, а узлы соединяются с другими узлами); Craigslist использовал MySQL и MongoDB, но пытался полностью перейти на MongoDB. Это те места, где диапазон и взаимосвязь данных сталкиваются с существенными препятствиями, если рассматривать их в рамках одной модели.

Redis: ключ-значение

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

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

Наиболее очевидным случаем аннулирования является обновление при записи: если вы читаете user:Simon:lingots = NOTFOUND, вы можете SELECT Lingots FROM Store s INNER JOIN UserProfile u ON s.UserID = u.UserID WHERE u.Username = Simonи сохранить результат 100, как SET user:Simon:lingots = 100. Затем , когда вы наградите Simon 5 lingots, вы читаете user:Simon:lingots = 100, SET user:Simon:lingots = 105и UPDATE Store s INNER JOIN UserProfile u ON s.UserID = u.UserID SET s.Lingots = 105 WHERE u.Username = Simon. Теперь у вас есть 105 в вашей базе данных и в Redis, и вы можете получить user:Simon:lingotsбез запросов к базе данных.

Второй случай - обновление зависимой информации. Допустим, вы генерируете фрагменты страницы и кэшируете их вывод. Заголовок показывает опыт игрока, уровень и сумму денег; Страница профиля игрока имеет блок, который показывает их статистику; и так далее. Игрок получает некоторый опыт. Ну, теперь у вас есть несколько templates:Header:Simon, templates:StatsBox:Simon, templates:GrowthGraph:Simonи так далее поля , где вы кэшировать вывод полдюжины базы данных запросов , выполняемых через механизм шаблонов. Обычно, когда вы отображаете эти страницы, вы говорите:

$t = GetStringFromRedis("templates:StatsBox:" + $playerName);
if ($t == null) {
  $t = BuildTemplate("StatsBox.tmpl",
                     GetStatsFromDatabase($playerName));
  SetStringInRedis("Templates:StatsBox:" + $playerName, $t);
}
print $t;

Поскольку вы только что обновили результаты GetStatsFromDatabase("Simon"), вы должны templates:*:Simonисключить из кэша ключ-значение. Когда вы пытаетесь отобразить любой из этих шаблонов, ваше приложение будет собирать данные из вашей базы данных (PostgreSQL, MongoDB) и вставлять их в ваш шаблон; затем он сохранит результат в Redis и, надеюсь, не будет беспокоиться о том, чтобы выполнять запросы к базе данных и отображать шаблоны при следующем отображении этого блока вывода.

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

Вывод

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

Джон Мозер
источник
2
«Аннулирование кэша - одна из трудных проблем информатики; другая - называть вещи». Это точно!
Арель
2

И вы не должны использовать ни один, если у вас много оперативной памяти. Redis и MongoDB приходят к цене универсального инструмента. Это вводит много накладных расходов.

Было высказывание, что Redis в 10 раз быстрее, чем Mongo. Возможно, это уже не так. MongoDB (если я правильно помню) утверждал, что бьет memcache для хранения и кэширования документов, если конфигурации памяти одинаковы.

Так или иначе. Redis хорошо, MongoDB это хорошо. Если вы заботитесь о подструктурах и нуждаетесь в агрегировании, перейдите на MongoDB. Если хранение ключей и значений является вашей главной заботой, то все дело в Redis. (или любое другое хранилище значений ключей).

Мартин Керстен
источник
2

Redis и MongoDB - это нереляционные базы данных, но они относятся к разным категориям.

Redis - это база данных Key / Value, и она использует хранилище в памяти, что делает ее очень быстрой. Это хороший кандидат для кеширования и временного хранения данных (в памяти), и поскольку большинство облачных платформ (таких как Azure, AWS) поддерживают его, его использование памяти масштабируемое. Но если вы собираетесь использовать его на своих компьютерах с ограниченные ресурсы, считайте, что это использование памяти.

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

аказемись
источник
1

Если ваш проект позволяет поддерживать достаточное количество оперативной памяти в вашей среде - ответ Redis. Особенно с учетом нового Redis 3.2 с функциональностью кластера.

Denys
источник