2014-04-06 3 views
5

Мне нужно загрузить несколько полей информации, которые редко изменяются для проверки маршрутов, к которым пользователь может получить доступ.MongoDB vs Redis для пользовательских сессий?

В настоящее время я запрос MongoDB и хранить эти поля в Redis наряду с какой-либо конкретной информации о состоянии в одном хэш, который шпонкой на 'user:' + mongodb_user_objectid, когда пользователь входит в систему.

Затем создать сеанс для HTTP куки и магазин этот ключ как строка в redis, а также ключ от 'sess:' + session_id.

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

Есть ли существенное различие в производительности от чтения и записи этой информации сессии непосредственно от/до mongodb без использования redis в качестве посредника?

ответ

14

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

Однако моего предположения является то, что накладные расходы с использованием двух датасторов перевешивают любые потенциальные преимущества, потому что читает должно быть невероятно быстры на обоих DBS:

  • Поскольку сессии будут часто использоваться, коллекция сохраняет довольно «горячий», поэтому он, вероятно, останется в ОЗУ, если это возможно в MongoDB, тоже
  • Потеря сеанса не будет большой, но это не катастрофа, поэтому вы можете писать в MongoDB, не дожидаясь фиксации журнала (что почти такая же надежность redis есть)
  • В любом случае, самое время (вероятно) тратится на сетевой стек, и вы должны пройти через это для обоих блоков данных

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

+1

Я полностью согласен повторно. измерения. Число рейнольдса часть угадывания - в то время как я менее интимный с MongoDB, два из классических вариантов использования Redis - это управление сеансом и ускорение/кеширование БД. В частности, поскольку MongoDB не является базой данных в памяти, он обычно дополняется Redis, где важна производительность (например, http://redislabs.com/blog/the-top-3-game-changing-redis-use-cases:)) –

+1

Спасибо за ссылку. Это все очень верно, но, как видно из ссылки, redis действительно сияет, когда речь заходит о * изменении * сессии * часто *, сохраняя количество попаданий, количество запросов и т. Д. В актуальном состоянии. Это тот момент, когда имеет смысл разделить более быстрые и громоздкие операции и обеспечить повторную запись только в ОЗУ. Тем не менее, ОП не говорил, что он пишет очень часто, и даже тогда, это должно быть много трафика, чтобы стать важным отличием. – mnemosyn

+0

Итак, поскольку mongodb загружает целые документы в память, будет ли это пустой тратой памяти, если мне нужно всего лишь использовать несколько полей из документа пользователя mongodb в сеансе? – paulkon

Смежные вопросы