如何解决如何根据配置选择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 举报,一经查实,本站将立刻删除。