Redis中sentinel叢集的搭建和Jedis測試 圖文教程[二],redisjedis
在Redis中sentinel叢集的搭建和Jedis測試 圖文教程[一] 中已經寫了Redis中sentinel叢集的搭建和測試,這一章主要寫Redis中sentinel的Jedis測試。
一般sentinel架構圖為至少4台機子測試
我這裡測試的時候只用兩台機子,一台跑Redis-Sentinel和所有的Redis master-slave,一台跑java測試程式。
xserver.ini為項目工程的設定檔
[Redis]REDIS_NUMBERS=3REDIS_SERVER_1=tcp://192.168.0.86:26379REDIS_SERVER_2=tcp://192.168.0.86:26479REDIS_SERVER_3=tcp://192.168.0.86:26579REDIS_MASTER=mymasterREDIS_PASSWORD=vhrealREDIS_TIME_OUT=5000REDIS_DATABASE=0
RedisConnector.java為Redis操作封裝類
import java.util.HashSet;import java.util.Set;import org.apache.commons.pool2.impl.GenericObjectPoolConfig;import redis.clients.jedis.Jedis;import redis.clients.jedis.JedisSentinelPool;import Albert.CfgFileReader.CfgFileReader;public class RedisConnector { static public HashSet<String> REDIS_SERVER = new HashSet<String>(); static public int REDIS_NUMBERS = 1; static public String REDIS_MASTER = "master"; static public String REDIS_PASSWORD = ""; static public int REDIS_TIME_OUT = 1000; static public int REDIS_DATABASE = 0; static public JedisSentinelPool jedisSentinelPool = null; static public Object syncObj = new Object(); static public void Start() { synchronized (syncObj) { CfgFileReader cfg = null; try { cfg = new CfgFileReader("XServer.ini"); // [Redis] REDIS_NUMBERS = cfg.getInteger("REDIS_NUMBERS", 1); REDIS_MASTER = cfg.getString("REDIS_MASTER", "master"); REDIS_PASSWORD = cfg.getString("REDIS_PASSWORD", "master"); REDIS_TIME_OUT = cfg.getInteger("REDIS_TIME_OUT", 5000); REDIS_DATABASE = cfg.getInteger("REDIS_DATABASE", 0); if (REDIS_PASSWORD.length() == 0) REDIS_PASSWORD = null; for (int i = 0; i < REDIS_NUMBERS; ++i) { String key = String.format("REDIS_SERVER_%d", i + 1); String value = cfg.getString(key, ""); value = value.replace("tcp://", ""); value = value.replace("/", ""); value = value.toString().trim(); if (value.length() > 0) { REDIS_SERVER.add(value); } } if (jedisSentinelPool != null) { jedisSentinelPool.destroy(); jedisSentinelPool = null; } System.out.println("Creating JedisSentinelPool..."); jedisSentinelPool = new JedisSentinelPool(REDIS_MASTER, REDIS_SERVER, new GenericObjectPoolConfig(), REDIS_TIME_OUT, REDIS_PASSWORD, REDIS_DATABASE); System.out.println("Create JedisSentinelPool Success"); } catch (Exception ex) { ex.printStackTrace(); } finally { if (cfg != null) { cfg.close(); cfg = null; } } } } static public boolean Set(String key, String value) { if (jedisSentinelPool == null) return false; synchronized (syncObj) { Jedis jedis = null; try { jedis = jedisSentinelPool.getResource(); if (jedis != null) { if (value == null) value = ""; jedis.set(key, value); return true; } } catch (Exception ex) { ex.printStackTrace(); jedisSentinelPool.returnBrokenResource(jedis); } finally { jedisSentinelPool.returnResource(jedis); } return false; } } static public String Get(String key, String defaultval) { if (jedisSentinelPool == null) return defaultval; synchronized (syncObj) { Jedis jedis = null; try { jedis = jedisSentinelPool.getResource(); if (jedis != null) { String value = jedis.get(key); if (value == null) value = defaultval; return value; } } catch (Exception ex) { ex.printStackTrace(); jedisSentinelPool.returnBrokenResource(jedis); } finally { jedisSentinelPool.returnResource(jedis); } return defaultval; } } static public boolean Del(String key) { if (jedisSentinelPool == null) return false; synchronized (syncObj) { Jedis jedis = null; try { jedis = jedisSentinelPool.getResource(); if (jedis != null) { jedis.del(key); return true; } } catch (Exception ex) { ex.printStackTrace(); jedisSentinelPool.returnBrokenResource(jedis); } finally { jedisSentinelPool.returnResource(jedis); } return false; } } static public boolean Auth(String key) { if (jedisSentinelPool == null) return false; synchronized (syncObj) { Jedis jedis = null; try { jedis = jedisSentinelPool.getResource(); if (jedis != null) { jedis.auth(key); return true; } } catch (Exception ex) { ex.printStackTrace(); jedisSentinelPool.returnBrokenResource(jedis); } finally { jedisSentinelPool.returnResource(jedis); } return false; } } static public Set<String> Select(String pattern) { if (jedisSentinelPool == null) return null; synchronized (syncObj) { Jedis jedis = null; try { jedis = jedisSentinelPool.getResource(); if (jedis != null) { Set<String> keys = jedis.keys(pattern); return keys; } } catch (Exception ex) { ex.printStackTrace(); jedisSentinelPool.returnBrokenResource(jedis); } finally { jedisSentinelPool.returnResource(jedis); } return null; } }}
RedisTest.java為測試main函數
public class RedisTest { public static void main(String[] args) { RedisConnector.Start(); RedisConnector.Set("str1", "world"); System.out.println(RedisConnector.Get("str", "default")); System.out.println(RedisConnector.Get("str1", "default")); }}
初始運行RedisTest.java檔案,會發現如下問題
因為我是用兩台機子測試的,一台跑redis伺服器,伺服器的ip為192.168.0.86。一台跑測試java程式,測試程式所在機子的ip為192.168.0.83。兩台機子在一個區域網路段。
但是我之前sentinel配置master-slave的時候有的ip設為127.0.0.1,當然192.168.0.83上的測試程式無法串連127.0.0.1的伺服器從而無法擷取資源。
把sentinel配置中的ip全部改為192.168.0.86
運行程式結果如下: