【问题标题】:redis performance, store json object as a stringredis性能,将json对象存储为字符串
【发布时间】:2011-08-09 10:47:32
【问题描述】:

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

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

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

这很好,但我只是想知道是否可以使用以下方法代替上述方法:

仍然使用用户集(方便获取用户(成员)列表)
在这个集合中只使用一个键/值存储,比如:

键:艾伦 value : 上述用户哈希的字符串化版本

然后检索记录会更容易(然后我必须用 JSON 解析它)。

我对 redis 很陌生,我不确定什么是最好的。你怎么看?

【问题讨论】:

    标签: node.js redis


    【解决方案1】:

    您可以使用 Redis hashes 数据结构来存储您的 JSON 对象字段和值。例如,您的“用户”集仍然可以用作存储所有用户的列表,并且您的单个 JSON 对象可以像这样存储到哈希中:

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

    现在您可以通过键获取所有用户或仅特定用户(从中获取/设置仅指定的字段/值)。还有thesetwo的问题可能与你的场景有关。

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

    然后检索记录会更容易(然后我必须用 JSON 解析它)。

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

    【讨论】:

      【解决方案2】:

      JSON 优于散列的另一个优点是保持类型。 123.3 变为字符串 "123.3" 并且取决于库 Null/None 可能会意外地转换为 "null"

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

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

          说实话,任何一种方式都可以正常工作。您存储它的方式是您需要做出的设计决定。这取决于您要如何检索用户信息等。

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

          【讨论】:

            猜你喜欢
            • 2016-01-27
            • 2013-07-04
            • 2015-07-27
            • 1970-01-01
            • 1970-01-01
            • 2013-07-09
            • 2012-12-30
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多