Команда Redis для получения всех доступных ключей в Redis Cluster?

Я использую это

redisManager.redisClient.keys('*example*', function (err, keys) {
})

Но он дает ключи только от одного кластера Redis. Как получить ключи от всего кластера?


person Albin Mathew    schedule 17.03.2016    source источник
comment
Разве все узлы кластера не должны использовать одни и те же данные и давать одинаковый результат? Или мы говорим о нескольких кластерах?   -  person John Siu    schedule 25.08.2016
comment
node-redis-cluster может это сделать. Вы можете проверить это здесь: npmjs.com/package/node-redis-cluster   -  person neohope    schedule 25.08.2016
comment
@john Siu, все узлы предоставляют отдельные данные   -  person Albin Mathew    schedule 25.08.2016
comment
вы можете показать, как вы устанавливаете значение кластера?   -  person arjun kori    schedule 31.08.2016
comment
Или вы можете использовать redisClient.zrange (например, 0, -1, function (err, answers) {   -  person arjun kori    schedule 31.08.2016
comment
Какой пакет вы используете?   -  person creativeChips    schedule 31.08.2016


Ответы (4)


Вы не можете получить ключи для всех узлов с помощью одной команды. Вам нужно получить ключи для всех узлов и объединить их. Ссылка - https://github.com/antirez/redis/issues/1962

Можно сделать что-то вроде.

var redis = require('redis');

redisConfig = new Array(
    {"port": 1234, "host": "192.168.1.2"},
    {"port": 5678, "host": "192.168.1.3"}
);

keys    = new Array();
allKeys = new Array();

for(i = 0; i < redisConfig.length; i++){
    redisClient = redis.createClient(redisConfig[i].port, redisConfig[i].host);    
      keys[i] = redisClient.keys('*example*', function (err, keys) {
      allkeys = [...new Set([...allKeys ,...keys[i]])];
    })
}
person Shivam Mathur    schedule 31.08.2016
comment
@Albin Mathew Это помогает? - person Shivam Mathur; 01.09.2016

Вы можете использовать этот код для поиска ключей из всего кластера. Для получения дополнительной информации перейдите по ссылке.

    var RedisCluster = require('node-redis-cluster').RedisCluster;

    var rcluster = RedisCluster.create([
        { port: 6379, host: '10.0.0.1' },
        { port: 6379, host: '10.0.0.2' },
        { port: 6379, host: '10.0.0.3' },
    ]);
    rcluster.execAll('keys', ['*'], function(err, results) {
    /* results will be
    {
        '10.0.0.1:6379': [ // keys],
        '10.0.0.2:6379': [ // keys],
        '10.0.0.3:6379': [ // keys]
    }
    */
    });
person Tolsee    schedule 29.03.2017

Вы пробовали использовать пакет node-redisscan? Он позволяет использовать SCAN команды в кластерах Redis.

Вам нужно будет собрать каждый соответствующий ключ с помощью обратного вызова. Вот как вы это сделаете (прямо из файла README) -

var redisScan = require('redisscan');
var redis = require('redis').createClient();

redisScan({
    redis: redis,
    each_callback: function (type, key, subKey, value, done) {
        console.log(type, key, subKey, value);
        done();
    },
    done_callback: function (err) {
        if (err) throw err;
        redis.quit();
    }
});
person GPX    schedule 24.02.2017

Выполните команду $ npm install redis, чтобы установить redis.

var redis = require('redis'),
    client = redis.createClient();

client.keys('*', function (err, keys) {
  if (err) return console.log(err);

  for(var i = 0, len = keys.length; i < len; i++) {
    console.log(keys[i]);
  }
});  
person KrGyan    schedule 29.03.2018
comment
это решение для автономного сервера Redis, а не для кластера Redis, как говорится в вопросе. - person Asalle; 05.04.2019