Коли до Редіса? Коли до MongoDB? [зачинено]


466

Те, що я хочу, не є порівнянням між Redis і MongoDB. Я знаю, що вони різні; продуктивність та API абсолютно різні.

Redis дуже швидкий, але API дуже "атомний". MongoDB буде їсти більше ресурсів, але API дуже простий у використанні, і я дуже задоволений цим.

Вони обоє дивовижні, і я хочу використовувати Redis для розгортання якомога більше, але це важко кодувати. Я хочу використовувати MongoDB в розробці скільки завгодно, але для цього потрібна дорога машина.

То що ви думаєте про використання обох? Коли вибрати Редіс? Коли вибрати MongoDB?

Відповіді:


308

Я б сказав, це залежить від типу команди розробників та ваших потреб у програмі.

Наприклад, якщо вам потрібно багато запитів , це здебільшого означає, що ваші розробники будуть працювати більше, ніж Redis, де ваші дані можуть зберігатися в різних спеціалізованих структурах даних, налаштованих для кожного типу об'єктів для ефективності. У MongoDB такі самі запити можуть бути простішими, оскільки структура є більш послідовною для ваших даних. З іншого боку, у Redis велика швидкість відповіді на ці запити - це виплата за додаткову роботу щодо розмаїття структур, з якими можуть зберігатися ваші дані.

MongoDB пропонує простоту, набагато коротшу криву навчання для розробників з традиційним досвідом DB та SQL. Однак нетрадиційний підхід Редіса вимагає більше зусиль для навчання, але більшої гнучкості.

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

Якщо ви запитаєте мене, мій особистий вибір - це Redis для більшості вимог.

Нарешті, я сподіваюсь, ви вже побачили http://antirez.com/post/MongoDB-and-Redis.html


16
fyi, mongodb - це схематично.
Özgür

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 поруч із основною базою даних . Антирез (розробник Redis) продемонстрував за допомогою Lamernews, що дійсно можна використовувати Redis як окрему систему баз даних.

  • Redis не робить жодних припущень на основі ваших даних.

    Redis надає купу корисних структур даних (наприклад, набори, хеші, списки), але ви повинні чітко визначити, як ви хочете зберігати ваші дані. Якщо говорити коротко, то Redis та MongoDB можна використовувати для досягнення подібних речей. Redis просто швидший, але не підходить для складання прототипів. Це один випадок використання, коли ви зазвичай віддаєте перевагу MongoDB. Крім того, Redis є дійсно гнучким. Основні структури даних, які він надає, є складовими частинами високоефективних систем БД.

Коли використовувати Redis?

  • Кешування

    Кешування за допомогою MongoDB просто не має великого сенсу. Це було б занадто повільно.

  • Якщо у вас є достатньо часу, щоб подумати над своїм дизайном БД.

    Ви не можете просто закинути свої документи в Redis. Ви повинні думати про те, яким чином ви хочете зберігати та впорядковувати свої дані. Одним із прикладів є хеші в Redis. Вони сильно відрізняються від "традиційних" вкладених об'єктів, а значить, вам доведеться переосмислити спосіб зберігання вкладених документів. Одним із варіантів рішення буде збереження посилання всередині хеша до іншого хешу (щось на зразок ключа: [id другого хеша] ). Іншою ідеєю було б зберігати його як JSON, що здається протиінтуїтивним для більшості людей з * SQL-фоном.

  • Якщо вам потрібна справді висока продуктивність.

    Перемогти продуктивність, яку забезпечує Redis, майже неможливо. Уявіть, що ваша база даних така ж швидка, як кеш. Ось так виглядає використання Redis як реальної бази даних.

  • Якщо ви не дбаєте , що багато про масштабування.

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

Коли використовувати MongoDB

  • Прототипування, стартапи, хакатони

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

  • Коли вам потрібно швидко змінити схему.

    Бо схеми немає! Змінення таблиць у традиційних, реляційних СУБД є болісно дорогим і повільним. MongoDB вирішує цю проблему, не роблячи багато припущень щодо ваших базових даних. Тим не менш, він намагається оптимізувати, наскільки це можливо, не вимагаючи від вас визначення схеми.

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

Подальше читання:


