В Node.js, как я могу программно получить много хешей из базы данных Redis, используя набор в качестве индексов - PullRequest
1 голос
/ 10 марта 2012

Итак, у меня есть целая куча полей для каждого пользователя в моей базе данных redis, и я хочу иметь возможность получать все их записи и отображать их. Я делаю это, сохраняя набор всех идентификаторов пользователей. Когда я хочу получить все их записи, я рекурсивно повторяю набор, собирая их записи с использованием идентификаторов пользователей в наборе и добавляя их в глобальный массив, а затем, наконец, возвращаю этот глобальный массив. В любом случае, мне не особенно нравится этот метод, и я хотел бы услышать некоторые предложения об альтернативах, я чувствую, что для этой самой проблемы должна быть лучшая функциональность в 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? После того, как я написал этот вопрос, я начал задаваться вопросом: если вы просто делаете это в Redis, вы совершаете много обходов, независимо от того, должен ли быть способ избежать ужасного повторения!

Ответы [ 2 ]

4 голосов
/ 10 марта 2012

Если вы используете https://github.com/mranney/node_redis - взгляните на Multi и Exec. Вы можете отправить все свои команды в одном запросе и ждать всех ответов одновременно. Нет необходимости в рекурсии.

3 голосов
/ 10 марта 2012

Для тех, у кого есть подобный вопрос, вот синтаксис, который я использовал в итоге:

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]);
             }
     });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...