18

我正在使用这个

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

但它只提供来自其中一个 redis 集群的密钥。如何从所有集群中获取密钥?

4

5 回答 5

1

您可以使用此代码从所有集群中查找密钥。请参阅链接了解更多信息。

    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]
    }
    */
    });
于 2017-03-29T15:43:42.173 回答
1

您无法使用单个命令获取所有节点的密钥。您必须获取所有节点的密钥并将它们合并。参考 - 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]])];
    })
}
于 2016-08-31T21:41:43.983 回答
1

您是否尝试过使用该node-redisscan软件包?它允许您SCAN在 Redis 集群上使用命令。

您必须使用回调收集每个匹配的键。这是你的做法(直接从自述文件中提取) -

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();
    }
});
于 2017-02-24T08:53:46.503 回答
0

不建议在生产模式下使用 Keys 命令。

来自 redis docs 警告:将 KEYS 视为仅应在生产环境中极其小心地使用的命令。当它针对大型数据库执行时,它可能会破坏性能。此命令用于调试和特殊操作,例如更改键空间布局。不要在常规应用程序代码中使用 KEYS。如果您正在寻找一种在键空间子集中查找键的方法,请考虑使用 SCAN 或集合。

使用 scanStream 代替

            redisConnection = redisConnectionObject;

            const slaves = redisConnection.nodes("slave");

            config.info('number of slaves', slaves.length)


            let keys = [];
            let slavePromises = [];

            slaves.forEach((slave) => {
                let slaveCreate = new Promise((resolve) => {

                    const stream = slave.scanStream({
                        match: prefix
                    });

                    stream.on("data", (resultKeys) => {
                        keys = [...keys, ...resultKeys];
                    });
                    stream.on("end", () => {
                        resolve();
                    });
                });

                slavePromises.push(slaveCreate);
            });

            Promise.all(slavePromises).then(([slaveOneData, slaveTwoData]) => {

                keys = _.uniq(keys);

                resolveOne(keys);
            });
于 2021-10-10T19:03:14.637 回答
-1

运行命令$ 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]);
  }
});  
于 2018-03-29T06:03:43.290 回答