Redis는 Remote Dictionary Sever 의 약자로, 데이터를 드스크가 아닌 메모리에 저장하는 방식의 오픈소스 인메모리 데이터 저장소이다. Key-Value 구조를 사용하며, 초당 5만에서 25만 건의 요청을 처리할 수 있는 뛰어난 성능을 자랑한다.
Redis GitHub에서 소스를 확인할 수 있다.
Redis의 특징
1. Key-Value 기반 구조
Redis는 Key-Value Store라는 점에서 자바의 해시 테이블과 유사하다. 데이터는 메모리에 저장되므로 빠른 응답 속도와 높은 처리율을 제공한다. 그러나 메모리는 디스크보다 비싸고, 대규모 데이터를 저장하기에는 비용적인 제약이 있다.
2. 데이터 지속성
Redis는 메모리에 저장된 데이터를 디스크에 영구적으로 저장할 수 있는 기능을 제공한다. 이는 가용성과 백업 측면에서 강력한 장점이다.
Redis는 두 가지 데이터 지속성 방식을 지원한다.
(1) RDB (Redis Database)
- 특징: 특정 시점에 전체 데이터를 디스크에 저장하는 방식.
- 동작 방식: 프로세스 포크 기반
- 장점: 효율적인 전체 백업 및 복구가 가능
- 단점: 프로세스 포크 기반의 동작 방식으로 인해 스냅샷 진행 중 메모리 사용률이 급증할 수 있으며,
스냅샷의 준비 기간이 길어 동 시간에 추가/변경 되는 데이터는 유실될 수 있음 - 저장 파일: dump.rdb
(2) AOF (Append Only File)
- 특징: 모든 쓰기 작업 명령어를 순차적으로 기록하는 방식
- 동작 방식: history를 쌓는 방식
- 장점: 복구가 더 용이하며 데이터 손실 가능성이 미미함
- 단점: 저장 파일 크기가 커지고 디스크 쓰기 작업이 많아 성능에 영향을 줄 수 있음
RDB와 AOF는 함께 사용하거나 개별적으로 활성화할 수 있으며 단순 캐시 용도로 사용한다면 이 기능들을 비활성화할 수도 있다.
3. 다양한 데이터 타입 지원
Redis는 다양한 데이터 타입을 지원하여 폭넓은 활용이 가능하다
- String
- List
- Set
- Hash
- Sorted Set
- Bitmaps
- HyperLogLog 등
4. Single Thread 처리
Redis는 클라이언트 요청을 Single Thread로 처리한다.
- 장점: 원자적인 실행을 보장하여 데이터 일관성을 유지
- 단점: 시간이 오래 걸리는 명령어가 뒤의 명령어 처리에 영향을 줄 수 있음
- Redis 6.0 이상에서는 I/O 병렬 처리를 위한 Thread I/O가 도입되어 네트워크 지연을 완화됨
5. 비동기 I/O
Redis는 비동기 I/O 모델을 채택하여 네트워크 요청이나 파일 쓰기와 같은 작업을 non-blocking 방식으로 처리한다. 이를 통해 네트워크 대기 시간을 줄이고 성능을 최적화할 수 있게 되었다.
Redis의 고급 기능
1. Replication
- 구조: Master-Slave 복제를 지원
- 장점: 읽기의 부하 분산, 높입 데이터 가용성
- 활용: Master는 쓰기, Slave는 읽기 작업을 수행하여 성능을 향상
2. Sentinel
- 기능: 자동 복구 및 장애 조치를 지원
- 장점: Master 장애 발생 시 Slave를 승격하여 서비스 중단을 방지
3. Clustering
- 기능: 데이터 분산 저장 및 수평적 확장을 제공
- 장점: 대규모 데이터 환경에서도 성능 저하 없이 확장이 가능하며, 해시 슬롯을 통해 데이터를 관리
4. Lua 스크립트 지원
Redis는 Lua 스크립트를 사용하여 복잡한 로직을 서버 측에서 직접 처리할 수 있다. 이를 통해 성능을 최적화하고 데이터 일관성을 보장할 수 있다.
Redis의 활용 사례
1. 캐시
자주 사용되고 잘 변하지 않는 데이터를 캐시로 저장하여 데이터베이스 부하를 줄이고 빠른 응답 속도를 제공한다.
2. 세션 저장소
Redis는 TTL(Time-To-Live) 기능을 제공하여 일정 시간 이후 데이터 자동 삭제가 가능하다. 이를 활용해 세션 데이터를 효율적으로 관리할 수 있다.
3. Pub/Sub
Redis는 Publish-Subscribe 패턴을 지원하여 메시지 브로커로 사용할 수 있다. 이를 통해 비동기 처리를 구현하거나 실시간 채팅 시스템에 활용할 수 있다.
4. 메시지 큐
Redis를 메시지 큐로 사용하여 데이터 순서를 보장하며, 특정 서버에서 데이터를 가져와 처리하는 구조로 활용된다.
5. 지리 공간 데이터 처리
위도와 경도 정보를 저장하고, 반경 내 데이터를 효율적으로 쿼리하는 데 사용된다.
6. 리더보드
사용자 점수 체계나 순위를 관리할 때, Redis의 Sorted Set을 활용하여 빠르고 효율적인 순위 관리를 제공한다.