본문 바로가기

Spring

[Spring] Redis

Redis 란

Remote Dictionary Server의 약자로 Key, Value 구조의 비정형 데이터를 저장하고 관리하기 위한 비 관계형 데이터 베이스 시스템입니다.

Cache Server

 

 

Redis는 데이터를 저장하고 관리한다 했는데 왜 데이터베이스가 있는데도 Redis를 사용할까요? 그 이유는 Redis의 여러 장점들 때문입니다.

데이터베이스는 일반적으로 데이터를 디스크에 저장하게됩니다. 이는 비정상적으로 작업이 끝나도 데이터가 손실되지 않는다는 장점이 있지만 데이터를 가져오는 속도가 느리다는 단점이 존재합니다.

 

따라서 자주 호출되는 데이터를 대상으로 적용시키기 좋은 방법입니다. 하지만 자주 값이 바뀌는 데이터는 대상으로 적합하지 않습니다. 이유는 일일히 최신 데이터를 업데이트 시켜줘야하기 때문에 더욱 처리량이 많아지기 때문입니다.

 

Cache Aside 패턴과 Write Back 패턴

Cache Aside 패턴

 

 

캐시로 부터 데이터를 빠르게 조회해 오기 위한 방식입니다. 자주 호출되는 데이터를 대상으로 적합하며, Cache 서버에 장애가 발생해도 Content DB를 통해 지속 서비스를 할 수 있습니다. 

하지만 Cache StorageContent DB간의 정합성 유지 문제가 발생할 수 있으며, 초기 조회 시 Content DB를 호출해야 하므로 단건 조회 빈도가 높은 서비스엔 적합하지 않습니다. 따라서 반복적으로 동일 쿼리를 수행하는 데이터를 대상으로 적합합니다.

 

Write Back 패턴

 

데이터를 저장할 때 DB에 바로 저장하지 않고, Cache Storage에 모아서 일정 주기 배치 작업을 통해 DB에 반영합니다.

Content DB의 부하를 줄이면서 Cache Storage의 역할도 합니다.

쓰기 작업이 많은 경우 적합하며, Cache Storage에서 Content DB로 데이터를 전송하기 전에 장애가 발생할 경우 데이터 분실이 발생할 수 있습니다.

데이터베이스의 일시적인 다운타임을 허용하고, 장애에 대응할 수 있으며, Cache Storage와 Content DB간의 데이터 정합성을 유지하기 좋습니다. 하지만 사용하지 않는 데이터가 저장되어 리소스 낭비와 Write 작업의 부하가 발생할 수 있습니다. 이를 해결하기 위해 TTL을 사용하여 사용되지 않는 데이터를 삭제할 수 있습니다.

 

Redis 주요 특성

Key-Value 

RedisDictionary Server인 만큼 Key-Value 형태로 데이터를 저장합니다.

Collection 지원

RedisList, Set, Sorted Set, Hash등 다양한 Collection 기반의 자료구조를 지원합니다.

디스크 저장

현재 메모리 상태를 디스크에 스냅샷 형태로 남기는 RDB 방식을 사용합니다. 그러므로 재시작 할 때 스냅샷을 기반으로 쉽게 복구 가능합니다. 또한 AOF 형태로 Redis에 변경 내역을 모두 남기는게 가능해서 Write Behind 같은 기능도 지원합니다.

 

RDB : 메모리 스냅샷을 파일 형태로 저장할 때 쓰는 파일의 확장자명

AOF : Append Only File의 약자로 데이터를 저장하기 전 AOF 파일에 현재 수행할 명령어를 저장해두고 장애가 발생하면 AOF 기반으로 복구합니다.

 

* RDB는 주기적으로 스냅샷을 남기고 AOF는 수정사항을 항상 디스크에 추가하기 때문에 둘다 있다면 AOF를 기준으로 Persistent를 구현합니다.

복제

Master/Slave 구조로 여러개의 복제본을 만들 수 있습니다. 또한 Master의 읽기 부하를 Slave로 나누는게 가능합니다.

빠른 성능

초당 50000 ~ 60000 이상의 처리를 할 수 있습니다.

트랜잭션

트랜잭션으로 묶은 로직들 중 하나의 로직이라도 실패하여 오류가 난다면 모두 취소시키는 트랜잭션 기능을 지원합니다.

싱글 스레드

Redis는 싱글 스레드이기 때문에 1번에 1개의 명령어만 실행할 수 있습니다. (Memcahed는 멀티스레드 입니다.)

Keys 나 flushall 등의 명령어를 사용할 때 병목된 데이터가 있다면 요청들이 밀리기 때문에 O(N) 관련 명령어를 주의해야 합니다. (이런 병목 상황일 때 Memcached와의 속도차이가 발생합니다.)

 

Redis vs Memcached

저장방식

Redis : 데이터가 디스크에 저장되기 때문에 복구가능

Memcached : 데이터가 메모리에만 저장되기 때문에 장애발생 시 사라짐

만료일 지정방식

Redis && Memcached : 만료일을 지정하면 만료된 데이터는 캐시처럼 사라짐

데이터 타입

Redis : 다양한 데이터타입 지원

Memcached : 문자열만 지원

 

 

 

'Spring' 카테고리의 다른 글

[Spring] Bean  (0) 2023.02.17
[Spring] Spring MVC  (0) 2023.02.16
[Spring] @Transactional  (0) 2023.02.16
[Spring] WS/WAS  (2) 2023.01.15
[Spring] IOC-DI  (0) 2023.01.15