일단 해보고, 아니면 뭐

실패했어도 배웠으면 실패가 아냐.

무한한 개발세계 여행기

Programing/Spring

WAS (Spring Boot) - DB 성능 개선과 최적화 (4) - RedisTemplate

개발자 김은혜 2022. 6. 2. 18:00

드디어 마지막 시간이다.

이번에는 Redis 데이터베이스와 연동하여 사용 중인 RedisTemplate에 대해서 정리해보고자 한다.

 

 

 

 

 


RestTemplate는 이름에서도 보이다시피

Redis Command를 도와주는 Template이다.

 

결론부터 보자면 나는 이렇게 사용중이다.

천천히 확인해보자

 

 

일단 설정값들을 확인해 보기 전에 Connection Pooling의 필요성 여부를 확인해 봐야 한다.

 

Redis는 서버 자체가 Single Thread 기반이기 때문에 WAS 측에서 Connection Pooling을 한다고 하더라도

성능 상의 이점이 두드러지지 않는다.

왜냐면 Connection Pooling이라는 행위가 일단 Connection을 만들어 놓는 거기 때문에

그만큼에 메모리 자원을 점유하게 되기 때문이다.

 

 

또한 Redis Client 인 Lettuce가 기본적으로 단일 Connection으로 Multii Thread 요청을 지원한다.

(Jedis도 있지만 Lettuce를 사용하는 것을 권고하고 있다. 그래서 Spring Boot 2.x 버전부터는 Lettuce가 기본이다.

성능상의 차이라고 하는데 자세한 성능 테스트 결과는 이 블로그를 확인하자 https://jojoldu.tistory.com/418)

 

즉, RedisTemplate는 하나의 Connection으로 다중 요청 건을 Multi Thread 방식으로 Redis Server에 요청하게 되고

Redis Server는 요청 건들을 Queueing 하여 하나 씩 처리를 해준다.

 

하지만 Blocking API나 Redis Transaction(multi, exec)를 사용하는 경우에는

Connection을 공유하면 안 되기 때문에 그땐 다중 Connection을 구성해 주거나 Connection을 새로 생성해야 한다.

 

 

 

그럼 Lettuce의 중요한 부분을 확인해 보자

1. shareNativeConnection : Connection 공유 여부 (default = true)

- 한 Connection을 공유하여 여러 요청을 처리하게 되는가?

- Connection 공유가 일어나서는 안 되는 Redis Transaction의 경우에는

Spring Boot가 자동으로 전용 Connection을 생성하여 요청을 처리

- 만약 Connection 공유가 일어나서는 안되는 처리를 포함하는 Application이라면

단일 Connection을 두면 성능이 좋지 않을 수 있음

(하지만 우리 프로젝트는 논외이다)

 

2. LettuceClientConfiguration

따로 설정하지 않으면 MutableLettuceClientConfiguration으로 세팅한다.

- timeout (=commandTimeout) : 60L

- shutdownTimeout : 100L

 

 

3. RedisProperties가 Application 설정 파일로부터 Redis 관련 설정 값들을 읽어온다.

설정값
기본값
설명
spring.redis.database
0
커넥션 팩토리에 사용되는 데이터베이스 인덱스
localhost
레디스 서버 호스트
spring.redis.password
 
레디스 서버 로그인 패스워드
spring.redis.pool.max-active
8
pool에 할당될 수 있는 커넥션 최대수 (음수로 하면 무제한)
spring.redis.pool.max-idle
8
pool의 "idle" 커넥션 최대수 (음수로 하면 무제한)
spring.redis.pool.max-wait
-1
pool이 바닥났을 때 예외 발생 전, 커넥션 할당 차단 최대 시간(단위 ms, 음수는 무제한 차단)
spring.redis.pool.min-idle
0
pool에서 관리하는 "idle" 커넥션의 최소수 대상 (양수일 때만 유효)
spring.redis.port
0
레디스 서버 포트
spring.redis.sentinel.master
6379
레디스 서버 이름
spring.redis.sentinel.nodes
 
호스트: 포트 쌍 목록 (콤마로 구분)
spring.redis.timeout
0
커넥션 타임아웃 (단위 밀리세컨드)

 

 

 

 

 

 

Connection을 붙는 데이터베이스라고 해서

무조건적으로 Connection Pooling이 필요한 것은 아니다!

 

이번에 WAS -DB 성능 개선과 최적화 업무? 공부?를 진행하면서

정말 정말 많은 걸 배웠다.

 

근데 

이 부분에 정해진 답은 없다.

그래서 어렵다!