2013-05-16 157 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

是的,但您需要在函數的作用域中定義變量,使其成爲閉包的一部分。 –