티스토리 뷰
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
Lettuce 공식 문서 링크: https://lettuce.io/core/release/reference/
'Server' 카테고리의 다른 글
Linux 포트 확인 및 백그라운드 프로세스 실행 (0) | 2020.12.07 |
---|---|
[Java] 앱 버전 분기하기 (0) | 2020.08.07 |
[Spring] MVC 자동구성 제어하기 (0) | 2020.07.21 |
Kotlin은 Lombok을 사용할 수 없다 (0) | 2020.07.20 |
[Java] 직렬화는 중요한 것일까 (0) | 2020.07.17 |
[Spring] RestTemplate 알아보기 (0) | 2020.07.14 |