我有一个更大的哈希集的部分具有相同的约定:
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' } }
我不知道发生了什么,感谢任何帮助。
答案 0 :(得分: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');
}
});
});
});
返回:
waiting
{ 'this:that:b': { five: 'six', seven: 'eight' },
'this:that:a': { one: 'two', three: 'four' } }
请在以下网址查看更多信息:
hdel inside hget block nodejs redis