通过node.js应用程序在redis中保存嵌套哈希

时间:2011-04-18 10:23:58

标签: node.js redis

我正在使用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))

是否有可能将此结构嵌入另一个结构(用户一个?) 我怎么能用这种结构设置用户[“alex”]?

2 个答案:

答案 0 :(得分:23)

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

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

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

答案 1 :(得分:16)

您可以将子结构存储为对象,并将其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

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