1. 程式人生 > >Jedis主從切換實現

Jedis主從切換實現

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