【问题标题】:Redis command to get all available keys on Redis Cluster?Redis命令获取Redis集群上的所有可用密钥?
【发布时间】:2016-07-03 09:06:54
【问题描述】:

我正在使用这个

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

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

【问题讨论】:

  • 集群的所有节点不应该共享相同的数据并给出相同的结果吗?还是我们在这里谈论多个集群?
  • node-redis-cluster 可以做到这一点。你可以在这里查看:npmjs.com/package/node-redis-cluster
  • @john Siu,所有节点都提供单独的数据
  • 你能展示一下你是如何设置集群值的吗?
  • 或者你可以使用 redisClient.zrange("example", 0, -1, function(err, replies) {

标签: node.js redis redis-cluster


【解决方案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 有帮助吗?
  • keys 命令在 redis 中速度较慢,不推荐。警告:将 KEYS 视为仅应极其小心地在生产环境中使用的命令。当它针对大型数据库执行时,它可能会破坏性能。此命令用于调试和特殊操作,例如更改键空间布局。不要在常规应用程序代码中使用 KEYS。如果您正在寻找一种在键空间子集中查找键的方法,请考虑使用 SCAN 或集合。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    您可以使用此代码从所有集群中查找密钥。更多信息请参考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]
        }
        */
        });
    

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

        运行命令$ 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 集群。
        猜你喜欢
        • 2022-11-03
        • 2020-06-12
        • 2019-03-09
        • 1970-01-01
        • 2013-10-06
        • 2020-01-01
        • 2017-01-12
        • 1970-01-01
        • 2018-11-29
        相关资源
        最近更新 更多