2013-01-19 38 views
0

我需要存储一些值。首先是发布数据,如: {postid,text,room_name},其中postid将自动递增。 和收集一些帖子,我需要把它们放进名后,所以我将有:Redis在节点dbase结构中

Thomas 
    1,text,room_name 
    2,text,room_name 
    3,text,room_name 
Kris 
    1,text,room_name 
    2,text,room_name 
    3,text,room_name 

我想我应该用散列,但我不知道如何把它们推到这些用户名。 我做的是:

db.incr('id',function(id){ 
db.hmset(id,'room',room,'text',text,redis.print) 
}) 

回答

0

总是有多种方式如何redis的数据库组织数据,你必须决定使用基于你想如何检索数据的目标之一。

所以,如果你想读取给定名称的所有帖子,比你可以为每个名称保留单独的散列。关键名称可能类似于

user:posts:<username> 

前缀“name:posts:”是为了确保不会与数据库中的其他键发生冲突。散列键将帖子ID,和值可JSON

{"text": "<post text>", "room_name": "<name of room>"} 

我已经标记这应该零配件需要更换与实际值与<>)。

从你的例子看来,每个人的帖子都有自己的索引,所以我们需要单独的键来保存每个人的索引,让我们把它命名为“user:postId:<username>”。

这是将数据存储在这样的结构中的代码:

var redis = require('redis'), db = redis.createClient(), 
    username = 'Thomas', post = 'Hello World!', room = 'stackoverflow'; 

db.incr('user:postId:' + username, function (error, id) { 
    if (error) throw error; 
    db.hset(
     'user:posts:' + username, id, 
     JSON.stringify({post: post, room: room}), 
     redis.print 
    ); 
}); 

要从redis的读取数据:

db.hgetall('user:posts:' + username, function (error, replies) { 
    console.log(replies); 
}); 

这将打印:

{ '1': '{"post":"Hello World!","room":"stackoverflow"}' } 

这假定你不需要单独访问邮局和房间 - 但是对于这种查询,这很容易,因为你得到了你的结果使用单个hgetall。