팀프로젝트_PetHarmony

Redis 도입 시도 ➡️ 보류

이채림 2024. 9. 26. 20:35

 Redis  

- 메모리 기반의 데이터 저장소

- 매우 빠른 속도로 데이터 저장 및 조회

- key-value 데이터 구조에 기반한 다양한 형태의 자료 구조 제공

- 메모리에 데이터를 저장하기 때문에 저장 공간에 제약이 있음 ➡️ 클러스터로 확장 가능

 

 캐시 

- 메모리에 데이터를 미리 적재하고 이를 빠르게 읽어 응답하는 구조

 

 

메모리 특성상 데이터가 휘발될 수도 ❓

이를  보완하고자 RDB(Redis Database)와 AOF(Append-Only-File)을 제공한다.

RDB
: 메모리에 있는 데이터 전체에서 스냅샷을 작성하고 이를 디스크로 저장하는 방식

AOF
: 레디스에 데이터가 변경되는 이벤트가 발생하면 이를 모두 로그에 저장하는 방식

차이점
RDB는 주기적으로 전체 데이터를 저장하지만, AOF는 모든 변경 명령어를 기록한다.
그래서 AOF가 데이터 유실량이 적지만, 느리다.

 

Redis는 일반적으로 AOF와 RDB를 동시에 사용하여 데이터를 백업한다.

 

 

Redis 자료구조

출처 : https://velog.io/@iqeq1945/Redis-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%EB%AA%85%EB%A0%B9%EC%96%B4-%EC%A2%85%EB%A5%98-%ED%99%9C%EC%9A%A9%EC%82%AC%EB%A1%80-%EC%A0%95%EB%A6%AC

 

 

 

Redis 유효 기간

Redis에 저장되는 모든 데이터는 유효 기간을 설정할 수 있다.

유효 기간이 지난 데이터는 레디스가 해당 데이터를 메모리에서 삭제한다.

 

방법

- EXPIRE 명령어

- SET의 EX 옵션

 

그냥 아까워서 기록 💨

더보기

프로젝트 상황

 

이번 프로젝트에서 팀원이 이미 ConcurrentMapCacheManager를 사용하여 캐시를 적용한 상태였다.

ConcurrentMapCacheManager는 메모리 기반의 캐시로서 매우 간단하게 설정할 수 있었고,

기본적인 성능을 제공하는 데 충분했다.

 

 

Redis 시도

하지만 나는 개인적으로  Redis 를 적용해보고 싶었고,  두 가지 캐시를 동시에 활용 할 수 있는 방법을 찾아보았다.

(CacheAdapter를 사용하여 ConcurrentMapCacheManager와 Redis를 함께 관리하면 된다.)

 

 

문제 발생 

마이페이지 - 관심있는 입양동물 조회에서 Redis 캐시를 적용했을 때, 

 

처음 데이터를 조회할 때는 문제가 없었지만, 두 번째 조회부터는  500 에러 가 발생하는 문제가 발생했다.

 

 

원인 분석

com.docker.cil

 

GET 명령어로 petLike::28-0-4의 키 값을 확인해보니 직렬화된 형태로 제대로 저장되었다.

그렇다면 Redis에서 캐시된 데이터를 가져올 때,  역직렬화 과정에서 문제가 발생 한 것이다.

 

Page 객체가 리스트와는 달리 다양한 메타 정보(페이지 번호, 페이지 크기)를 포함하는 복잡한 구조이다.

Redis에 캐싱하는 과정에서 직렬화는 비교적 문제없이 진행되지만, 역직렬화 과정에서 Page 객체의 복잡성 때문에 오류가 발생했다. 

➡️ 커스텀 직렬화 로직을 추가해야 한다.

 

 

결론

처음에는 중복 쿼리를 제거하기 위해 캐시 사용이 필요하다고 판단했으나

계속 찾아보면서 공부하다보니 좋아요 상태가 빈번하게 변경될 수 있는 특성상

실시간 반영이 더 중요하다고 판단했다.

 

따라서 좋아요 데이터에 대한 캐시는 적용하지 않기로 결정....

 

 

추후 계획

캐시 적용이 적합한 다른 데이터 조회 부분은 이미 팀원이 ConcurrentMapCacheManager를 사용하여 간단한 방식으로 충분한 성능을 내고 있다.

 

로컬 개발 환경에서는 ConcurrentMapCacheManager 같은 인메모리 캐시를 사용하면 충분하지만,

배포된 환경에서는 서비스가 재시작되거나 서버가 재부팅될 경우 메모리 캐시가 모두 사라진다.

 

배포 시에는 Redis와 같은 외부 캐시 솔루션이 필요한 경우가 많다.

배포 시에 다시 Redis를 도입하는 것으로 결정 땅땅땅,,🥹