728x90
반응형
SMALL
안녕하세요!
프뚜(프로그래머 뚜)입니다!
프로젝트를 진행 중, Redis를 Jedis로 통해 Connection중이였습니다. 비동기 처리를 해야 할 일이 생겨서 Lettuce로 마이그레이션하는 부분을 포스팅합니다.
[개발 환경]
- OS: windows 10 64bit
- JAVA: 1.8
1. build.gradle 추가하기
// 2022.11.14[프뚜]: Redis Common
implementation 'org.springframework.data:spring-data-redis'
implementation 'org.apache.commons:commons-pool2'
// 2022.11.14[프뚜]: Jedis
implementation 'redis.clients:jedis'
// 2022.11.14[프뚜]: Lettuce
implementation 'io.lettuce:lettuce-core'
jedis는 업그레이드가 중지 되었지만 jedis에서 lettuce를 자유롭게 쓸 수 있는 모델을 공유합니다.
2. RedisConfg.java 생성하기
@RequiredArgsConstructor
@Configuration
public class RedisConfig {
private String[] hosts = new String[] {
"127.0.0.1",
"localhost"
};
private int connectTimeout = 5000;
private int maxTotal = 50;
private int minIdle = 10;
private int maxIdle = 30;
private boolean testOnBorrow = false;
private boolean testOnReturn = false;
@Bean
public RedisConnectionFactory redisConnectionFactory() throws Exception {
// return jedis();
return lettuce();
}
@Bean
public RedisTemplate<?, ?> redisTemplate() throws Exception {
RedisTemplate<?, ?> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory());
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer(new ObjectMapper()));
redisTemplate.setEnableTransactionSupport(true);
return redisTemplate;
}
private RedisConnectionFactory jedis() throws Exception {
// 2022.11.14[프뚜]: Jedis Pool Config
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
jedisPoolConfig.setMaxTotal(maxTotal);
jedisPoolConfig.setMinIdle(minIdle);
jedisPoolConfig.setMaxIdle(maxIdle);
jedisPoolConfig.setTestOnBorrow(testOnBorrow);
jedisPoolConfig.setTestOnReturn(testOnReturn);
// 2022.11.14[프뚜]: Jedis Client Config
JedisClientConfiguration jedisClientConfiguration = JedisClientConfiguration.builder()
.connectTimeout(Duration.ofMillis(connectTimeout))
.usePooling().poolConfig(jedisPoolConfig)
.build();
// 2022.11.14[프뚜]: hosts 개수 처리
if (hosts.length == 1) {
return new JedisConnectionFactory(redisStandaloneConfiguration(), jedisClientConfiguration);
} else {
return new JedisConnectionFactory(redisClusterConfiguration(), jedisClientConfiguration);
}
}
private RedisConnectionFactory lettuce() throws Exception {
// 2022.11.14[프뚜]: config
GenericObjectPoolConfig genericObjectPoolConfig = new GenericObjectPoolConfig();
genericObjectPoolConfig.setMaxTotal(maxTotal);
genericObjectPoolConfig.setMinIdle(minIdle);
genericObjectPoolConfig.setMaxIdle(maxIdle);
genericObjectPoolConfig.setTestOnBorrow(testOnBorrow);
genericObjectPoolConfig.setTestOnReturn(testOnReturn);
// 2022.11.14[프뚜]: poolingClientConfiguration
LettucePoolingClientConfiguration lettucePoolingClientConfiguration = LettucePoolingClientConfiguration.builder()
.poolConfig(genericObjectPoolConfig)
.commandTimeout(Duration.ofMillis(connectTimeout))
.shutdownTimeout(Duration.ofMillis(connectTimeout))
.build();
// 2022.11.14[프뚜]: hosts 개수 처리
if (hosts.length == 1) {
return new LettuceConnectionFactory(redisStandaloneConfiguration(), lettucePoolingClientConfiguration);
} else {
return new LettuceConnectionFactory(redisClusterConfiguration(), lettucePoolingClientConfiguration);
}
}
private RedisStandaloneConfiguration redisStandaloneConfiguration() {
// 2022.11.14[프뚜]: hosts가 1개
RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration();
redisStandaloneConfiguration.setHostName(hosts[0]);
redisStandaloneConfiguration.setPort(6379);
return redisStandaloneConfiguration;
}
private RedisClusterConfiguration redisClusterConfiguration() {
// 2022.11.14[프뚜]: hosts가 N개
return new RedisClusterConfiguration(Arrays.asList(hosts));
}
}
RedisConnectionFactory에서 jedis와 lettuce 분기를 나눴습니다. Jedis에서 Lettuce로 마이그레이션이 목표이기 때문에 Jedis에서 사용한 옵션은 그대로 Lettuce에 추가했습니다.
Redis Connection 확인하기
@Configuration
public class RedisRunner implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) throws Exception {
// 2022.11.14[프뚜]: redis Connection Check
RedisClient client = RedisClient.create(RedisURI.create("127.0.0.1", 6379));
GenericObjectPool<StatefulRedisConnection<String, String>> pool = ConnectionPoolSupport.createGenericObjectPool(() -> client.connect(), new GenericObjectPoolConfig());
StatefulRedisConnection<String, String> connection = pool.borrowObject();
}
}
RedisClient를 통해 Redis에 정상 접속 되는 지 확인할 수 있습니다.
자세한 내용은 소스코드를 통해 확인해보실 수 있습니다. (제목과 Git Comment는 같습니다.)
https://github.com/JeongSeongSoo/spring-tistory
728x90
반응형
LIST
'프로그램 > JAVA' 카테고리의 다른 글
[ELK] SpringBoot + ELK 연동 및 사용하기 (0) | 2022.11.25 |
---|---|
[SolrJ] spring boot + solrj 연동 및 사용하기 (0) | 2022.11.24 |
[JPA] Spring boot JPA 연결 및 사용하기 (1) | 2022.10.30 |
[Spring] Spring boot에서 PostgreSQL 연동하기 (0) | 2022.10.29 |
[JAVA] Spring Boot에서 WebSocket 구축 및 사용하기 (1) | 2022.10.27 |