티스토리 뷰

반응형

Author: 니용


서버 개발자라면 한 번은 들어본 Redis라는 캐시 메모리가 있습니다. 성능적인 면에서도 우수하고 부하가 거의 없기에 잘 사용하고 있는 라이브러리 중 하나이지요. 

 

Java는 2가지의 Redis Client를 지원합니다.

1. Jedis

2. Lettuce

 

이전에는 발생하지 않았었는데 최근 Spring Boot의 버전이 업그레이드되면서 자연스럽게 Jedis가 deprecated 되는 증상이 발생하였습니다. Boot Version 2.1.x 정도였을 것으로 생각됩니다. 사용을 아예 못하는 것은 아니지만 찜찜하기에... 그래서 이번에 라이브러리 업데이트를 하려고 합니다.

 

먼저 이전에 적용되어 있던 Jedis 관련 gradle을 뜯어보겠습니다.

 

Jedis

build.gradle

dependencies {
// ...

    compile group: 'it.ozimov', name: 'embedded-redis', version: '0.7.2'
    compile group: 'redis.clients', name: 'jedis'
    compile group: 'org.apache.commons', name: 'commons-pool2', version: '2.6.2'
    compile ('org.springframework.boot:spring-boot-starter-data-redis') {
        exclude group: 'io.lettuce', module: 'lettuce-core'
    }

// ...
}

 

RedisConfig.java

@Configuration
public class RedisConfig {

	private @Value("${redis.host}") String redisHost;
	private @Value("${redis.port}") int redisPort;

	@Bean
	public JedisConnectionFactory connectionFactory() {
		JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory();
		jedisConnectionFactory.setHostName(redisHost);
		jedisConnectionFactory.setPort(redisPort);
		jedisConnectionFactory.setUsePool(true);
		return jedisConnectionFactory;
	}

	@Bean
	public RedisTemplate<String, Object> redisTemplate() {
		RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
		redisTemplate.setKeySerializer(new StringRedisSerializer());
		redisTemplate.setValueSerializer(new StringRedisSerializer());
		redisTemplate.setHashKeySerializer(new StringRedisSerializer());
		redisTemplate.setHashValueSerializer(new StringRedisSerializer());
		redisTemplate.setConnectionFactory(connectionFactory());
		return redisTemplate;
	}

}

참고로 Serializer는 프로젝트 설정에 따라 다릅니다. 

사용하는 방식은 이렇습니다.

 

RedisUsingService.java

@Service
public class RedisUsingService {

    public static final String REDIS_KEY = "KEY_VALUE";

    @Resource(name="redisTemplate")
    private ValueOperations<String, String> valOper;
    
    public String getRedisValue() {
        try {
            return valOper.get(REDIS_KEY);
        } catch(Exception ignored) {}
        return null;
    }
}

이제 Lettuce를 적용한 소스를 적용하겠습니다.

build.gradle

dependencies {
    // ...
    // lettuce
    compile ('org.springframework.boot:spring-boot-starter-data-redis')

    implementation 'org.springframework.boot:spring-boot-starter-actuator'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    // ...
}

RedisConfig.java

@RequiredArgsConstructor
@Configuration
@EnableRedisRepositories
public class LettuceConfig {

	private @Value("${redis.host}") String redisHost;
	private @Value("${redis.port}") int redisPort;

	@Bean
	public RedisConnectionFactory connectionFactory() {
		return new LettuceConnectionFactory(redisHost, redisPort);
	}
	
	@Bean
	public RedisTemplate<String, Object> redisTemplate() {
		RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
		redisTemplate.setKeySerializer(new StringRedisSerializer());
		redisTemplate.setValueSerializer(new StringRedisSerializer());
		redisTemplate.setHashKeySerializer(new StringRedisSerializer());
		redisTemplate.setHashValueSerializer(new StringRedisSerializer());
		redisTemplate.setConnectionFactory(connectionFactory());
		return redisTemplate;
	}
}

 


 

자, 설정이 모두 완료되었습니다.

이는 적은 트래픽에서는 큰 차이가 없을 것이지만, 다량의 트래픽이 유입되는 서비스라던지 캐시 메모리를 주력으로 사용하는 프로젝트에서 유용하게 사용할 수 있을 것입니다.

 

실제로 성능을 비교하면 이와 같이 차이가 난다고 합니다.

 

Type TPS(높을수록 응답속도 빠름) Redis CPU Connections 응답 속도
Jedis 31,000 20% 515 100ms
Lettuce 100,000 7% 6 7.5ms

 

글 작성에 도움이 많이 되었던 링크: https://jojoldu.tistory.com/418

 

Jedis 보다 Lettuce 를 쓰자

Java의 Redis Client는 크게 2가지가 있습니다. Jedis Lettuce 둘 모두 몇천개의 Star를 가질만큼 유명한 오픈소스입니다. 이번 시간에는 둘 중 어떤것을 사용해야할지에 대해 성능 테스트 결과를 공유하��

jojoldu.tistory.com

 

Lettuce 공식 문서 링크: https://lettuce.io/core/release/reference/

 

Lettuce Reference Guide

Connections to a Redis Standalone, Sentinel, or Cluster require a specification of the connection details. The unified form is RedisURI. You can provide the database, password and timeouts within the RedisURI. You have following possibilities to create a R

lettuce.io

 

반응형
댓글
공지사항