Відповіді:
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 буде катастрофічною. Їх слід ізолювати на різних вузлах.
Очевидно, є набагато більше відмінностей, ніж це, але для надзвичайно високого огляду:
Для прикладів використання:
Технічно:
Існує деяке перекриття, але вкрай поширене використання обох. Ось чому:
Redis можна використовувати як заміну традиційного сховища даних, але найчастіше він використовується з іншим звичайним "довгим" сховищем даних, таким як Mongo, Postgresql, MySQL тощо.
Redis чудово працює з MongoDB як кешування-сервер. Ось що відбувається.
Щоразу, коли мангуст видає запит кешу, він спочатку переходить на сервер кешу.
Сервер кеш-пам’яті перевірить, чи ніколи раніше не був виданий саме такий запит.
Якщо цього немає, сервер кешування візьме запит, відправте його на mongodb, і Mongo виконає запит.
Потім ми візьмемо результат цього запиту, а потім він повернеться до кеш-сервера, кеш-сервер збереже результат запиту на собі.
Він скаже щоразу, коли я виконую цей запит, я отримую цю відповідь, і тому він буде підтримувати запис між виданими запитами та відповідями, які повертаються з цих запитів.
Кеш-сервер прийме відповідь і відправить його назад до мангуста, мангуст дасть йому висловитись і він врешті-решт опиниться всередині програми.
Щоразу, коли той самий точний запит буде видано знову, мангуст надсилатиме той самий запит на кеш-сервер, але якщо кеш-сервер бачить, що цей запит був виданий раніше, він не надсилатиме запит на mongodb, замість цього він буде приймати відповідь на запит він отримав останній раз і негайно відправити його назад мангусту. Тут немає жодних індексів, сканування повної таблиці, нічого.
Ми робимо простий пошук, щоб сказати, чи виконаний цей запит? Так? Гаразд, прийміть запит і негайно надішліть його назад і нічого не надсилайте mongo.
У нас є сервер мангуста, сервер кешу (Redis) та Mongodb.
На сервері кеш-пам’яті може бути сховище даних із типом значення ключа зберігання даних, де всі ключі - це певний тип запиту, виданий раніше, і значення результату цього запиту.
Тож, можливо, ми шукаємо купу публікацій у блозі від _id.
Тож, можливо, ключі тут - це ідентифікатор записів, які ми шукали раніше.
Отже, давайте уявимо, що mongoose видає новий запит, коли він намагається знайти публікацію в блозі з _id із 123, запит перетікає на сервер кеш-пам’яті, кеш-сервер перевірятиме, чи має результат будь-який запит, який шукав _id з 123.
Якщо його немає на сервері кешу, цей запит приймається та надсилається до екземпляра mongodb. Mongodb виконає запит, отримає відповідь і надішле його назад.
Цей результат надсилається назад на кеш-сервер, який бере цей результат і негайно відправляє його назад мангусту, щоб ми отримали якнайшвидшу відповідь.
Одразу після цього кеш-сервер також прийме виданий запит і додасть його до своєї колекції запитів, які були видані, та отримає результат запиту та збереже його прямо проти запиту.
Тож ми можемо собі уявити, що в майбутньому ми знову видаємо той самий запит, він потрапляє на кеш-сервер, він переглядає всі клавіші, які він має, і каже о, я вже знайшов, що це блог, він не дотягується до монго, він просто займає результат запиту і надсилає його безпосередньо мангусту.
Ми не робимо складної логіки запитів, немає індексів, нічого подібного. Це якомога швидше. Це простий пошук ключового значення.
Це огляд того, як кеш-сервер (Redis) працює з MongoDB.
Зараз є інші проблеми. Ми кешуємо дані назавжди? Як ми оновлюємо записи?
Ми не хочемо завжди зберігати дані в кеші і читати з кеша.
Кеш-сервер не використовується для жодних дій запису. Шар кешу використовується лише для зчитування даних. Якщо ми коли-небудь запишемо дані, то письмові дані завжди переходитимуть до екземпляра mongodb, і нам потрібно забезпечити, щоб у будь-який час, коли ми записуємо дані, ми очистили будь-які дані, що зберігаються на кеш-сервері, що пов'язані із записом, який ми тільки що оновили в Монго.