在Node.js中,如何使用set作为索引以编程方式从redis db中检索多个哈希值

时间:2012-03-10 06:17:59

标签: node.js asynchronous recursion schema redis

因此,我的redis数据库中的每个用户都有一大堆字段,我希望能够检索所有记录并显示它们。 我这样做的方法是存储一组所有用户ID,当我想要他们所有的记录时,我递归迭代集合使用集合中的用户ID抓取他们的记录并将它们添加到全局数组,然后最终返回这个全局数组。无论如何,我并不特别喜欢这种方法,并希望听到一些替代方案的建议,我觉得在这个问题上必须有更好的node.js或redis功能。也许有办法完全取消使用套装,但环顾四周我看不到任何明显的东西。

这是我的psuedoish(相当完整)node.js代码的一个例子,注意设置大小不是问题,因为它很少会是> 15。

注册功能:

var register = function(username, passwordhash, email){

    // Get new ID by incrementing idcounter
    redis.incr('db:users:idcounter', function(err, userid){

        // Setup user hash with user information, using new userid as key
        redis.hmset('db:user:'+userid, {
                'username':username,
                'passwordhash':passwordhash,
                'email':email
            },function(err, reply){

                 // Add userid to complete list of all users
                 redis.sadd('db:users:all', userid);

            }
        });
    });
}

记录检索功能:     var getRecords = function(fcallback){

    // Grab a list of all the id's
    redis.smembers('db:users:all', function(err, allusersids){

        // Empty the returned (global) array
        completeArray = [];

        // Start the recursive function, on the allusersids Array.
        recursive_getNextUserHash(allusersids, fcallback);
    });  
}

用于检索单个记录的递归函数:

// Global complete Array (so recursive function has access)
var completeArray = [];

// recursive method for filling up our completeArray
var recursive_getNextUserHash = function(userArray, callback){

    // If userArray==0 this means we have cycled entire list, 
    // call the callback, and pass it the completeArray which 
    // is now full of our usernames + emails

    if(userArray.length==0){
        callback.apply(this, [completeArray]);
        return;
    }

    // If still more items, start by popping the next user
    var userid = userArray.pop();

    // grab this users information
    redis.hvals('db:user:'+userid, function(err, fields){

        // Add users information to global array
        completeArray.push({username:fields[0],email:fields[2]});

        // Now move on to the next user
        recursive_getNextUserHash(userArray, callback);
    });

}

使用将是这样的:

register('bob', 'ASDADSFASDSA', 'bob@example.com');
register('bill', 'DDDASDADSAD', 'bill@example.com');
getRecords(function(records){
    for(var i=0;i<records.length;i++){
         console.log("u:"+records[i]['username']+',@:'+records[i]['email']);
    }
});

总结:使用node.js和redis检索Hash的许多字段的好方法是什么?在写完这个问题之后,我开始怀疑这是否就像你在redis中做的那样,你做了很多往返,无论是否是这种情况,必须有办法避免可怕的复发!

2 个答案:

答案 0 :(得分:4)

假设您正在使用https://github.com/mranney/node_redis - 请查看Multi和Exec。您可以在一个请求中发送所有命令,并立即等待所有响应。不需要递归。

答案 1 :(得分:3)

对于其他有类似问题的人,这里是我最终使用的语法:

redis.smembers('db:users:all', function(err, reply){
     var multi = redisClient.multi();
     for(var i=0;i<reply.length;i++){
             multi.hmget('db:user:'+reply[i], ['username', 'email']);
     }
     multi.exec(function(err, replies){
             for(var j=0;j<replies.length;j++){
                  console.log("-->"+replies[j]);
             }
     });
});