프로그램 구현중에서 Spring 을 사용하여 RestAPI 를 구현하면서 DB 만을 사용하여 데이터를 모두 다룰수는 없다.
종종 메모리 영역을 적극적으로 사용할 때가 있는데 이런 경우를 'Local Cache 를 활용한다.' 라고 한다.
하지만 이러한 프로그램에 종속된 Local Cache 보다는 MSA 가 도입되면 여러 서비스에서 동시에 사용할 수 있도록 Global Cache 프로그램인 Redis 에 관해서 알아보려고 한다.
- Redis 는 Remote Dictionary Server 의 약자로 키(Key) - 값(Value) 쌍의 해시 맵과 같은 구조를 가진
오픈소스 기반의 비관계형 ( NoSQL ) In-Memory 데이터베이스
- 컴퓨터의 주기억장치인 RAM 에 데이터를 올려서 사용하는 방법
- RAM 에 데이터를 저장하게 되면 메모리 내부에서 처리가 되므로 데이터를 저장/조회할 때
하드디스크를 오고가는 과정을 거치지 않아도 되어 속도가 빠름
- 서버의 메모리 용량을 초과하는 데이터를 처리할 경우
RAM 의 특성인 휘발성에 따라 데이터가 유실될 수 있음
속도가 중요한 빅데이터의 저장소에 적합한 NoSQL 방식을 채택하였기에 데이터 형식의 제약이 없고 빠르다.
디스크에 직접적인 사용이 들어가지 않고 RAM 에서 사용하는 데이터베이스이므로 속도가 빠르다.
아래의 사진과 같은 다양한 Data Type 을 지원하여 데이터를 다루기 편리하다.
Redis 가 가지는 특징인 인메모리는 RAM 의 휘발성 특징을 가지기에 데이터가 유실될 경우를 방지하여 두가지 백업 기능을 제공한다.
- Redis의 모든 write/update 연산 자체를 모두 log 파일에 기록하는 형태
- 순간적으로 메모리에 있는 내용 전체를 디스크에 담아 영구 저장하는 방식
Redis 는 싱글 스레드 기반의 데이터베이스이므로 명령을 처리할 때 스레드간의 데이터 간섭이 발생하지 않는다.
하지만 싱글 스레드라고해서 속도가 느린 것은 아니므로 걱정하지 않아도 된다.
Redis 는 싱글 스레드 기반의 데이터베이스이므로 스레드 간섭이 없다는 좋은 점도 있지만 RDMS 처럼 데이터를 구조화하여 저장할 경우
시간 복잡도가 급격하게 상승하여 데이터 요청 - 처리 - 응답 속도가 무지막지하게 길어진다.
이것이 점점 쌓이다보면 장애가 발생하므로 Redis 를 사용할 때는 데이터의 형식은 언제나 간단하게, 복잡하지 않게 구성하여 사용하는 것이 바람직하다.
Redis 에서 데이터를 빈번하게 입력하고 해제하다보면 디스크가 아닌 메모리이기떄문에 메모리 단편화가 발생한다.
메모리 단편화가 서버가 허용하는 램의 총량을 넘어가면 메모리 스왑이 발생하는데 메모리 스왑 ( Memory Swap )으로 인한 대기시간 ( Latency )이 발생하므로 Redis 를 사용할때는
반드시 TTL ( Time To Live ) 을 지정하여서 사용하고 해제를 잊지 말아야한다.
이제 실무에서 Redis 를 사용하여 어디에 적용하면 좋을지 생각해보았다.
내가 생각한 내용은 아래와 같다.
지금까지 Redis 에 대해서 알아보았다.
실무에서 Local Cache 도 자주 쓰고 데이터베이스에서 속도가 떨어져서 문제가 됐던 경험도 있었는데
Redis 를 사용하면서 조금 나아졌으면 좋겠다.