redis性能,将json对象存储为字符串

时间:2011-04-20 12:02:36

标签: node.js redis

我需要保存用户模型,例如:

{ "nickname": "alan",
  "email": ...,
  "password":...,
  ...} // and a couple of other fields

今天,我使用Set:users
在这个Set中,我有一个像user这样的成员:alan
在这个成员中我有上面的哈希

这工作正常,但我只是想知道是否使用以下方法而不是上述方法:

仍然使用用户设置(轻松获取用户(成员)列表)
在此集合中,仅使用键/值存储,如:

关键词:阿兰 value:上述用户哈希的stringify版本

检索记录会更容易(我将不得不用JSON解析它)。

我对redis很新,我不确定什么是最好的。你觉得怎么样?

4 个答案:

答案 0 :(得分:20)

您可以使用Redis hashes数据结构来存储JSON对象字段和值。例如,您的“用户”集仍然可以用作存储所有用户的列表,您的个人JSON对象可以存储为哈希,如下所示:

db.hmset("user:id", JSON.stringify(jsonObj));

现在,您可以按键获取所有用户或仅获取特定用户(从中获取/设置仅指定的字段/值)。此问题these two也可能与您的方案有关。

编辑:(对不起,我没有意识到我们之前已经讨论过这个问题)

  

检索记录会更容易(我将不得不用JSON解析它)。

这是事实,但是使用哈希数据结构,您只能获取/设置需要使用的字段/值。如果您只想更改对象的一部分,则检索整个JSON对象可能会导致性能下降(取决于您执行此操作的频率)(其他事情是您需要每次都对字符串化/解析对象)。

答案 1 :(得分:7)

JSON over哈希的另一个优点是维护类型。 123.3成为字符串"123.3",并且根据库Null / None可能会意外地转换为"null"

两者都有点单调乏味,因为这需要编写一个变换器来提取字符串并将它们转换回预期的类型。

对于空间/内存消耗考虑因素,我开始倾向于仅将值存储为JSON列表["my_type_version", 123.5, null , ... ],因此我没有N * ( sum(len(concat(JSON key names)))的开销,在我的情况下是Redis使用内存占用量的60%。

答案 2 :(得分:4)

请记住:哈希不能存储嵌套对象,JSON可以做到。

答案 3 :(得分:2)

说实话,无论哪种方式都可以。存储它的方式是您需要做出的设计决策。这取决于您希望如何检索用户信息等。

在性能方面,存储用户对象的JSON编码版本将使用更少的内存,并且用于存储/检索的时间更少。也就是说,JSON解析可能比从Redis检索每个字段更快。而且,即使不是,它可能更有效。无论如何,性能差异可能很小。