Redis sentinel java example
Redis Sentinel – HAProxy을 이용한 Client 통신에 대한 java example입니다.
Master(5000 port) 는 set(write) 용도
Slave(5001 port)는 get(read) 용도
JedisSentinalTest.java
import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.Closeable; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.time.Duration; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig; public class JedisSentinalTest { private static final Logger log = LoggerFactory.getLogger(JedisSentinalTest.class); private static JedisPoolConfig jedisPoolConfig = buildPoolConfig(); private static JedisPool jedisMasterPool; private static Jedis jedisMasterClient; private static JedisPool jedisSlavePool; private static Jedis jedisSlaveClient; public static boolean isMasterConnectSuccess = false; public static boolean isSlaveConnectSuccess = false; private static String redisHost = "lcoalhost"; private static int redisMasterPort = 5000; private static int redisSlavePort = 5001; private static int redisDefaultExpireTime = 60; private static JedisPoolConfig buildPoolConfig() { final JedisPoolConfig poolConfig = new JedisPoolConfig(); poolConfig.setMaxTotal(4096); poolConfig.setMaxIdle(500); poolConfig.setMinIdle(200); poolConfig.setTestOnBorrow(true); poolConfig.setTestOnReturn(true); poolConfig.setTestWhileIdle(true); poolConfig.setMinEvictableIdleTimeMillis(Duration.ofSeconds(60).toMillis()); poolConfig.setTimeBetweenEvictionRunsMillis(Duration.ofSeconds(30).toMillis()); poolConfig.setNumTestsPerEvictionRun(3); poolConfig.setBlockWhenExhausted(true); return poolConfig; } public static void getMasterConnection() { log.info("■ RedisUtil getConnection start..."); try { /** * jedisPool */ jedisMasterPool = new JedisPool(jedisPoolConfig, redisHost, redisMasterPort, 60000, "password"); jedisMasterClient = jedisMasterPool.getResource(); log.info("■ RedisClientPool created..."); if (jedisMasterPool != null) { isMasterConnectSuccess = true; } } catch (Exception e) { log.error("■ 에러 : " + e.getMessage(), e); isMasterConnectSuccess = false; } } public static void getSlaveConnection() { log.info("■ RedisUtil getConnection start..."); try { /** * jedisPool */ jedisSlavePool = new JedisPool(jedisPoolConfig, redisHost, redisSlavePort, 60000, "password"); jedisSlaveClient = jedisSlavePool.getResource(); log.info("■ RedisClientPool created..."); if (jedisSlavePool != null) { isSlaveConnectSuccess = true; } } catch (Exception e) { log.error("■ 에러 : " + e.getMessage(), e); isSlaveConnectSuccess = false; } } /** * Master 연결종료 * * @throws Exception */ public static void closeMasterConnection() { log.info("■ RedisClientPool closeConnection start..."); if (jedisMasterPool == null) { log.error("■ RedisClientPool is null."); return; } try { jedisMasterClient.close(); jedisMasterPool.destroy(); log.error("■ RedisMasterClientPool closed..."); } catch (Exception e) { log.error("■ 에러 : " + e.getMessage(), e); } } /** * Slave 연결종료 * * @throws Exception */ public static void closeSlaveConnection() { log.info("■ RedisClientPool closeConnection start..."); if (jedisSlavePool == null) { log.error("■ RedisClientPool is null."); return; } try { jedisSlaveClient.close(); jedisSlavePool.destroy(); log.error("■ RedisSlaveClientPool closed..."); } catch (Exception e) { log.error("■ 에러 : " + e.getMessage(), e); } } public static boolean setKeyValue(String key, Object obj, int expireTime) { return setKeyValue(key, obj, expireTime, 0); } /** * Key-Value Item 저장 */ public static boolean setKeyValue(String key, Object obj, int expireTime, int selectDb) { boolean result = true; if (obj == null) { if (log.isDebugEnabled()) { log.debug("■■ RedisCache set value is null."); } return false; } if (!isMasterConnectSuccess) { return false; } if (expireTime == 0) { expireTime = redisDefaultExpireTime; } String statusCodeReply = null; try { byte[] svalue = serialize(obj); jedisMasterClient.select(selectDb); statusCodeReply = jedisMasterClient.setex(key.getBytes(), expireTime, svalue); if (statusCodeReply == null) { if (log.isDebugEnabled()) { log.debug("■ RedisCache set fail."); } return false; } if (log.isDebugEnabled()) { log.debug("■ RedisCache set success."); } } catch (Exception e) { log.error("■ Error : " + e.getMessage(), e); return false; } return result; } /** * Key-Value Item 조회 */ public static Object getKeyValue(String key) { return getKeyValue(key, 0); } /** * Key-Value Item 조회 */ public static Object getKeyValue(String key, int selectDb) { Object result = null; if (!isSlaveConnectSuccess) { if (log.isDebugEnabled()) { log.debug("■ RedisCache Connection value is false."); } return null; } try { jedisSlaveClient.select(selectDb); byte [] tmp = jedisSlaveClient.get(key.getBytes()); if (tmp == null) { if (log.isDebugEnabled()) { log.debug("■ RedisCache get key[ " + key + " ] value is null"); } return null; } result = deserialize(tmp); if (result == null) { if (log.isDebugEnabled()) { log.debug("■ RedisCache get key[ " + key + " ] value is null"); } return null; } if (log.isDebugEnabled()) { log.debug("■ RedisCache Result : " + result); } } catch (Exception e) { log.error("■ Error : " + e.getMessage(), e); return null; } return result; } public static byte[] serialize(Object value) { if (value == null) { throw new NullPointerException("Can't serialize null"); } byte[] rv = null; ByteArrayOutputStream bos = null; ObjectOutputStream os = null; try { bos = new ByteArrayOutputStream(); os = new ObjectOutputStream(bos); os.writeObject(value); rv = bos.toByteArray(); } catch (Exception e) { throw new RuntimeException("Object can't be serialized", e); } finally { close(os); close(bos); } return rv; } public static Object deserialize(byte[] in) { return deserialize(in, new Object()); } @SuppressWarnings("unchecked") public static <T> T deserialize(byte[] in, Object requiredType) { Object rv = null; ByteArrayInputStream bis = null; ObjectInputStream is = null; try { if (in != null) { bis = new ByteArrayInputStream(in); is = new ObjectInputStream(bis); rv = is.readObject(); } } catch (Exception e) { throw new RuntimeException("Object can't be deserialized", e); } finally { close(is); close(bis); } return (T) rv; } private static void close(Closeable closeable) { if (closeable != null) try { closeable.close(); } catch (IOException e) { throw new RuntimeException("close stream error"); } } public static void main(String[] args) { getMasterConnection(); //Redis Sentinal Master(5000 port) Connection getSlaveConnection(); //Redis Sentinal Salve(5001 port) Connection String key = "testKey"; setKeyValue(key, "testValue", 60); log.info("getKeyValue : " + getKeyValue(key)); } }