MongoDB з redis


95

Чи може хтось навести приклад використання випадків, коли ви отримаєте користь від використання Redis та MongoDB спільно один з одним?

Відповіді:


158

Redis та MongoDB можна використовувати разом із хорошими результатами. Компанія, добре відома під керуванням MongoDB та Redis (разом з MySQL та Sphinx), - Craiglist. Дивіться цю презентацію від Джеремі Заводного.

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

Ось кілька прикладів конкретного використання Redis на вершині MongoDB.

  • Попередній 2.2 MongoDB ще не має механізму придатності. Обкладені колекції реально не можуть бути використані для реалізації реальної TTL. Redis має механізм експірації на основі TTL, що дозволяє зручно зберігати летючі дані. Наприклад, сеанси користувача зазвичай зберігаються в Redis, тоді як дані користувачів зберігатимуться та індексуватимуться в MongoDB. Зверніть увагу, що MongoDB 2.2 запровадив механізм низької точності закінчення терміну дії на рівні збору (наприклад, для очищення даних).

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

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

  • Redis також пропонує паб / підмеханізм. У розподіленій програмі може бути корисна система поширення подій. Це знову-таки відмінний випадок використання Redis, а постійні дані зберігаються в MongoDB.

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

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


19
MongoDB 2.2 (щойно випущений) додає підтримку TTL, яка стосується вашого першого пункту: docs.mongodb.org/manual/tutorial/expire-data
Джон Звінк

Прекрасні моменти щодо деяких порівняльних сильних сторін кожного.
Брайан Булковський

2
Прекрасні моменти щодо деяких порівняльних сильних сторін кожного. Один із пунктів Редіса налаштовується на пам'ять. Є й інші проекти, орієнтовані на низьку затримку, наприклад, AerospikeDB, які зосереджені на кластеризації та надійності, а також на SSD-накопичувачі, які можна використовувати, коли випадок використання в реальному часі виходить за рамки того, що Redis може легко впоратися.
Брайан Булковський

саме відео про розмову Джеремі Заводного: youtube.com/watch?v=qFcB1Xw1WSk
Frankenmint

25

Очевидно, є набагато більше відмінностей, ніж це, але для надзвичайно високого огляду:

Для прикладів використання:

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

Технічно:

  • Redis - це db-пам'ять, що зберігається в пам'яті, з постійним збереженням диска (весь db повинен вміщуватися в оперативній пам'яті).
  • MongoDB - це диск, підтримуваний диском, який потребує лише достатньої кількості оперативної пам'яті для індексів.

Існує деяке перекриття, але вкрай поширене використання обох. Ось чому:

  • MongoDB може зберігати більше даних дешевше.
  • Redis швидше для всього набору даних.
  • Культура MongoDB - це "зберігати все, з’ясувати схеми доступу пізніше"
  • Культура Редіса полягає в тому, щоб "уважно розглянути, як ви отримаєте доступ до даних, а потім зберігати"
  • Обидва мають інструменти з відкритим кодом, які залежать від них, багато з яких використовуються разом.

Redis можна використовувати як заміну традиційного сховища даних, але найчастіше він використовується з іншим звичайним "довгим" сховищем даних, таким як Mongo, Postgresql, MySQL тощо.


0

Redis чудово працює з MongoDB як кешування-сервер. Ось що відбувається.

Щоразу, коли мангуст видає запит кешу, він спочатку переходить на сервер кешу.

Сервер кеш-пам’яті перевірить, чи ніколи раніше не був виданий саме такий запит.

Якщо цього немає, сервер кешування візьме запит, відправте його на mongodb, і Mongo виконає запит.

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

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

Кеш-сервер прийме відповідь і відправить його назад до мангуста, мангуст дасть йому висловитись і він врешті-решт опиниться всередині програми.

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

Ми робимо простий пошук, щоб сказати, чи виконаний цей запит? Так? Гаразд, прийміть запит і негайно надішліть його назад і нічого не надсилайте mongo.

У нас є сервер мангуста, сервер кешу (Redis) та Mongodb.

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

Тож, можливо, ми шукаємо купу публікацій у блозі від _id.

Тож, можливо, ключі тут - це ідентифікатор записів, які ми шукали раніше.

Отже, давайте уявимо, що mongoose видає новий запит, коли він намагається знайти публікацію в блозі з _id із 123, запит перетікає на сервер кеш-пам’яті, кеш-сервер перевірятиме, чи має результат будь-який запит, який шукав _id з 123.

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

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

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

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

Ми не робимо складної логіки запитів, немає індексів, нічого подібного. Це якомога швидше. Це простий пошук ключового значення.

Це огляд того, як кеш-сервер (Redis) працює з MongoDB.

Зараз є інші проблеми. Ми кешуємо дані назавжди? Як ми оновлюємо записи?

Ми не хочемо завжди зберігати дані в кеші і читати з кеша.

Кеш-сервер не використовується для жодних дій запису. Шар кешу використовується лише для зчитування даних. Якщо ми коли-небудь запишемо дані, то письмові дані завжди переходитимуть до екземпляра mongodb, і нам потрібно забезпечити, щоб у будь-який час, коли ми записуємо дані, ми очистили будь-які дані, що зберігаються на кеш-сервері, що пов'язані із записом, який ми тільки що оновили в Монго.

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