微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何根据配置选择RedisCluster、RedisStandalone和Sentinel Connections?

如何解决如何根据配置选择RedisCluster、RedisStandalone和Sentinel Connections?

这里有一个要求,我想根据配置文件使用 RedisCluster 或 Redisstandalone 或 Sentinel 连接。示例:如果我指定 configType=rediscluster 那么将使用 StatefulRedisClusterConnection。如果我指定 configType=redisstandalone 那么它将是 StatefulRedisConnection。

以下是我为实现它而编写的代码。有没有比这更好的方法

RedisConnectionFactory.java

public class RedisConnectionFactory {

    private String redisUri;
    private String connectionType;

    private StatefulRedisClusterConnection<String,String> connection;

    RedisConnectionFactory(String redisUri,String connectionType) {
      this.redisUri = redisUri;
      this.connectionType = connectionType;
    }


    public <T> List<T> getConnection() {
      List connectionConfig = new ArrayList();
        switch (connectionType) {
            case "REdis_CLUSTER":
              RedisClusterClient redisClusterClient = RedisClusterClient.create(redisUri);
              connectionConfig.add((T) getStateFulRedisClusterConnection(redisClusterClient));
              connectionConfig.add(redisClusterClient);
              return connectionConfig;
            case "REdis_STANDALONE":
              RedisClient redisClient = RedisClient.create(redisUri);
              connectionConfig.add((T) getStateFulRedisConnection(redisClient));
              connectionConfig.add(redisClient);
              return connectionConfig;
        }
        return null;
    }


public StatefulRedisClusterConnection<String,String> getStateFulRedisClusterConnection(RedisClusterClient redisClient) {
    connection = redisClient.connect();
    System.out.println("Connected to Redis cluster client");
    return connection;
  }


public StatefulRedisConnection<String,String> getStateFulRedisConnection(RedisClient redisClient) {
    StatefulRedisConnection statefulRedisConnection = redisClient.connect();
    System.out.println("Connected to Redis standalone client");
    return statefulRedisConnection;
  }

}

RedisConnectionProvider.java

private static <T> T getRedisConnection(String connectionId) {
        String connectionType = "REdis_CLUSTER"; // this value comes from config.properties file just hardcoded
        if(redisConnection == null) {
            String uri =  getRedisUriForConnectionId(connectionId); //gets url string from config file

            RedisConnectionFactory redisConnectionFactory = new RedisConnectionFactory(uri,connectionType);
            List<Object> redisConnectionConfig = redisConnectionFactory.getConnection();
            redisConnection = redisConnectionConfig.get(0);
        }
        return (T) redisConnection;
    }

Main.java

class Main {
  public static void main(String args[]){ 

      Object redisConnection = RedisConnectionProvider.getConnection(connectionId);
      
        /**
         *   Here is the way i m typecasting based on object type
         *   IS THERE ANY BETTER WAY TO DO THAN THIS???
         */
        if (redisConnection  instanceof StatefulRedisConnection) {
            ((StatefulRedisConnection) redisConnection).sync().del(setup.job.getStream());
            ((StatefulRedisConnection) redisConnection).sync().del(setup.job.getConfigSet());
        } else if (redisConnection instanceof StatefulRedisClusterConnection) {
            ((StatefulRedisClusterConnection) redisConnection).sync().del(setup.job.getStream());
            ((StatefulRedisClusterConnection) redisConnection).sync().del(setup.job.getConfigSet());
        }
}

}

这是我的问题: 问题是 StatefulRedisConnection.sync() 返回具有 del() 方法的 RedisCommands 类型的值 StatefulRedisClusteConnection.sync() 返回 RedisAdvancedClusterCommands 类型的值,该值也有 del() 方法

我如何分配给泛型类型的实例变量,如下所示:

RedisGenericCommandForAllConnection redisGenericCommands = ??????

这样我就可以执行 redisGenericCommands.del() 而不必担心 RedisConnection 的类型。

请指导。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。