Redis
목차
Redis란
Redis 는 인메모리 데이터 구조 저장소입니다. 단순 키-값 저장소라기보다, 문자열, 해시, 리스트, 셋, 정렬된 셋, 스트림 같은 다양한 자료구조를 제공하는 것이 큰 특징입니다.1
Redis를 설명할 때 핵심은 다음 세 가지입니다.
- 메모리 기반이라 빠르다
- 자료구조가 다양하다
- 캐시 외에도 큐, 세션, 집계, 실시간 기능에 널리 쓰인다
Redis의 핵심 특징
- 인메모리 저장: 디스크 기반 DB보다 지연 시간이 낮은 편입니다.
- 다양한 자료구조: 단순 캐시를 넘어 리더보드, 집계, 큐 같은 패턴을 직접 구현하기 좋습니다.1
- 영속성 옵션: RDB 스냅샷과 AOF를 통해 재시작 후 복구 전략을 가져갈 수 있습니다.
- 간단한 운영 모델: 단일 인스턴스부터 replica, Sentinel, Cluster까지 확장할 수 있습니다.23
- 원자적 명령: 개별 명령은 원자적으로 실행됩니다.
Redis는 “빠른 캐시”로만 소개하기보다, 자료구조 중심으로 다양한 문제를 풀 수 있는 저장소라는 점까지 같이 설명하는 편이 좋습니다.
대표 데이터 구조와 사용처
| 자료구조 | 용도 예시 |
|---|---|
| String | 캐시, 카운터, 간단한 상태값 |
| Hash | 사용자 프로필, 속성 묶음 |
| List | 간단한 큐, 작업 대기열 |
| Set | 중복 제거, 태그, 집합 연산 |
| Sorted Set | 리더보드, 순위, score 기반 정렬 |
| Stream | 이벤트 스트림, 소비 그룹 기반 처리 |
| Bitmap / HyperLogLog | 비트 연산, 근사 집계 |
특히 면접에서 자주 나오는 예시는 다음입니다.
- String: 조회 결과 캐시
- Sorted Set: 게임 랭킹
- Set: 중복 사용자 추적
- Stream: 이벤트 파이프라인이나 소비자 그룹 처리4
고가용성과 확장
Redis는 기본적으로 primary-replica 복제를 지원합니다.2
- Primary: 쓰기 처리
- Replica: 복제본 읽기나 장애 대비
고가용성을 위해서는 Sentinel을 사용할 수 있습니다.3
- master/replica 모니터링
- 장애 감지
- 자동 failover
- 클라이언트에 현재 primary 정보 제공
더 큰 규모에서는 Redis Cluster로 샤딩 기반 확장을 할 수 있습니다.
다만 중요한 제약도 있습니다.
- Redis 복제는 비동기이므로 장애 순간의 acknowledged write가 모두 보존된다고 보장할 수는 없습니다.3
- 즉, 고가용성과 데이터 보존 보장은 분리해서 생각해야 합니다.
트랜잭션과 원자성
Redis는 MULTI / EXEC를 통해 여러 명령을 하나의 실행 단위처럼 다룰 수 있습니다.5
하지만 관계형 DB 트랜잭션과는 차이가 있습니다.
- 개별 명령은 원자적
- 여러 명령을 큐잉 후 순서대로 실행 가능
- 실패 시 자동 rollback은 없음
그래서 Redis 트랜잭션은 다음처럼 설명하는 편이 자연스럽습니다.
- “일괄 실행은 가능하지만, RDBMS처럼 rollback이 있는 ACID 트랜잭션은 아니다”
복잡한 원자 작업은 Lua 스크립트로 해결하는 경우도 많습니다.
Redis를 사용할 때 주의할 점
- 메모리 한계: 데이터가 전부 메모리에 올라가므로 메모리 비용이 크고 eviction 정책이 중요합니다.
- 캐시 정합성: 원본 DB와 캐시 간 무효화 전략을 잘못 잡으면 stale data가 생깁니다.
- 큰 키 문제: 큰 hash, list, set 하나가 성능 병목이 될 수 있습니다.
- 긴 명령 주의: 무거운 연산은 단일 스레드 처리 지연을 키울 수 있습니다.
- 영속성 트레이드오프: AOF, RDB 설정에 따라 성능과 데이터 보존 수준이 달라집니다.
- 메시지 시스템 대체 한계: Pub/Sub나 Stream은 유용하지만, Kafka나 RabbitMQ와 완전히 같은 역할로 일반화하면 위험합니다.
대표 사용 사례
- 캐시 계층
- 세션 저장소
- 분산 락
- 리더보드
- 실시간 집계
- 간단한 큐와 이벤트 처리
실무에서는 Redis를 메인 DB로 쓰기보다, 느린 저장소 앞단의 가속 계층 또는 고속 상태 저장소로 두는 경우가 많습니다.
면접 포인트
- Redis는 인메모리 캐시이면서도 다양한 자료구조를 제공하는 저장소로 함께 설명하는 편이 좋습니다.
- 개별 명령의 원자성과 RDBMS 트랜잭션은 구분해서 말해야 합니다.
- Sentinel은 고가용성, Cluster는 샤딩 확장이라는 역할 차이를 설명할 수 있어야 합니다.
- 비동기 복제라서 failover 순간 write 유실 가능성이 있다는 점도 알고 있어야 합니다.
- String, Hash, Sorted Set, Stream 같은 자료구조별 사용 사례를 바로 연결해서 말하면 답변이 강해집니다.