Jedis主從切換實現
阿新 • • 發佈:2018-12-22
1.redis配置檔案
配置檔案示例:127.0.0.1:6379|127.0.0.1:6380|127.0.0.1:6381|127.0.0.1:6382|127.0.0.1:6383
這裡,對每一行的配置會以“|”分隔。最前面的redis會作為主節點。後面的redis會作為最前面一臺的備份Jedis,存放在bakRedisMap(Map)中。2.主備切換流程
先訪問主的jedis,如果丟擲JedisConnectionException,則catch中將會逐次ping其備份的jedis,如果存在work的從Redis(通過ping來確定),則返回對應的jedis例項,否則向外拋JedisConnectionException。具體程式碼:
/** * 從備份Redis群中取出可用的Jedis,如果均失敗,則丟擲異常。底層採用ping * * @param bakjedisArray * @param index * @return */ private final Jedis getWorkBakJedis(Jedis curJedis, Jedis[] bakjedisArray, int index) { if (index == 0) { System.out.println(getJedisUniqueName(curJedis) + " JedisConnectionException!"); bakjedisArray = redisConfig.getBakRedisMap().get(getJedisUniqueName(curJedis)); if (bakjedisArray == null) { throw new JedisConnectionException(getJedisUniqueName(curJedis) + " No BakRedis!"); } } Jedis bakjedis = bakjedisArray[index]; try { bakjedis.ping(); return bakjedis; } catch (JedisConnectionException e) { System.out.println(getJedisUniqueName(bakjedis) + " JedisConnectionException!"); if (index == bakjedisArray.length - 1) {// 當前節點是最後的節點,直接丟擲異常 throw new JedisConnectionException( getJedisUniqueName(curJedis) + " All bak Jedis ConnectionException!"); } else { return getWorkBakJedis(curJedis, bakjedisArray, index + 1); } } }