2013-05-16 165 views
1

我有一个更大的哈希值与该公约设定的部分:从redis获取密钥列表?

redis.hmset("this:that:a", {"one": 'two', "three": 'four'}); 
redis.hmset("this:that:b", {"five": "six", "seven": "eight"}); 

var all_parts = {}; 

redis.keys("this:that:*", function(err, keys) { 
    for (var i=0; i<keys.length; i++){ 
    key = keys[i]; 

    redis.hgetall(key, function(err, obj) { 

     all_parts[key] = obj; 

     if (i >= keys.length) { 
     return console.log(all_parts); 
     } else { 
     return console.log('waiting'); 
     } 

    }); 
    }; 
}); 

结果的执行console.log ...

{ 'this:that:a': { five: 'six', seven: 'eight' } } 
{ 'this:that:a': { one: 'two', three: 'four' } } 

我没有得到这是怎么回事,任何帮助非常感谢。

回答

3

首先,一个初步的评论:你不应该在用户应用程序中使用KEYS命令。这是一个O(n)调试命令。如果Redis中有许多密钥,它将在每次调用时冻结该实例。

现在,关于程序本身,您需要检查Javascript的适用范围规则(适用于闭包的规则)。在这里你可以访问hgetall回调中的关键变量,但是它没有在闭包中正确捕获(for循环没有定义闭包,你需要一个函数)。

这里是一个可能的解决办法:

redis.hmset("this:that:a", {"one": 'two', "three": 'four'}); 
redis.hmset("this:that:b", {"five": "six", "seven": "eight"}); 

var all_parts = {}; 

redis.keys("this:that:*", function(err, keys) { 

    var count = keys.length; 
    keys.forEach(function(key) { 
    redis.hgetall(key, function(err, obj) { 
     all_parts[key] = obj; 
     --count; 
     if (count <= 0) { 
     console.log(all_parts); 
     } else { 
     console.log('waiting'); 
     } 
    }); 
    }); 
}); 

回报:

hdel inside hget block nodejs redis

nodejs, redis. check if keys exists and create new if not

waiting 
{ 'this:that:b': { five: 'six', seven: 'eight' }, 
    'this:that:a': { one: 'two', three: 'four' } } 

在查看更多信息

For loop get items from redis delay

+0

好的,我明白了。我在想'key'被传递到'redis.hgetall'作用域,然后回调函数会在这个范围内运行。 'redis.hgetall'不是一个函数,或者我错过了其他的AFA范围。 – boom

+0

是的,但您需要在函数的作用域中定义变量,使其成为闭包的一部分。 –