3
Якщо у вас є достатньо часу, щоб подумати над своїм дизайном БД. Щоб усвідомити це: припустимо, ви хочете зберігати дані SO. В Монго : просто скиньте повні запитання з вкладеними відповідями та коментарями, але в redis вам потрібно зробити наступне: ТАК про redis
Абхішек Гупта

223

Редіс. Скажімо, ви написали сайт у php; з будь-якої причини він стає популярним, і він випереджає свій час або має порно. Ви розумієте, що цей php настільки страшно повільний: "Я втрачу своїх шанувальників, тому що вони просто не чекатимуть 10 секунд на сторінку". У вас є раптове розуміння, що веб-сторінка має постійний URL (вона ніколи не змінюється, whoa), якщо ви хочете, це первинний ключ, і тоді ви пам'ятаєте, що пам'ять швидка, а диск повільний, а php - навіть повільніше. :( Тоді ви модифікуєте механізм зберігання даних, використовуючи пам'ять та цю URL-адресу, яку ви називаєте "ключем", а вміст веб-сторінки ви вирішите назвати "значення". Це все, що у вас є - ключ та контент. Ви називаєте це "кеш-пам'ять". Вам подобається Річард Докінз, тому що він дивовижний. Ви кешуєте свій html, як білки кешують їхні горіхи. Вам не потрібно переписувати свій дерзкий php-код. Ви щасливі. Потім ви бачите, що це зробили інші - але ви вибираєте Redis, тому що на другому є заплутані зображення котів, у деяких - із іклами.

Монго. Ви написали сайт. Чорт ви написали багато, і будь-якою мовою. Ви розумієте, що значна частина вашого часу витрачається на написання цих смердючих пропозицій SQL. Ви не dba, але все-таки ви там пишете дурні заяви на sql ... не просто одне, а скрізь вигадливе. "Виберіть це, виберіть це". Але, зокрема, ви пам’ятаєте про дратуючий пункт ДЕРЖАВИ. Там, де прізвище дорівнює "тортон", а фільм - "поганий Санта". Урх. Ви думаєте, "чому б ці дбаси просто не виконують свою роботу і не дають мені збережених процедур?" Тоді ви забудете якесь незначне поле, наприклад, середнє ім'я, і ​​тоді вам доведеться скинути таблицю, експортувати всі 10G великих даних і створити інше з цим новим полем та імпортувати дані - і це триває 10 разів протягом наступних 14 днів, як ви продовжуйте пам’ятати лайно, як привітання, назву, плюс додавання іноземного ключа з адресами. Тоді ви рахуєте, що прізвище має бути прізвище. Майже одна зміна на день. Тоді ти кажеш, бодай. Мені потрібно зайти і написати веб-сайт / систему, не маючи на увазі цю модель даних. Отже, ви google, "я ненавиджу писати SQL, будь ласка, не SQL, не зупиняйте його", але з'являється "nosql", а потім ви читаєте деякі речі, і він говорить, що просто скидає дані без будь-якої схеми. Ви пам’ятаєте минулого тижня фіаско скидали більше столів і посміхалися. Тоді ви вибираєте монго, оскільки деякі великі хлопці, як "airbud", користується сайтом прокату. Солодке. Більше не змінюється модель даних, оскільки у вас є модель, яку ви просто продовжуєте змінювати.


що ти маєш на увазі під тим You don't need to rewrite your crap php code?, як вирішує це kv store? :)
Рой Лі

13
@Roylee він означає, що повільний і хитрий php виводить веб-сторінку в html. Замість того, щоб комерційно переписати код, щоб зробити його швидшим / ефективнішим, ви запускаєте php один раз на початку, а потім назавжди після, просто згадуйте заздалегідь вбудовану веб-сторінку в html за допомогою магазину kv.
Mikepote

Те, як ви розповіли цю історію, допомогло мені остаточно осмислити, чому схематично менше! Щойно врятувало мені пару років, коли я мав справу з SQL, щоб зрозуміти владу.
Нік Пінеда

4
"Більше не змінюється модель" справді не втілює ситуацію. Якщо ви не пишете код руху даних для оновлення всіх своїх існуючих записів, то це більше схоже на те, що у вас є "N" трохи інші моделі, які одночасно живуть в одній БД, і ви кодуєте, щоб з'ясувати, з якою моделлю він має справу, коли він щось читає з БД.
Terry Coatta

2
Один із найкращих найкращих відповідей, які я коли-небудь бачив. Він має чудовий зміст і насправді змушує мене сміятися голосно (буквально не
кохаю

16

Можливо, цей ресурс корисний, допомагаючи вирішити між обома. Він також обговорює декілька інших баз даних NoSQL та пропонує короткий перелік характеристик, а також пояснення "для чого я б це використав" для кожної з них.

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


11

Важко відповісти на питання - як і у більшості технологічних рішень, це дійсно залежить від вашої ситуації, і оскільки ви не описали проблему, яку ви намагаєтеся вирішити, як хто може запропонувати рішення?

Вам потрібно випробувати їх обидва, щоб побачити, хто з них задовольнив ваші потреби.

З огляду на це, MongoDB не потребує дорогого обладнання. Як і будь-яке інше рішення бази даних, воно буде краще працювати з більшою кількістю процесора та пам'яті, але це, звичайно, не є вимогою, особливо для ранньої розробки.


10

Redis - це сховище даних в пам'яті , яке може зберігати стан диска (щоб увімкнути відновлення після перезавантаження). Однак, будучи сховищем даних в пам'яті означає, що розмір сховища даних (на одному вузлі) не може перевищувати загального простору пам’яті в системі (фізична оперативна пам’ять + простір підкачки). Насправді це буде набагато менше, оскільки Redis ділиться цим простором з багатьма іншими процесами в системі, і якщо він вичерпає простір пам’яті системи, вона, ймовірно, буде знищена операційною системою.

Mongo - це накопичувач даних на основі диска , який є найбільш ефективним, коли його робочий набір вписується у фізичну оперативну пам'ять (як і все програмне забезпечення). Будучи на основі даних на диску означає, що не існує внутрішніх обмежень щодо розміру бази даних Mongo, проте параметри конфігурації, наявний простір на диску та інші проблеми можуть означати, що розміри баз даних за певним лімітом можуть стати непрактичними або неефективними.

І Redis, і Mongo можуть бути об'єднані для забезпечення високої доступності, резервного копіювання та збільшення загального розміру сховища даних.


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. Тепер у вашій базі даних і в Redis вас 105, і ви можете отримати їх, 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 підходять до ціни інструменту загального призначення. Це вводить багато накладних витрат.

Була приказка, що Редіс у 10 разів швидший за Монго. Це може бути вже не так. MongoDB (якщо я правильно пам’ятаю) стверджував, що він бив мемаш для зберігання та кешування документів, якщо конфігурації пам’яті однакові.

У всякому разі. Redis хороший, MongoDB хороший. Якщо ви дбаєте про підструктури та потребуєте агрегації, перейдіть на MongoDB. Якщо зберігання ключів і значень є вашою основною турботою про все, що стосується Redis. (або будь-яке інше сховище ключових значень).


2

Redis і MongoDB - це нереляційні бази даних, але вони різної категорії.

Redis - це база даних Key / Value, і вона використовує In-memory storage, що робить її дуже швидкою. Це хороший кандидат для кешування матеріалів та тимчасового зберігання даних (у пам’яті), тому що більшість хмарних платформ (таких як Azure, AWS) підтримують це, використання пам'яті можна масштабувати. Але якщо ви збираєтесь використовувати його на своїх машинах обмежені ресурси, врахуйте, що це використання пам'яті.

MongoDB, з іншого боку, - це база даних документів. Це хороший варіант для зберігання великих текстів, зображень, відео тощо і майже всього, що ви робите з базами даних, крім транзакцій. Наприклад, якщо ви хочете розробити блог або соціальну мережу, MongoDB - це правильний вибір. Це масштабується за допомогою стратегії масштабування. Він використовує диск як носій інформації, тому дані зберігатимуться.


1

Якщо ваш проект зрушив з місця дозволяє вам достатньо оперативної пам'яті у вашому оточенні - відповідь Redis. Особливо враховуючи новий Redis 3.2 з функціональністю кластера.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.