Redis - Overview
contents
1. Redis란 무엇인가?
Redis(REmote DIctionary Server)는 오픈 소스 인메모리(In-Memory) 데이터 구조 저장소입니다. 흔히 NoSQL 데이터베이스로 분류되지만, 기술적으로는 "데이터 구조 서버(Data Structure Server)"라고 부르는 것이 가장 정확합니다.
- 인메모리(In-Memory): 모든 데이터를 디스크(HDD/SSD)가 아닌 RAM에 저장합니다. 덕분에 기존 데이터베이스(MySQL, MongoDB 등)보다 압도적으로 빠릅니다.
- 키-값(Key-Value) 저장소: 모든 데이터는 고유한 '키'를 통해 접근합니다.
- 다재다능함: 단순한 문자열만 저장하는 캐시(예: Memcached)와 달리, Redis는 리스트, 셋, 해시 등 복잡한 자료 구조를 지원합니다.
2. 왜 그렇게 빠른가?
Redis는 초당 수백만 건의 연산을 수행할 수 있습니다.
- RAM 접근: RAM은 하드디스크나 SSD보다 데이터 접근 속도가 훨씬 빠릅니다.
- 단일 스레드(Single-Threaded) 아키텍처: Redis는 명령 처리에 하나의 스레드만 사용합니다. 이는 멀티 스레드 시스템에서 발생하는 "컨텍스트 스위칭(Context Switching)" 비용과 데이터 경합(Race Condition) 문제를 제거합니다.
- 참고: Redis 6.0부터는 네트워크 입출력(I/O) 처리에 멀티 스레딩을 지원하지만, 명령 실행 자체는 여전히 단일 스레드로 동작합니다.
- Non-blocking I/O: I/O 멀티플렉싱 기술(epoll/kqueue)을 사용하여 수천 개의 동시 연결을 효율적으로 처리합니다.
3. Redis 자료 구조 (핵심 비결)
Redis는 저장하는 데이터의 형태를 이해하고 조작할 수 있습니다.
| 자료형 | 설명 | 사용 사례 |
|---|---|---|
| String (문자열) | 기본 텍스트나 바이너리 데이터 (최대 512MB). | HTML 캐싱, 사용자 세션, 카운터(INCR). |
| List (리스트) | 문자열의 연결 리스트. 앞/뒤 삽입이 빠름. | 메시지 큐, 최근 활동 피드 (트위터 타임라인 등). |
| Set (셋/집합) | 순서가 없고 중복되지 않는 문자열 집합. | 태그, 순 방문자, 친구 목록 (교집합/합집합 연산). |
| Sorted Set (ZSet) | Set과 같지만, 각 멤버가 '점수(Score)'를 가짐. | 실시간 리더보드(랭킹), 우선순위 큐. |
| Hash (해시) | 필드와 값으로 구성된 맵 (미니 JSON 느낌). | 사용자 프로필 저장 (user:100 -> 이름, 나이). |
| Bitmap (비트맵) | 문자열을 비트 단위로 조작. | 활성 사용자 추적(유저당 1비트), 기능 플래그. |
| HyperLogLog | 적은 메모리로 고유한 개수를 추정하는 확률적 구조. | 웹사이트 순 방문자 수 카운팅 (오차율 0.81%). |
| Geospatial | 위도/경도 좌표 저장. | "내 주변 5km 이내 식당 찾기". |
4. 영속성 (Persistence: 데이터 저장)
Redis는 메모리에 있지만, 서버 재시작 시 데이터 유실을 막기 위해 디스크 저장 기능을 제공합니다.
A. RDB (Redis Database Backup)
- 방식: 특정 간격(예: "5분마다")으로 전체 데이터셋의 "스냅샷"을 찍어 파일로 저장합니다.
- 장점: 파일 크기가 작고, 복구 속도가 빠릅니다.
- 단점: 서버가 다운되면 마지막 스냅샷 이후의 데이터는 잃게 됩니다.
B. AOF (Append Only File)
- 방식: 모든 쓰기 연산(
SET,INCR등)을 로그 파일에 기록합니다. 복구 시 이 명령들을 다시 실행합니다. - 장점: 데이터 유실을 최소화할 수 있습니다 (매초 동기화 가능).
- 단점: 파일 크기가 크고, RDB보다 재시작 속도가 느립니다.
모범 사례: 실제 운영 환경에서는 둘 다 사용하는 것이 일반적입니다 (RDB는 백업용, AOF는 데이터 보존용).
5. 고가용성 및 확장 (High Availability & Scaling)
A. Replication (복제)
- Master: 쓰기와 읽기를 처리.
- Replica (Slave): 마스터의 데이터를 복제. 읽기 전용(Read-Only) 요청을 처리.
- 이점: 읽기 성능 분산 및 데이터 이중화.
B. Redis Sentinel (센티넬)
- 마스터와 레플리카를 감시하는 시스템입니다.
- 장애 조치(Failover): 마스터가 죽으면, 센티넬이 자동으로 레플리카 중 하나를 새로운 마스터로 승격시키고 앱 설정을 업데이트합니다.
C. Redis Cluster (클러스터 - 수평 확장)
- 샤딩(Sharding): 데이터를 여러 Redis 노드에 쪼개서 저장합니다.
- 해시 슬롯: Redis Cluster는 16,384개의 "해시 슬롯"을 사용합니다. 키는 알고리즘에 의해 특정 슬롯에 할당되고, 슬롯들이 노드에 분배됩니다.
- 이점: 단일 서버의 메모리 한계를 넘을 수 있고, 쓰기 성능을 높일 수 있습니다.
6. 고급 기능
- Pub/Sub (발행/구독):
- 메시지를 채널에 방송(Broadcast)하는 기능입니다.
- 예시: 채팅방. 유저 A가 "채널 1"에 메시지를 보내면, "채널 1"을 구독 중인 모든 유저가 즉시 받습니다.
- Transactions (트랜잭션):
MULTI,EXEC,DISCARD를 사용합니다.- 주의: SQL과 달리 Redis 트랜잭션은 내부 명령이 실패해도 롤백(Rollback)되지 않습니다. (성공한 건 그대로 유지됨).
- Lua Scripting:
- 서버 측에서 Lua 스크립트를 실행하여 복잡한 로직을 처리합니다. 스크립트 실행 중에는 다른 명령이 끼어들지 못하므로 원자성(Atomicity) 이 보장됩니다.
- Eviction Policies (메모리 관리):
- 메모리가 가득 찼을 때,
allkeys-lru(가장 최근에 덜 사용된 키 삭제) 같은 정책에 따라 기존 데이터를 삭제하고 공간을 확보합니다.
- 메모리가 가득 찼을 때,
7. 주요 사용 사례
- 캐싱(Caching): 메인 데이터베이스(SQL)의 부하를 줄임.
- 세션 저장소(Session Store): 로그인 토큰 저장 (빠르고, TTL로 자동 만료됨).
- 실시간 분석: 클릭 수, 조회 수, 좋아요 수 즉시 집계.
- 리더보드: 게임 랭킹 구현 (Sorted Set 활용).
- 큐(Queue): 백그라운드 작업 처리를 위한 메시지 대기열 (List 활용).
8. Redis vs. Memcached
| 특징 | Redis | Memcached |
|---|---|---|
| 자료형 | 풍부함 (List, Set, Hash 등) | 단순 문자열만 지원 |
| 영속성 | 있음 (디스크 저장) | 없음 (순수 메모리) |
| 복제(Replication) | 지원 | 미지원 |
| 복잡도 | 높음 | 매우 단순함 |
| 속도 | 매우 빠름 | 매우 빠름 |
references