Итак, у меня есть целая куча полей для каждого пользователя в моей базе данных 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, вы совершаете много обходов, независимо от того, должен ли быть способ избежать ужасного повторения!