redis cluster java example
Redis Cluster 에 대한 java example입니다.
LettuceClusterTest.java
import java.util.ArrayList; import java.util.List; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import org.apache.commons.pool2.impl.GenericObjectPool; import org.apache.commons.pool2.impl.GenericObjectPoolConfig; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import io.lettuce.core.RedisURI; import io.lettuce.core.cluster.RedisClusterClient; import io.lettuce.core.cluster.api.StatefulRedisClusterConnection; import io.lettuce.core.cluster.api.async.RedisAdvancedClusterAsyncCommands; import io.lettuce.core.support.ConnectionPoolSupport; public class LettuceClusterTest { private static final Logger log = LoggerFactory.getLogger(LettuceClusterTest.class); private static String lettuceHost = "10.0.0.220:6379,10.0.0.221:6379,10.0.0.222:6379"; private static RedisClusterClient redisClusterClient; private static StatefulRedisClusterConnection<String, Object> redisClusterConnection; private static RedisAdvancedClusterAsyncCommands<String, Object> redisClusterAsyncCommands; private static GenericObjectPool<StatefulRedisClusterConnection<String, Object>> pool; public static boolean isConnectSuccess = false; private static int lettuceDefaultTimeout = 3; private static int lettuceDefaultExpireTime = 60; public static void getConnection() { log.debug("■ LettuceUtil getConnection start..."); try { if(lettuceHost != null) { String [] lettuceHostList = lettuceHost.split(","); List<RedisURI> redisURIList = new ArrayList<RedisURI>(); for(int i = 0 ; i < lettuceHostList.length ; i++) { String [] lettuceAdminHostPort = lettuceHostList[i].split(":"); String host = lettuceAdminHostPort[0]; int port = Integer.parseInt( lettuceAdminHostPort[1] ); RedisURI node = RedisURI.Builder.redis(host).withPort(port).build(); redisURIList.add(node); } redisClusterClient = RedisClusterClient.create(redisURIList); pool = ConnectionPoolSupport .createGenericObjectPool(() -> redisClusterClient.connect(new SerializedObjectCodec()), new GenericObjectPoolConfig()); redisClusterConnection = pool.borrowObject(); redisClusterAsyncCommands = redisClusterConnection.async(); log.debug("■ LettuceClientPool created..."); } /** * LETTUCE lettuceAdmin Null 일경우 */ else { log.debug("■ LettuceCache lettuceHost value is Null."); } if (redisClusterClient != null) { isConnectSuccess = true; } } catch (Exception e) { log.error("■ Error : " + e.getMessage(), e); isConnectSuccess = false; } } /** * LETTUCE 연결종료 */ public static void closeConnection() { log.debug("■ LettuceClient closeConnection start..."); if (redisClusterClient != null) { log.error("■ LettuceClient is null."); return; } try { redisClusterConnection.closeAsync(); pool.close(); redisClusterClient.shutdown(); log.debug("■ LettuceClient 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 timeout) { if (log.isDebugEnabled()) { log.debug("■ LettuceCache Key : " + key); log.debug("■ LettuceCache Set obj : " + obj); log.debug("■ LettuceCache ExpireTime : " + expireTime); log.debug("■ LettuceCache Timeout : " + timeout); } boolean result = false; if (obj == null) { if (log.isDebugEnabled()) { log.debug("■■■]] LettuceCache set value is null."); } return false; } if (!isConnectSuccess) { return false; } if (expireTime == 0) { expireTime = lettuceDefaultExpireTime; } if (timeout == 0) { timeout = lettuceDefaultTimeout; } Future<String> future = null; try { future = redisClusterAsyncCommands.set(key, obj); redisClusterAsyncCommands.expire(key, expireTime); if (future == null) { if (log.isDebugEnabled()) { log.debug("■ LettuceCache set fail."); } return false; } long lettuceTimeout = timeout * 1000; String resultFutureString = future.get(lettuceTimeout, TimeUnit.MILLISECONDS); if("OK".equals(resultFutureString)) { result = true; } if (log.isDebugEnabled()) { log.debug("■ LettuceCache set success."); } } catch (Exception e) { log.error("■ Error : " + e.getMessage(), e); return false; } return result; } public static Object getKeyValue(String key) { return getKeyValue(key, 0); } /** * Key-Value Item 조회 * */ public static Object getKeyValue(String key, int timeout) { Object result = null; if (!isConnectSuccess) { if (log.isDebugEnabled()) { log.debug("■ LettuceCache Connection value is false."); } return null; } if (timeout == 0) { timeout = lettuceDefaultTimeout; } Future<Object> future = null; try { future = redisClusterAsyncCommands.get(key); if (future == null) { if (log.isDebugEnabled()) { log.debug("■ LettuceCache get value is null"); } return null; } long lettuceTimeout = timeout * 1000; result = future.get(lettuceTimeout, TimeUnit.MILLISECONDS); if (log.isDebugEnabled()) { log.debug("■ LettuceCache Result : " + result); } } catch (Exception e) { log.error("■ Error : " + e.getMessage(), e); if (future != null) { future.cancel(true); } return null; } return result; } public static void main(String[] args) { getConnection(); String key = "testKey"; setKeyValue(key, "testValue", 60); log.info("getKeyValue : " + getKeyValue(key)); } }
SerializedObjectCodec.java
import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.nio.ByteBuffer; import java.nio.charset.Charset; import io.lettuce.core.codec.RedisCodec; public class SerializedObjectCodec implements RedisCodec<String, Object> { private Charset charset = Charset.forName("UTF-8"); @Override public String decodeKey(ByteBuffer bytes) { return charset.decode(bytes).toString(); } @Override public Object decodeValue(ByteBuffer bytes) { try { byte[] array = new byte[bytes.remaining()]; bytes.get(array); ObjectInputStream is = new ObjectInputStream(new ByteArrayInputStream(array)); return is.readObject(); } catch (Exception e) { return null; } } @Override public ByteBuffer encodeKey(String key) { return charset.encode(key); } @Override public ByteBuffer encodeValue(Object value) { try { ByteArrayOutputStream bytes = new ByteArrayOutputStream(); ObjectOutputStream os = new ObjectOutputStream(bytes); os.writeObject(value); return ByteBuffer.wrap(bytes.toByteArray()); } catch (IOException e) { return null; } } }