【发布时间】:2015-01-10 01:38:35
【问题描述】:
在 redis 中,我有一个包含 100 000 个用户并且还在不断增长的大型数据集。为了制作排行榜,我扫描了整个数据库,获取每个用户的所有哈希值。然后我一个一个地去打分。后来,我在 javascript 中进行排序和修剪。我的问题是,做同样事情的更快方法是什么?当前查询需要几秒钟。我的直觉是将数据存储在 JS 中,并且只运行一次查询。
getLeaderboards: function(player){
var self = this;
async.waterfall([
function(callback){
client.smembers("usr", function(err, replies){
var pvpleaders = [];
var expleaders = [];
var lastUser = false;
for(var i = 0; i < replies.length; i++){
var name = replies[i].toString();
if(i == replies.length - 1){
lastUser = true;
}
if(name.charAt(0) != "_"){
callback(err, name, pvpleaders, expleaders, lastUser);
}
}
});
},
function(name, pvpleaders, expleaders, lastUser, callback){
client.hgetall("u:" + name, function(err, reply){
if(reply){
kills = parseInt(reply.kills);
exp = parseInt(reply.exp);
remortexp = parseInt(reply.remortexp) || 0;
if(kills > 0){
//log.info(name+' '+kills);
pvpleaders.push([kills, name]);
}
if(exp + remortexp > 0){
//log.info(name+' '+exp);
expleaders.push([exp + remortexp, exp, remortexp, name]);
}
}
if(lastUser){
log.info('user user');
callback(err, pvpleaders, expleaders);
}
});
}
], function (err, pvpleaders, expleaders) {
if(err){log.info(err);}
pvpleaders.sort(function(a, b) { if (a[0] === b[0]) { return 0; } else { return (a[0] > b[0]) ? -1 : 1; } });
pvpleaders.splice(30, pvpleaders.length);
expleaders.sort(function(a, b) { if (a[0] === b[0]) { return 0; } else { return (a[0] > b[0]) ? -1 : 1; } });
expleaders.splice(30, expleaders.length);
var leaderboards = JSON.stringify({pvp: pvpleaders, exp: expleaders});
player.sendLeaderboards(leaderboards);
});
},
【问题讨论】:
标签: javascript node.js redis