Data/Redis

Redis

is..cy 2025. 2. 15. 01:25

 

Redis

 C 언어로 작성된 오픈소스 인메모리 데이터 저장소

 

 

  • In-memory Data Store : 백업을 제외한 모든 데이터를 램에 저장하기 때문에 RDBMS와 다른 구조 (일반적으로 램은 디스크에 비해 매우 빠르다)
  • 싱글 스레드 기반 : 멀티 스레드로 데이터베이스 엔진을 구성했을 때 장점이 분명히 존재하지만 프로그램의 복잡도를 증가시킬 수 있기에, 레디스는 과감하게 단일 스레드를 사용하여 단순한 디자인을 채택하였다. 따라서 개발자가 사용만 잘하면 사이드 이펙트가 거의 없는 매우 안정적인 기술이다.
  • 클러스터 모드를 지원 : 다중 노드에 데이터를 분산 저장하여 기본적으로 안정성∙고가용성을 제공한다.
  • 영속적으로 관리 : 인메모리 데이터베이스라는 특성상 주로 휘발성 데이터를 저장하지만, RDB와 AOF(Append Only File)이라는 특성을 통해 안전하게 영속적으로 관리할 수도 있다.
  • Pub / Sub : 이를 활용하여 실시간 채팅이나 알림 서비스와 같은 어플리케이션을 손쉽게 개발할 수 있다.

 


 

Redis 장점

  • 모든 데이터를 메모리에 저장하기 때문에 매우 빠른 읽기/쓰기 속도를 보장한다.
  • 다양한 Data Type을 지원한다.
  • 다양한 언어로 작성된 클라이언트 라이브러리를 지원한다. (백엔드와 연동이 쉽다.)

 

 


 

Redis 사용사례

  • Caching: 임시 비밀번호/로그인 세션과 같은 임시 데이터를 레디스에 캐싱하여 활용하는 사례가 많다.
  • Rate Limiter (Fixed-Window/Sliding-Window Rate Limiter): 서버에서 특정 API에 대한 요청 횟수를 제한할 때 사용한다.
  • Message Broker: 레디스의 리스트나 스트림지 같은 데이터 타입을 활용하여 메시지 브로커를 구현할 수 있다. 이를 통해 다양한 서비스 간의 커플링을 줄이는 곳에 사용한다.
  • 실시간 분석 / 계산: 다양한 실시간 분석 및 계산이 가능하다.
  • 실시간 채팅: 레디스의 Pub/Sub 패턴을 활용하여 실시간 채팅 기능을 구현할 수 있다.

 

 


 

Redis 영속성

레디스는 주로 캐시로 사용되지만 데이터 영속성을 위한 옵션을 제공한다. SSD와 같은 영구적인 저장 장치에 데이터를 저장하는 방식으로 구현된다.

 

 

RDB(Redis Database)

  • 특정 시간에 스냅샷을 생성하는 기술이다. 장애가 발생했을 때 특정 시점에 스냅샷으로 빠르게 캐시를 되돌리거나 동일한 데이터를 가진 캐시를 복제할 때 주로 사용된다.
  • 스냅샷의 특성상 스냅샷이 생성되기 이전의 일부 데이터는 유실 위험이 있다.
  • 스냅샷 생성 중에 전체적인 레디스 서버의 성능 저하가 발생하여 클라이언트 요청 처리에 지연이 발생할 수 있다.

 

AOF(Append Only File)

  • 레디스에 적용되는 Write 작업을 모두 log로 저장하는 방식이다.
  • 데이터 유실 없이 거의 모든 데이터에 싱크를 맞출 수 있지만 장애상황 재난복구 시에 모든 로그를 다시 적용해야 하기 때문에, 스냅샷 방식보다 복구되는 속도가 느리다.

 

 


 

Caching

데이터를 임시로 저장하는 기술로 자주 사용되는 데이터나 계산 결과를 저장하여, 다시 그 데이터를 요청할 때 더 빠르게 제공할 수 있도록 하는 방식이다. 시스템 성능을 개선하고, 자원을 절약하며, 반응 속도를 향상시키는 데 중요한 역할을 한다.

 

  • CPU 캐시: CPU와 RAM 속도 차이로 발생하는 지연을 줄이기 위해 캐시 사용
  • 웹 브라우저 캐싱: 웹 브라우저가 웹 페이지 데이터를 로컬 저장소에 저장하여 해당 페이지 재방문 시 사용
  • DNS 캐싱: 이전에 조회한 도메인 이름과 해당 IP 주소를 저장하여 재요청 시 사용
  • DB 캐싱: DB 조회나 계산 결과를 저장하여 재요청 시 사용
  • CDN: 원본 서버의 컨텐츠를 PoP 서버에 저장하여 사용자와 가까운 서버에서 요청 처리
  • 이미지/동영상 등 용량이 큰 파일을 PoP 서버에 저장해두고, 사용자가 요청을 보냈을 때 가장 가까운 PoP 서버에 있는 파일을 응답값으로 보내줌으로써 네트워크 지연 시간을 줄임
  • 어플리케이션 캐싱: 어플리케이션에서 데이터나 계산 결과를 캐싱하여 반복 작업 최적화

 

 


 

ETC

Lettuce : Netty 기반 라이브러리로 Asynchronous & Non-blocking으로 구현되어 있다.
Netty : 네트워크 애플리케이션 개발을 위한 오픈소스 자바 프레임워크로, 비동기 이벤트 기반의 네트워크 애플리케이션을 쉽게 개발할 수 있도록 관련 도구와 라이브러리를 제공한다.
Jedis : Lettuce와 비교하여 thread-non-safe하다는 점, java 기반 애플리케이션이라는 점

 

  • 여기서 비동기 방식이 핵심이다. 즉, 싱크를 맞추는 것이 필요없다. (하나의 작업이 완료될 때까지 대기하지 않고 다른 작업을 처리)
  • 이러한 비동기 방식으로 동작하는 Lettuce는 Redis와 하나의 커넥션만으로 여러 요청을 비동기적으로 처리할 수 있기에, 리소스를 효율적으로 사용하고 응답시간을 최적화한다.
  • 또한, 비동기 논블로킹이므로 spring boot 애플리케이션이 멀티 스레드를 사용하더라도 안전한 프로그래밍을 할 수 있다.(Lettuce는 Synchronous도 제공한다.)