因此,我的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中做的那样,你做了很多往返,无论是否是这种情况,必须有办法避免可怕的复发!
答案 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]);
}
});
});