Redis 集群中获取所有可用键的命令是什么?

18

我正在使用这个

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

但它只能提供来自一个 Redis 集群的键。我该如何获取所有集群的键?


所有集群节点不应该共享相同的数据并给出相同的结果吗?或者我们在谈论多个集群? - John Siu
node-redis-cluster 可以实现此功能。您可以在此处查看:https://www.npmjs.com/package/node-redis-cluster - neohope
@john Siu,所有节点都提供单独的数据。 - Albin Mathew
你能展示一下你是如何设置集群值的吗? - arjun kori
或者您可以使用redisClient.zrange(“example”,0,-1,function(err,replies){ - arjun kori
你用的是哪个包? - creativeChips
6个回答

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

@Albin Mathew 这有帮助吗? - Shivam Mathur
警告:将KEYS命令视为只在生产环境下极其小心使用的命令。当针对大型数据库执行时,它可能会破坏性能。此命令旨在用于调试和特殊操作,例如更改键空间布局。不要在常规应用程序代码中使用KEYS。如果您正在寻找一种在键空间子集中查找键的方法,请考虑使用SCAN或sets。 - Asif Saeed

1
您可以使用此代码来查找所有群集的键。有关更多信息,请参见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]
    }
    */
    });

1

您尝试使用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();
    }
});

0

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

来自Redis文档 警告:将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);
            });

0
我从我的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);
    });

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

这是一个独立的 Redis 服务器解决方案,而不是问题所述的 Redis 集群。 - Asalle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接