포스팅은 Spring data Redis 공식 문서와 [우아한테크세미나] 191121 우아한레디스 by 강대명님 영상을 참고하여 작성합니다. 포스팅은 총 3편으로 이루어져 있습니다.
Spring Data Redis (3) 모니터링 cli, redis-stat
목차
1. 캐시 의미와 야매로 가격 비교(Elastic Cache vs RDS for MySQL)해보기
2. 캐시 사용 방식(JPA 영속성 컨텍스트로 비유하기)
3. Redis : REmote DIctionary Server
캐시 의미와 야매로 가격 비교(Elastic Cache vs RDS for MySQL)해보기
캐시는 값을 미리 저장해두는 임시 저장소를 의미합니다. 일반적으로 캐시 저장소는 메모리를 사용합니다. 그래서 캐시는 빠르다. 대신 비쌉니다.
가격 비교는 AWS 리소스 가격 측정해보기에서 Elastic Cache(Redis), RDS(MySQL)를 30GB 기준으로 비교해보았습니다. 물론 저는 AWS 리소스를 충분히 이해하거나 효율적으로 사용할 수 있는 능력이 없기 때문에 너무 믿지는 말아주세요.
동일한 용량을 사용하기 위해서는 가격이 8배 정도 차이가 났습니다. 다시 말하지만 이게 올바른 비교인지는 모르겠습니다. 참고로 cache.t3.small 총 메모리는 1.37GB이기 때문에 30GB를 만들기 위해 노드를 23개 선택했습니다.
갑자기 가격 비교하기 포스팅이 되어버리긴 했지만 찾다보면 좋은 정보들을 얻을 수 있었는데요.
3년 전 글이긴 하지만 아래와 같은 질문에 대해 AWS에서 답변을 내렸습니다.
ElastiCache Redis 노드의 사용 가능한 메모리가 Amazon ElastiCache 요금 페이지에 나와 있는 값보다 작습니다. 왜 그런가요?
글을 요약하면 한 노드의 메모리를 다 쓸 수 있는건 아니다. 메모리의 일정 비율이 백업 및 장애 조치 작업을 위해 25%를 예약해놓는다고 합니다. 그래서 1.37GB지만 실제로 사용할 수 있는 메모리는 1.37GB에 75%인 것 같습니다.
캐시 사용 방식(JPA 영속성 컨텍스트로 비유하기)
강대명님의 우아한 Redis 영상을 참고했습니다. 캐시를 사용하는 방식에는 Look aside Cache, Write back이 있습니다. 혹여나 JPA 영속성 컨텍스트에 대해 모르시는 분들이라면 영상을 참고하시길 바랍니다.
JPA 영속성 컨텍스트를 이해하고 계신분들이라면 위 두 방식을 쉽게 이해하실 수 있을거에요.
Look aside Cache
Look aside Cache는 영속성 컨텍스트 1차 캐시의 동작 방식을 의미해요. (물론 캐시의 범위에서 차이가 있습니다.) 영속성 컨텍스트는 한 트랜잭션 내에서 동일한 엔티티 식별자가 1차 캐시에 존재하면 DB까지 접근하지 않습니다. Look aside Cache도 이와 같은 개념입니다.
Write back
JPA의 쓰기 지연(Write behind)과 매우 유사합니다. INSERT, UPDATE 등이 발생할 때 캐시에 저장해뒀다가 한 번에 DB에 반영하는 형식입니다. Write back을 사용하면 DB에 1건, 1건 반영하는 것보다 속도 측면에서 매우 빠릅니다. 저도 개인 프로젝트를 진행하면서 JPA 쓰기 지연 저장소를 통해 최적화를 해본 경험이 있어 공유드리겠습니다.
Bulk INSERT로 그룹 시작 기능 성능을 최적화 해보겠습니다.
Redis : REmote DIctionary Server
REmote 의미
Redis는 Remote 원격에 서버가 있나봅니다. 캐시 서버가 원격에 있는 것을 글로벌 캐시라고 합니다. 반대로 서버 내부에 있는 것을 로컬 캐시라고 합니다.
서버 내부에 있다는 말이 조금 이해가 안될수도 있는데요. 스프링부트 환경이라고 가정했을 때 웹 애플리케이션을 실행하는 톰캣 서버 그 자체가 서버 내부를 의미합니다.
로컬 캐시
여기서도 JPA 비유법을 들겠습니다. 트랜잭션 레벨에서 적용되는 1차 캐시, 서버 내 애플리케이션 범위에서 적용되는 2차 캐시 모두 결국 서버 내 애플리케이션에서 동작합니다.
내부에서 동작하는 캐시를 로컬 캐시라고 부른다고 합니다. 글로벌 캐시보다 더 빠른 특징이 있습니다.
하지만 서버가 다수 존재하는 환경에서는 캐시를 공유하기 어렵다는 문제가 있을 것이구요. 로컬 캐시가 메모리 사용량을 차지해서 애플리케이션 서버 과부화에 더 신경써야 할 것 같습니다.
글로벌 캐시
로컬 캐시와 다르게 캐시 서버를 따로 두는 것을 의미합니다. 네트워크를 통해 접근하기 때문에 로컬 캐시보다는 느리다고 합니다. 로컬 캐시와는 다르게 분산된 서버에서도 데이터에 접근하는것이 편리할 것 같네요.
DIctionary 의미
Redis가 메모리기 때문에 빠른 이유도 있지만 데이터를 Dictionary(Key/Value) 구조를 관리하기 때문도 있습니다.
Redis 장점 및 주의사항
마지막으로 다른 메모리 기반의 DB보다 Redis 많의 차별화된 장점을 요약하면 포스팅을 마무리하겠스빈다.
1. 다양한 데이터 타입 지원 Redis 공식 문서 - date types
2. 데이터를 영속화 할 수 있습니다.
3. Redis 에는 Disk가 존재하기 때문에 Swap을 유의해야 한다.
4. Redis 는 싱글 스레드 환경이다.
'Spring' 카테고리의 다른 글
spring cache (1) 스프링 캐시 컨셉 이해하기 (0) | 2023.06.02 |
---|---|
DDD - 이벤트의 장점, 용도 그리고 구조 (0) | 2023.05.26 |
스프링 부트 - 자동 구성 @Conditional (0) | 2023.03.28 |
스프링 부트 - Production-ready Features - (1) start, 엑츄에이터 (0) | 2023.03.28 |
spring MVC 패턴 (0) | 2022.06.30 |