Redis命令获取Redis集群上所有可用的密钥?

w80xi6nr  于 7个月前  发布在  Redis
关注(0)|答案(6)|浏览(79)

我正在使用这个

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

字符串
但是它只提供一个redis集群的密钥,我怎么才能得到所有集群的密钥呢?

nimxete2

nimxete21#

你不能使用一个命令获取所有节点的键。你必须获取所有节点的键并合并它们。参考-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]])];
    })
}

字符串

flvtvl50

flvtvl502#

你试过使用node-redisscan包吗?它允许你在Redis集群上使用SCAN命令。
你必须用回调函数收集每个匹配的键。下面是你如何做的(直接从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();
    }
});

字符串

ymzxtsji

ymzxtsji3#

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

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]
    }
    */
    });

字符串

qni6mghb

qni6mghb4#

不建议在产品模式下使用Keys命令。
Redis Docs警告:KEYS是一个只应在生产环境中使用的命令,应格外小心。当对大型数据库执行时,它可能会破坏性能。此命令用于调试和特殊操作,如更改键空间布局。不要在常规应用程序代码中使用KEYS。如果您正在寻找在键空间的子集中查找键的方法,请考虑使用SCAN或sets。
使用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);
            });

字符串

camsedfj

camsedfj5#

我从我的C#代码转换了这个。希望它能帮助你。你需要在所有服务器上查询并建立你的键列表。

const Redis = require('ioredis');

async function getKeyList(servers, pattern) {
    const keyList = [];

    for (const server of servers) {
        if (!server.isConnected) continue;

        const keys = await server.keys(pattern);

        if (keys.length === 0) continue;

        keyList.push(...keys);
    }

    return keyList;
}

// Example usage:
const servers = [
    new Redis({ host: 'server1', port: 6379 }),
    new Redis({ host: 'server2', port: 6379 }),
    // Add more server configurations as needed
];

const pattern = 'your_pattern_here';

getKeyList(servers, pattern)
    .then((keyList) => {
        console.log('Keys:', keyList);
    })
    .catch((error) => {
        console.error('Error:', error);
    });

字符串

oalqel3c

oalqel3c6#

运行$ 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]);
  }
});

字符串

相关问题