1

我有部分具有相同约定的较大哈希集:

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

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

4

1 回答 1

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

在以下位置查看更多信息:

hget块nodejs redis里面的hdel

节点,redis。检查密钥是否存在,如果不存在则创建新的

For循环从redis延迟获取项目

于 2013-05-16T06:54:49.560 回答