从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' } } 

我不知道发生了什么,任何帮助表示赞赏。

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

现在,关于程序本身,你需要检查Javascript的适用范围规则(适用于闭包的规则)。 在这里你可以访问hgetallcallback中的关键variables,但是在闭包中没有正确捕获(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里面hget块nodejs redis

nodejs,redis。 检查键是否存在,如果不存在则创build新的键

for循环从redis延迟获取项目