2013-05-16 4 views
1

내가 동일한 규칙 세트 더 큰 해시의 일부가 :redis에서 키 목록 가져 오기?

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

내가 무슨 일이야되지 않는의 CONSOLE.LOG에

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'); 
     } 

    }); 
    }; 
}); 

결과를 ..., 어떤 도움 감사합니다.

답변

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

예, 함수의 범위에서 변수를 정의하여 클로저의 일부로 정의해야합니다. –