redis-高可用-代码层次调整
连接多个Redis以实现高可用:
public class RedisConnector {
protected static JedisBalancer balancer = null;
protected static Logger logger = Logger.getLogger(RedisConnector.class);
public static synchronized JedisBalancer getBalancer() {
if (balancer == null) {
try {
// 获取配置文件中的参数值
String host = PropertiesUtil.getConfigInfo("redis.host");
String host2 = PropertiesUtil.getConfigInfo("redis2.host");
String port = PropertiesUtil.getConfigInfo("redis.port");
String port2 = PropertiesUtil.getConfigInfo("redis2.port");
String password = PropertiesUtil.getConfigInfo("redis.password");
int timeout = 100000; // 单位为毫秒
if (!StringUtil.isBlank(host) && !StringUtil.isBlank(port)) {
JedisPoolConfig config = new JedisPoolConfig();
// 控制一个pool可分配多少个jedis实例,通过pool.getResource()来获取;
// 如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽)。
config.setMaxTotal(500);
// 控制一个pool最多有多少个状态为idle(空闲的)的jedis实例。
config.setMaxIdle(500);
// 表示当borrow(引入)一个jedis实例时,最大的等待时间,如果超过等待时间,则直接抛出JedisConnectionException;
config.setMaxWaitMillis(1000 * 100);
// 在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的;
config.setTestOnBorrow(true);
if (!StringUtil.isBlank(password)) {
DbpmConfig dbpmConfig = new DbpmConfig();
dbpmConfig.setLocalPwd(password);
balancer = new JedisBalancer(config, dbpmConfig,
Strategy.roundRobin, timeout);
} else {
balancer = new JedisBalancer(config, null,
Strategy.roundRobin, timeout);
}
balancer.addMember(host, Integer.parseInt(port));
if (!StringUtil.isBlank(host2)
&& !StringUtil.isBlank(port2)) {
balancer.addMember(host2, Integer.parseInt(port2));
}
// 测试连接是否有效
balancer.getResource().connect();
}
} catch (Exception e) {
balancer = null;
e.printStackTrace();
logger.warn("Redis Config Error !!!");
}
}
return balancer;
}
}

浙公网安备 33010602011771号