Получить список ключей от 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' } }

Я не понимаю, что происходит, любая помощь приветствуется.


person boom    schedule 16.05.2013    source источник


Ответы (1)


Во-первых, предварительное замечание: вы не должны использовать команду 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 внутри блока hget nodejs redis

nodejs, redis. проверить, существуют ли ключи, и создать новые, если нет

Для цикла получения элементов из задержки Redis

person Didier Spezia    schedule 16.05.2013
comment
Да я вижу. Я думал, что key передается в область redis.hgetall, а затем обратный вызов будет работать в этой области. Является ли redis.hgetall не функцией или я упускаю что-то еще из области видимости AFA. - person boom; 16.05.2013
comment
Да, но вам нужно определить переменную в области действия функции, чтобы она стала частью замыкания. - person Didier Spezia; 16.05.2013