프로그램/JAVA

[Spring] Redis Jedis에서 Lettuce로 변경하기(Lettuce Config 세팅)

프뚜 2022. 11. 17. 10:00
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

 

GitHub - JeongSeongSoo/spring-tistory

Contribute to JeongSeongSoo/spring-tistory development by creating an account on GitHub.

github.com

 

728x90
반응형
LIST