Phase 2레슨 7
Cache
Cache Aside, Write Through, TTL, Eviction, Stampede, Invalidation
💡ELI5·
Cache를 책상에 비유하면
Client → Cache (Redis) ─hit─→ return
└miss→ DB → return + Cache SET💡 비유 — Cache = 책상 위 (빠르지만 공간 작음), DB = 창고 (느리지만 공간 큼). 자주 쓰는 물건은 책상 위에 올려두고, 가끔 쓰는 물건은 창고에 둔다. 책상이 꽉 차면 덜 쓰는 물건부터 창고로 돌려보낸다(Eviction).
🔬Deep Dive·
Cache Write 전략 비교
| 패턴 | 쓰기 흐름 | 일관성 | 쓰기 지연 | 적용 |
|---|---|---|---|---|
| Cache Aside | 읽기 시 miss → DB → cache 적재. 쓰기는 DB만 갱신 후 cache 삭제 | 낮음 (stale 가능) | 낮음 | 읽기 많고 쓰기 적은 일반 웹 |
| Write Through | 쓰기 시 Cache와 DB를 동시에 갱신 | 높음 | 높음 (DB 동기 대기) | 쓰기 일관성 중요 |
| Write Back | 쓰기 시 Cache만 갱신, 비동기로 DB에 나중에 반영 | 낮음 (장애 시 유실) | 매우 낮음 | 쓰기 폭발, 로그 수집 |
| Write Around | 쓰기 시 DB만 갱신, cache는 건드리지 않음 | 낮음 | 낮음 | 한 번 쓰고 안 읽는 데이터 |
Cache Aside (읽기):
Client → Cache? ─hit─→ return
└miss→ DB → return + Cache SET
Write Through (쓰기):
Client → Cache SET → DB WRITE → return (둘 다 동기)
Write Back (쓰기):
Client → Cache SET → return (즉시)
└async→ DB WRITE (나중에 batch)🔬Deep Dive·
Cache Stampede & Thundering Herd
인기 있는 key의 TTL이 만료되는 순간, 수많은 요청이 동시에 Cache Miss가 되어 DB로 몰려드는 현상. DB가 순간적으로 과부하로 죽을 수 있다.
방지 패턴: (1) 분산 락으로 첫 miss만 DB 조회, (2) XFetch 확률적 사전 갱신, (3) Stale-While-Revalidate, (4) TTL에 지터(jitter) 추가
🔬Deep Dive·
Redis 장애 시 DB 부하 — Cache의 함정
Cache가 잘 동작할 때 DB는 평온하다. 하지만 Redis가 장애로 내려가면, 그동안 Cache가 막아주던 트래픽이 전부 DB로 쏟아진다. 이를 cache failure cascade라 한다.
정상: Client → Redis(hit 95%) → DB(5%) 장애: Client → Redis(x) → DB(100%) → 과부하 → DB 다운 → 전체 장애 방어: Redis Cluster/Replica + DB 앞 Rate Limit + Circuit Breaker
💻Code·
Redis 기본 명령
# 문자열 (캐시 + TTL)
SET user:1001 '{"name":"kim","age":30}' EX 300
GET user:1001
TTL user:1001
# 해시 (객체 저장)
HSET profile:1001 name kim age 30 city seoul
HGETALL profile:1001
# 정렬된 집합 (리더보드)
ZADD ranking 950 alice 870 bob 1100 carol
ZREVRANGE ranking 0 2 WITHSCORES
# 카운터 (원자적 증가)
INCR page:home:views
INCRBY likes:post:42 5⚖️Trade-off·
Cache의 Trade-off
| 이점 | 대가 |
|---|---|
| 읽기 지연 수십~수백 배 감소 | 일관성 문제: stale data 발생 |
| DB 부하 감소 | Stampede/Thundering Herd 위험 |
| Redis 자료구조로 기능 확장 | Redis 장애 = DB cascade 위험 |
| Cache Aside는 구현 단순 | 운영 복잡성: TTL, eviction, 무효화 |
❓ 체크포인트 질문
- 1.Cache Aside와 Write Through의 가장 큰 차이는?
- 2.Cache Stampede를 방지하는 세 가지 패턴은?
- 3.LRU와 LFU eviction의 차이와 각각 유리한 상황은?
- 4.Redis가 장애 났을 때 시스템 전체가 죽는 원인과 대비책은?
- 5.Cache Invalidation이 '컴퓨터 과학에서 가장 어려운 두 가지' 중 하나인 이유는?