【问题标题】:Save nested hash in redis via a node.js app通过 node.js 应用程序在 redis 中保存嵌套哈希
【发布时间】:2011-04-18 10:23:57
【问题描述】:

我正在使用 node_redis,我想保存如下结构:

{
users : 
    "alex" : { "email" : "alex@gmail.com",
           "password" : "alex123"},
    "sandra" : { "email" : "sandra@gmail.com",
           "password" : "sandra123"},
    ...
}

目前,我为每个用户创建一个 JSON 对象:

jsonObj = { "email" : "alex@gmail.com",
            "password" : "alex123"}

然后做一个

db.hmset("alex", JSON.stringify(jsonObj))

是否可以将此结构嵌入到另一个结构中(用户结构?) 我怎样才能用这种结构设置 users["alex"] ?

【问题讨论】:

  • 你的意思是db.hmset("users", "alex", JSON.stringify(jsonObj))而不是db.hmset("alex", JSON.stringify(jsonObj))???
  • 检查 this answer 以了解如何将嵌套数据结构保存到 Redis。

标签: node.js redis


【解决方案1】:

据我所知,Redis 中不支持嵌套结构,但可以使用 set+hash 对它们进行建模(类似于hierarchical trees)。 Hashes 可能最适合存储单个 JSON 对象的字段和值。我要做的是为每个用户存储一个前缀(这是一个 Redis convention),例如:

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

然后使用sets 将用户分组到一组,并使用名为users 的键。然后我可以通过smembers 命令获取所有用户密钥,并使用hgetall 单独访问每个用户密钥。

【讨论】:

  • 谢谢,这是一个好方法。然后,当您需要更新特定用户时,您是否“srem "users" "user:alex" 并创建一个新集合以添加到用户?
  • @Luc:如果更新不影响他的姓名,该姓名用作键“user:alex”的一部分,那么您不必将他删除或再次添加到集合中。您只需更改该哈希中的指定字段即可。如果您还更改了他的名字,您可能必须删除原始的“user:alex”哈希并创建新的。然后你会从“用户”集中删除“用户:亚历克斯”并在那里添加新创建的哈希键。
  • 我现在使用这种方法(Hash 和 Set 的混合)。但是仅通过修改检索到的用户对象,更新不起作用。看来我们必须再次“hmset user:alex user”。
  • 我不确定我是否完全理解这个答案。您说哈希可能最适合存储单个 JSON 对象的字段和值。为什么这比简单地使用 SET 将 JSON 编码的值存储到字符串中更好?你在比较 HSET user:{id} name FredSET user:{id} '{"name":"Fred"}' 吗?如果是这样,我假设如果您经常访问对象的所有字段,那么 SET(以及后续的 JSON 解析)通常比 HSET 更快。想法?
  • SET 与 JSON 解析更快是有问题的,因为它可能高度依赖于将被解析并随后保存的字符串长度,而 HSET 将只处理整个 JSON 对象所需的一小部分。如果所有字段都可以访问,那么 SET 可能是一个可行的选择,并且比较基准可能会很有趣。
【解决方案2】:

您可以将子结构存储为对象,并将其 id 存储在主结构中,就像指针一样。因此,根据您的示例,我将执行以下操作

{
users : 
    "alex" : { "email" : "alex@gmail.com",
           "password" : "alex123"},
    "sandra" : { "email" : "sandra@gmail.com",
           "password" : "sandra123"},
    ...
}
$x = incr idx:user
hmset user:$x email alex@gmail.com password alex123
sadd list:user $x

$x = incr idx:user
hmset user:$x email sandra@gmail.com password sandra123
sadd list:user $x

希望这个可能的解决方案有所帮助

【讨论】:

  • 不错不错。如果有任何帮助,请考虑为答案投票。快乐编程。
猜你喜欢
  • 2016-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-10
  • 1970-01-01
  • 2018-12-17
  • 2012-10-01
相关资源
最近更新 更多