【问题标题】:Getting a list of keys from redis?从redis获取密钥列表?
【发布时间】:2013-05-16 06:14:56
【问题描述】:

我有部分更大的散列集具有相同的约定:

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

我不明白发生了什么,感谢任何帮助。

【问题讨论】:

    标签: javascript node.js redis node-redis


    【解决方案1】:

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

    现在,关于程序本身,您需要检查 Javascript 的范围规则(适用于闭包的规则)。在这里,您可以访问 hgetall 回调中的 key 变量,但它没有在闭包中正确捕获(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

    nodejs, redis. check if keys exists and create new if not

    For loop get items from redis delay

    【讨论】:

    • 好的,我明白了。我在想key 被传递到redis.hgetall 范围内,然后回调将在该范围内运行。 redis.hgetall 不是函数还是我缺少其他 AFA 范围。
    • 是的,但是你需要在函数的范围内定义变量,使它成为闭包的一部分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 2011-09-25
    • 1970-01-01
    • 2013-10-06
    • 1970-01-01
    • 1970-01-01
    • 2016-09-23
    相关资源
    最近更新 更多