Redis和MongoDB;我应该如何存储大型JSON对象,性能问题

时间:2015-06-29 16:59:52

标签: json node.js mongodb session redis

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

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

编辑:我打算在应用程序的另一部分中包含mongoDB,解决另一个问题。与从mongo解析相比,redis的JSON解析还会比耗费更多时间和内存密集吗?重新确定用户数量会使服务器内存会话成为问题吗?

2 个答案:

答案 0 :(得分:3)

express-session有多种session store选项可用于保存会话数据。

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

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

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

Redis和MongoDB之间也存在差异,因为Redis主要是在内存中,而且更轻量级。但是,MongoDB更像是一个“真正的”数据库,它允许更复杂的查询,并且在可伸缩性方面有更多选择。

由于在我看来你只在会话中存储瞬态数据(因为实际数据存储在MySQL上),我建议如下:

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

答案 1 :(得分:0)

tj/connect-redisexpress-session一起做得很好! Redis使用JSON的速度非常快,并且在处理会话方面非常出色。