【问题标题】:MongoDB vs Redis for user sessions?MongoDB vs Redis 用于用户会话?
【发布时间】:2014-04-06 09:31:31
【问题描述】:

我需要加载一些不经常更改的信息字段,以验证用户可能访问的路线。

目前,我查询 mongodb 并将这些字段与任何特定状态信息一起存储在 redis 中,并在用户登录时以 'user:' + mongodb_user_objectid 为键。

然后我为 http cookie 创建一个会话,并将这个密钥作为字符串存储在 redis 中,并由 'sess:' + session_id 键入。

当其中一个验证字段可能更改时,最好不要从 mongodb 复制字段并处理更新 redis 和 mongodb 吗?

在不使用 redis 作为中间人的情况下直接从/向 mongodb 读取和写入此会话信息是否存在显着的性能差异?

【问题讨论】:

    标签: node.js mongodb session redis


    【解决方案1】:

    很遗憾,需要使用您的设置进行测量才能得到明确的答案,因为有很多潜在因素。

    但是,我的猜测是,使用两个数据存储的开销超过了任何潜在的优势,因为在两个数据库上的读取速度应该非常快:

    • 由于会话会经常使用,因此该集合会保持“热”状态,因此如果可能的话,它也可能会保留在 RAM 中,在 MongoDB 中
    • 丢失会话不会很好,但这也不是灾难,因此您可以在不等待日志提交的情况下写入 MongoDB(这与 redis 的可靠性几乎相同)
    • 在任何一种情况下,大部分时间(可能)都花在了网络堆栈上,而您必须为两个数据库都经历这些

    所以,简而言之,我看不出 redis 在这种情况下会快得多的任何原因,但同样,性能通常是猜测,尤其是在细节未知的情况下。

    【讨论】:

    • 我完全同意。测量。回覆。猜测部分——虽然我对 MongoDB 不太熟悉,但 Redis 的两个经典用例是会话管理和数据库加速/缓存。具体来说,由于 MongoDB 不是内存数据库,因此通常会在性能很重要的地方使用 Redis 来增强它(例如redislabs.com/blog/the-top-3-game-changing-redis-use-cases :))
    • 感谢您的链接。这一切都非常正确,但正如链接所指出的那样,redis 在 经常 修改会话、保持命中计数、请求计数等方面非常出色日期。这就是分离更快和更庞大的操作并确保重复写入仅进入 RAM 的意义所在。但是,OP 并没有说他写的很频繁,即使这样,也必须有很多流量才能成为重要的区别。
    • 那么,既然 mongodb 将整个文档加载到内存中,如果我只需要在会话中使用用户的 mongodb 文档中的几个字段,会不会浪费 RAM?
    • 好吧,也许吧。但是,这对我来说听起来像是过早的优化(除非您的用户文档很大或者您已经拥有数百万用户,例如:200 字节 x 1M 用户 = 200M,这只是 8G 的 2.5%...),其次我建议尽可能将session(短暂的)等内容与user等非常重要的持久数据分开。
    猜你喜欢
    • 2018-07-21
    • 2015-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-04
    • 2015-08-20
    • 2016-09-07
    • 2013-03-14
    相关资源
    最近更新 更多