从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延迟获取项目