ElastiCache 완벽 비교: Redis vs Memcached 언제 무엇을 선택할까?
AWS ElastiCache의 Redis와 Memcached를 비교합니다. 데이터 영속성, 고가용성, 데이터 구조 등 선택 기준을 명확히 설명합니다.
관련 시험 도메인
- Design High-Performing Architectures
핵심 요약
Redis는 복잡한 데이터 구조, 데이터 영속성, 고가용성이 필요할 때 선택합니다. Memcached는 단순한 키-값 캐싱과 멀티스레드 성능이 필요하고 데이터 손실이 허용될 때 선택합니다.
시험 팁
시험 빈출: "데이터 영속성이 필요한 캐시?" → Redis. "단순 캐싱 + 멀티스레드?" → Memcached. "Pub/Sub 메시징?" → Redis. "고가용성 + 자동 장애 조치?" → Redis.
1. Amazon ElastiCache란?
개념
Amazon ElastiCache는 완전관리형 인메모리 캐싱 서비스로, 마이크로초 수준의 지연 시간을 제공합니다. Redis, Memcached, 그리고 최근 추가된 Valkey 엔진을 지원합니다.
┌─────────────────────────────────────────────────────────┐
│ ElastiCache 아키텍처 │
├─────────────────────────────────────────────────────────┤
│ │
│ 애플리케이션 │
│ │ │
│ ▼ │
│ ┌───────────────────┐ │
│ │ ElastiCache │ ◀── 캐시 히트: 마이크로초 │
│ │ (Redis/Memcached) │ │
│ └─────────┬─────────┘ │
│ │ 캐시 미스 │
│ ▼ │
│ ┌───────────────────┐ │
│ │ RDS/Aurora │ ◀── 밀리초 ~ 초 │
│ │ (데이터베이스) │ │
│ └───────────────────┘ │
│ │
│ 효과: DB 부하 감소, 응답 속도 개선 │
└─────────────────────────────────────────────────────────┘
지원 엔진
| 엔진 | 설명 |
|---|---|
| Redis | 고급 데이터 구조, 영속성, HA 지원 |
| Memcached | 단순 키-값, 멀티스레드, 경량 |
| Valkey | Redis OSS 포크, 오픈소스 호환 (신규) |
2. Redis 특징
핵심 기능
┌─────────────────────────────────────────────────────────┐
│ Redis 주요 기능 │
├─────────────────────────────────────────────────────────┤
│ │
│ 📊 데이터 구조 │
│ ├── String: 단순 키-값 │
│ ├── List: 순서 있는 컬렉션 (큐, 스택) │
│ ├── Set: 고유 값 집합 │
│ ├── Sorted Set: 점수 기반 정렬 (리더보드) │
│ ├── Hash: 필드-값 쌍 (객체 저장) │
│ └── Bitmap, HyperLogLog, Stream 등 │
│ │
│ 💾 데이터 영속성 │
│ ├── 스냅샷 (RDB): 특정 시점 백업 │
│ └── AOF: 모든 쓰기 작업 로그 │
│ │
│ 🔄 고가용성 │
│ ├── Multi-AZ 복제 │
│ ├── 자동 장애 조치 (Failover) │
│ └── Read Replica │
│ │
│ 📨 Pub/Sub 메시징 │
│ └── 실시간 메시지 발행/구독 │
└─────────────────────────────────────────────────────────┘
고가용성 구성
┌─────────────────────────────────────────────────────────┐
│ Redis Multi-AZ 구성 │
├─────────────────────────────────────────────────────────┤
│ │
│ AZ-a AZ-b │
│ ┌──────────┐ ┌──────────┐ │
│ │ Primary │ ─── 복제 ────▶ │ Replica │ │
│ │ (읽기/ │ │ (읽기 │ │
│ │ 쓰기) │ │ 전용) │ │
│ └──────────┘ └──────────┘ │
│ │ │ │
│ └───────────────────────────┘ │
│ │ │
│ ▼ │
│ Primary 장애 시 → Replica가 자동으로 Primary 승격 │
│ (자동 Failover) │
└─────────────────────────────────────────────────────────┘
클러스터 모드
| 모드 | 설명 |
|---|---|
| 클러스터 모드 비활성화 | 단일 샤드, 최대 1 Primary + 5 Replica |
| 클러스터 모드 활성화 | 다중 샤드, 데이터 파티셔닝, 더 큰 데이터셋 |
3. Memcached 특징
핵심 기능
┌─────────────────────────────────────────────────────────┐
│ Memcached 주요 기능 │
├─────────────────────────────────────────────────────────┤
│ │
│ 📊 데이터 구조 │
│ └── String만 지원 (단순 키-값) │
│ │
│ 🔧 멀티스레드 │
│ └── 멀티코어 CPU 활용 가능 │
│ │
│ 🔍 Auto Discovery │
│ └── 클러스터 노드 자동 검색 │
│ │
│ ❌ 미지원 기능 │
│ ├── 데이터 영속성 (스냅샷, 백업) │
│ ├── 복제 (Replication) │
│ ├── 자동 장애 조치 │
│ └── Pub/Sub 메시징 │
└─────────────────────────────────────────────────────────┘
Memcached 아키텍처
┌─────────────────────────────────────────────────────────┐
│ Memcached 클러스터 │
├─────────────────────────────────────────────────────────┤
│ │
│ 노드 1 노드 2 노드 3 │
│ ┌──────┐ ┌──────┐ ┌──────┐ │
│ │Key A │ │Key B │ │Key C │ │
│ │Key D │ │Key E │ │Key F │ │
│ └──────┘ └──────┘ └──────┘ │
│ │ │ │ │
│ └──────────────┼──────────────┘ │
│ │ │
│ ▼ │
│ 데이터 분산 저장 │
│ (복제 없음, 노드 장애 = 데이터 손실) │
└─────────────────────────────────────────────────────────┘
시험 팁
시험 포인트: Memcached는 복제를 지원하지 않습니다. 노드 장애 시 해당 노드의 데이터는 손실됩니다. 데이터 손실이 허용되지 않으면 Redis를 선택하세요.
4. Redis vs Memcached 비교
핵심 비교표
| 특성 | Redis | Memcached |
|---|---|---|
| 데이터 구조 | 다양함 (String, List, Set, Hash 등) | String만 |
| 데이터 영속성 | ✅ 스냅샷, 백업 지원 | ❌ |
| 복제 | ✅ Read Replica | ❌ |
| 고가용성 | ✅ Multi-AZ, 자동 Failover | ❌ |
| Pub/Sub | ✅ | ❌ |
| 트랜잭션 | ✅ | ❌ |
| Lua 스크립팅 | ✅ | ❌ |
| 멀티스레드 | ❌ (싱글스레드) | ✅ |
| 관리 복잡도 | 높음 | 낮음 |
선택 기준 플로우차트
시작
│
├── 데이터 영속성이 필요한가?
│ ├── 예 → Redis
│ └── 아니오 → 다음 질문
│
├── 고가용성(HA)이 필요한가?
│ ├── 예 → Redis
│ └── 아니오 → 다음 질문
│
├── 복잡한 데이터 구조가 필요한가? (List, Set, Hash)
│ ├── 예 → Redis
│ └── 아니오 → 다음 질문
│
├── Pub/Sub 메시징이 필요한가?
│ ├── 예 → Redis
│ └── 아니오 → 다음 질문
│
└── 단순 캐싱 + 멀티스레드 성능이 중요한가?
├── 예 → Memcached
└── 아니오 → Redis (기본 선택)
사용 사례별 권장
| 사용 사례 | 권장 엔진 | 이유 |
|---|---|---|
| 세션 스토어 | Redis | 영속성, HA 필요 |
| 데이터베이스 쿼리 캐싱 | 둘 다 가능 | 단순 캐싱 |
| 실시간 리더보드 | Redis | Sorted Set 사용 |
| 실시간 알림 | Redis | Pub/Sub 사용 |
| 장바구니 | Redis | Hash, 영속성 |
| 페이지 캐싱 | Memcached | 단순, 빠름 |
| 메시지 큐 | Redis | List 사용 |
5. 비용 비교
노드 비용
동일한 인스턴스 타입에서 시간당 요금은 동일합니다.
예: cache.r6g.large (서울 리전)
├── Redis: $X.XXX/시간
└── Memcached: $X.XXX/시간 (동일)
총 운영 비용 차이
| 요소 | Redis | Memcached |
|---|---|---|
| 노드 비용 | 동일 | 동일 |
| HA 구성 | 복제본 추가 필요 → 비용 증가 | 복제 불가 |
| 백업 스토리지 | 스냅샷 저장 비용 | 없음 |
| 데이터 전송 | Multi-AZ 전송 비용 | 없음 |
시험 팁
비용 포인트: Redis의 Multi-AZ 구성은 최소 2개 노드(Primary + Replica)가 필요하여 Memcached보다 총 비용이 높을 수 있습니다.
6. ElastiCache 설정
Redis 클러스터 생성 (콘솔)
1. ElastiCache 콘솔 → Redis 클러스터 생성
2. 설정:
├── 클러스터 모드: 활성화/비활성화
├── 노드 유형: cache.r6g.large
├── 복제본 수: 1-5
├── Multi-AZ: 활성화
└── 암호화: 전송 중/저장 시
3. 서브넷 그룹 선택 (VPC 내)
4. 보안 그룹 설정
5. 백업 설정 (보존 기간, 백업 윈도우)
CLI로 생성
# Redis 복제 그룹 생성
aws elasticache create-replication-group \
--replication-group-id my-redis-cluster \
--replication-group-description "My Redis cluster" \
--engine redis \
--cache-node-type cache.r6g.large \
--num-cache-clusters 2 \
--automatic-failover-enabled \
--multi-az-enabled
7. 캐싱 전략
캐시 어사이드 (Lazy Loading)
┌─────────────────────────────────────────────────────────┐
│ Cache-Aside 패턴 │
├─────────────────────────────────────────────────────────┤
│ │
│ 1. 캐시 확인 │
│ App ──▶ ElastiCache │
│ │ │
│ ├── 캐시 히트 → 데이터 반환 │
│ │ │
│ └── 캐시 미스 ─┐ │
│ │ │
│ 2. DB 조회 ▼ │
│ App ──▶ Database ──▶ 데이터 반환 │
│ │ │
│ 3. 캐시 저장 │ │
│ App ──▶ ElastiCache ◀──┘ │
│ │
│ 장점: 필요한 데이터만 캐싱, 캐시 실패에 강함 │
│ 단점: 첫 요청 느림, 데이터 불일치 가능 │
└─────────────────────────────────────────────────────────┘
Write-Through
┌─────────────────────────────────────────────────────────┐
│ Write-Through 패턴 │
├─────────────────────────────────────────────────────────┤
│ │
│ 쓰기 시: │
│ App ──▶ ElastiCache ──▶ Database │
│ (캐시 저장) (DB 저장) │
│ │
│ 읽기 시: │
│ App ──▶ ElastiCache ──▶ 데이터 반환 │
│ (항상 히트) │
│ │
│ 장점: 읽기 항상 빠름, 데이터 일관성 │
│ 단점: 쓰기 지연, 불필요한 데이터도 캐싱 │
└─────────────────────────────────────────────────────────┘
TTL (Time To Live)
# TTL 설정 예시 (Python)
import redis
r = redis.Redis(host='my-cluster.cache.amazonaws.com')
# 1시간 TTL로 데이터 저장
r.setex('session:123', 3600, 'user_data')
# 조회
data = r.get('session:123')
8. 보안 설정
암호화
| 옵션 | 설명 |
|---|---|
| 전송 중 암호화 | TLS를 사용한 클라이언트-서버 통신 암호화 |
| 저장 시 암호화 | 디스크의 데이터 암호화 (Redis만) |
인증
Redis AUTH:
├── 기본 AUTH: 단일 암호
└── IAM 인증: IAM 역할 기반 (Redis 6.0+)
Memcached:
└── SASL 인증 지원
네트워크 보안
┌─────────────────────────────────────────────────────────┐
│ ElastiCache 네트워크 보안 │
├─────────────────────────────────────────────────────────┤
│ │
│ VPC 내 배포: │
│ ├── 프라이빗 서브넷 권장 │
│ ├── 보안 그룹으로 접근 제어 │
│ └── VPC 엔드포인트로 AWS 서비스 연결 │
│ │
│ 인터넷 접근: │
│ └── ElastiCache는 퍼블릭 IP 미지원 │
│ (인터넷에서 직접 접근 불가) │
└─────────────────────────────────────────────────────────┘
시험 출제 포인트
자주 나오는 문제 유형
-
기능 비교
- "데이터 영속성 지원 캐시?" → Redis
- "Pub/Sub 메시징 지원?" → Redis
- "멀티스레드 지원?" → Memcached
-
고가용성
- "자동 장애 조치가 필요한 캐시?" → Redis Multi-AZ
- "복제를 지원하지 않는 캐시?" → Memcached
-
사용 사례
- "세션 스토어로 적합한 캐시?" → Redis (영속성, HA)
- "실시간 리더보드?" → Redis (Sorted Set)
- "단순 페이지 캐싱?" → 둘 다 가능, Memcached 권장
시험 팁
핵심 암기:
- Redis = 영속성 + 복제 + HA + 다양한 데이터 구조
- Memcached = 단순 + 멀티스레드 + 영속성 없음
- 대부분의 경우 Redis가 정답 (더 많은 기능)
FAQ
Q1: 세션 저장소로 어떤 것을 선택해야 하나요?
Redis를 권장합니다. 세션은 사용자 경험에 중요하므로 데이터 영속성과 고가용성이 필요합니다. 노드 장애 시에도 세션이 유지되어야 합니다.
Q2: Memcached의 노드가 장애 나면 데이터는 어떻게 되나요?
해당 노드의 데이터는 손실됩니다. Memcached는 복제를 지원하지 않으므로, 노드 장애 시 복구 방법이 없습니다. 애플리케이션이 캐시 미스를 처리할 수 있어야 합니다.
Q3: Redis가 더 비싼가요?
노드당 비용은 동일합니다. 하지만 Redis의 Multi-AZ 구성(복제본 추가)은 총 비용을 높일 수 있습니다. Memcached는 단일 노드로 운영되므로 단순 비교 시 저렴할 수 있습니다.
Q4: 언제 Memcached를 선택해야 하나요?
다음 조건이 모두 해당될 때:
- 단순 키-값 캐싱만 필요
- 데이터 손실 허용 (캐시 재생성 가능)
- 고가용성 불필요
- 멀티스레드 성능이 중요
Q5: Valkey는 언제 사용하나요?
Valkey는 Redis OSS의 포크로, 라이선스 문제 없이 오픈소스를 사용하고 싶을 때 선택합니다. 기능은 Redis와 대부분 호환됩니다.
마무리
ElastiCache 엔진 선택의 핵심:
| 요구 사항 | 선택 |
|---|---|
| 영속성 필요 | Redis |
| 고가용성 필요 | Redis |
| 복잡한 데이터 구조 | Redis |
| Pub/Sub 메시징 | Redis |
| 단순 캐싱 + 데이터 손실 허용 | Memcached |
시험 팁: 대부분의 SAA 시험 시나리오에서는 Redis가 정답인 경우가 많습니다. Memcached는 "단순 캐싱", "멀티스레드", "데이터 손실 허용"이 명시된 경우에만 선택하세요.