【问题标题】:Redis and MongoDB; How should I store large JSON objects, Performance issueRedis 和 MongoDB;我应该如何存储大型 JSON 对象,性能问题
【发布时间】:2015-09-16 06:06:54
【问题描述】:

我目前正在开发一个 Node.js 应用程序。它有一个 mySql 数据库服务器,我用它来存储应用程序中的所有数据。但是,我发现自己在会话存储中存储了大量与用户相关的数据。我一直这样做是通过使用 express-session 来存储我的 User 类的内容,但是这些 User 类可能非常大。我正在考虑编写一个中间件,将 User 类作为 JSON 保存到 redis 或 mongodb,并将密钥存储在会话 cookie 中。当我从 redis 或 mongodb 检索 JSON 时,我将解析它并使用它来重建我的 User 类。

我的问题是哪种方法性能最快且可扩展:将 JSON 字符串存储在 Redis 中,还是将我的 User 类的 mongo 文档表示存储在 MongoDB 中?谢谢!

编辑:我计划将 mongoDB 包含在应用程序的另一部分,以解决不同的问题。此外,从 redis 解析 JSON 是否会比从 mongo 解析更耗时和内存密集?服务器内存会话在多少用户重复出现时会成为问题?

【问题讨论】:

  • @robertklep 正确我正在使用快速会话。我想知道最有效的性能是什么。显然,在内存存储中使用 express-sessions 将无法扩展,尽管它现在工作正常。
  • 我删除了我的评论,将写一个答案。

标签: json node.js mongodb session redis


【解决方案1】:

express-session 有各种session store 选项来保存会话数据。

AFAIK,这些都通过相同的原理工作:它们将会话对象序列化为 JSON 字符串,并将该字符串存储在存储中(使用会话 ID 作为键)。

换句话说,您使用第二个键将用户数据作为 JSON 字符串存储在 Redis 或 MongoDB 中的想法与 express-session 在使用 Redis 或 MongoDB 存储时所做的基本完全相同。所以我不希望从中获得任何性能优势。

另一种选择是将用户数据存储为适当的 MongoDB 文档(不序列化为 JSON 字符串)。在引擎盖下,这仍然需要(反)序列化,尽管来自和到BSON,而不是 JSON。我从未对这两者中的哪一个更快进行基准测试,但我会猜测并说 JSON 可能会快一点。

Redis 和 MongoDB 之间也有区别,因为 Redis 主要是在内存中的并且更轻量级。然而,MongoDB 更像是一个“真正的”数据库,它允许更精细的查询,并且在可扩展性方面有更多的选择。

由于在我看来您只是在会话中存储临时数据(因为实际数据存储在 MySQL 上),所以我建议如下:

  • 如果您在会话中存储的数据总量适合内存,请使用 Redis 会话存储;
  • 如果没有,请使用 MongoDB 会话存储。

【讨论】:

  • 我想我将使用 redis 作为我的会话数据存储。我希望有人会测试在 redis 中反序列化大型 JSON 字符串与在 Mongo 中进行反序列化的性能。是的,所有瞬态数据都存储在 MySql 中,但是我通过将存储在会话中的缓存用户类修改 MySql 中的数据(并且每当有人触摸 api 以修改用户或其中之一时,都必须从会话内存中重建该数据它的许多聚合类)。
  • 如果您在会话中存储的数据总量适合内存,请使用 Redis 会话存储; -- 我们可以通过跨多个 Redis 实例分区数据来解决这个问题。
【解决方案2】:

tj/connect-redisexpress-session 结合使用可以很好地完成工作! Redis 使用 JSON 速度非常快,并且非常适合处理会话。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-17
    • 2011-08-09
    • 1970-01-01
    • 2016-12-11
    • 1970-01-01
    • 2013-09-15
    • 2011-04-20
    • 1970-01-01
    相关资源
    最近更新 更多