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