SAABlog
데이터베이스중급

ElastiCache 완벽 비교: Redis vs Memcached 언제 무엇을 선택할까?

AWS ElastiCache의 Redis와 Memcached를 비교합니다. 데이터 영속성, 고가용성, 데이터 구조 등 선택 기준을 명확히 설명합니다.

PHILOLAMB-
ElastiCacheRedisMemcached캐싱인메모리

관련 시험 도메인

  • 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단순 키-값, 멀티스레드, 경량
ValkeyRedis 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 비교

핵심 비교표

특성RedisMemcached
데이터 구조다양함 (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 필요
데이터베이스 쿼리 캐싱둘 다 가능단순 캐싱
실시간 리더보드RedisSorted Set 사용
실시간 알림RedisPub/Sub 사용
장바구니RedisHash, 영속성
페이지 캐싱Memcached단순, 빠름
메시지 큐RedisList 사용

5. 비용 비교

노드 비용

동일한 인스턴스 타입에서 시간당 요금은 동일합니다.

예: cache.r6g.large (서울 리전)
├── Redis: $X.XXX/시간
└── Memcached: $X.XXX/시간 (동일)

총 운영 비용 차이

요소RedisMemcached
노드 비용동일동일
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 미지원                    │
│      (인터넷에서 직접 접근 불가)                        │
└─────────────────────────────────────────────────────────┘

시험 출제 포인트

자주 나오는 문제 유형

  1. 기능 비교

    • "데이터 영속성 지원 캐시?" → Redis
    • "Pub/Sub 메시징 지원?" → Redis
    • "멀티스레드 지원?" → Memcached
  2. 고가용성

    • "자동 장애 조치가 필요한 캐시?" → Redis Multi-AZ
    • "복제를 지원하지 않는 캐시?" → Memcached
  3. 사용 사례

    • "세션 스토어로 적합한 캐시?" → 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는 "단순 캐싱", "멀티스레드", "데이터 손실 허용"이 명시된 경우에만 선택하세요.