# Redis

## 1. 개요

인메모리 데이터 구조 저장소로 키-값 형태의 다양한 데이터 구조를 매우 빠른 속도로 저장하고 검색할 수 있는 오픈 소스 소프트웨어입니다.

* 키-값을 기본으로 하지만, 문자열, 해시, 리스트, 셋, 정렬된 셋 등 다양한 자료 구조 지원.
* 인메모리이기 떄문에 읽기 쓰기 성능이 매우 우수

## 2. 사용 사례

* 세션 저장: 세션 데이터를 저장하여 세션 정보를 유지하고, 여러 서버에서 세션 정보 공유
* 랭킹 시스템: 정렬된 셋을 사용해 빠르게 순위를 산출
* 메시지 큐: pub/sub 기능 활용하여 메시지 전달이나 알림 또는 비동기 작업 처리 구현
* 분산 락: 자원 경합을 제어하기 위한 락 기능 구현(싱글 스레드)
* 실시간 분석: 사용자 행동 또는 로그 데이터를 실시간으로 집계 및 분석

## 3. 구조와 동작 원리

### 3.1. 메모리 기반 아키텍처

단일 스레드로 동작하는 이벤트 루프 아키텍처를 가지고 있습니다. 한 번에 하나의 명령을 처리하기 때문에 동시성 문제로부터 상대적으로 자유롭습니다. 또한 메모리를 주로 사용하는 특성상, 디스크 I/O의 지연이 거의 발생하지 않으므로 고성능과 낮은 지연 시간을 보장.

### 3.2. 데이터 영속성

인메모리 기반이기 때문에, 메모리의 내용은 휘발성입니다. 이를 해결하기 위한 방법은 아래와 같습니다.

* RDB(SnapShotting): 일정주기마다 전체 데이터를 스냅샷 형태로 디스크에 저장. 데이터 백업 시점이 불규칙하며, 저장 시점과 실제 장애 시점 사이에 유실 데이터 발생
* AOF: 모든 쓰기 연산을 로그로 기록합니다. 장애 발생시 로그를 재실행하여 데이터를 복원.

### 3.3. 복제

Master-Slave 구조로 복제를 지원. Master에 변경이 발생하면 Slave에 내용을 전파하여 복제.

* 읽기 부하 분산: Slave 서버가 읽기 요청을 대신 처리할 수 있습니다.
* 장애 복구: 마스터 서버 장애가 발생하면 Slave를 승격할 수 있습니다.

### 3.4. 클러스터

여러 대의 Redis 서버를 묶어 하나의 클러스터로 운영. Redis Cluster 모드는 데이터를 여러 노드에 분산 저장하고, 자동으로 장애를 감지 및 복구하는 메커니즘을 제공합니다.
