DB를 조회할 때마다 100ms가 걸린다면, 동시 사용자 1,000명에서 서버가 버티지 못합니다.
Redis 캐싱으로 반복 조회 결과를 메모리에 저장해 응답 시간을 1ms 이하로 줄일 수 있습니다.
Redis란 무엇인가
Redis는 인메모리(RAM) 기반의 Key-Value 저장소입니다.
디스크 기반 DB와 달리 데이터를 메모리에서 처리하기 때문에 초당 10만 건 이상의 읽기/쓰기가 가능합니다.
캐싱 외에도 세션 저장, 메시지 큐, 분산 락 등 다양한 용도로 사용됩니다.
캐싱 전략 3가지
1. Cache-Aside (Lazy Loading)
가장 일반적인 패턴입니다.
캐시에 데이터가 없으면 DB에서 조회 후 캐시에 저장합니다.
import redis, json
r = redis.Redis(host="localhost", port=6379, decode_responses=True)
def get_user(user_id: int):
key = f"user:{user_id}"
cached = r.get(key)
if cached:
return json.loads(cached) # 캐시 히트
user = db.query(User).get(user_id) # DB 조회
r.setex(key, 3600, json.dumps(user.dict())) # 1시간 캐싱
return user
2. Write-Through
데이터를 쓸 때 DB와 캐시에 동시에 기록합니다.
데이터 일관성이 높지만 쓰기 비용이 증가합니다.
3. Write-Behind (Write-Back)
캐시에만 먼저 쓰고, 나중에 비동기로 DB에 반영합니다.
쓰기 성능이 최고지만, 장애 시 데이터 유실 위험이 있습니다.
TTL(Time To Live) 설정
캐시 데이터가 영구히 남으면 오래된 정보를 서비스할 수 있습니다.
데이터 특성에 맞는 TTL을 설정하세요.
- 사용자 프로필: 1시간
- 상품 목록: 10분
- 실시간 재고: 30초 이하
- 인증 토큰: 만료 시간과 동일
캐시 무효화는 어렵다
캐시의 가장 어려운 문제는 언제 캐시를 지울 것인가입니다.
데이터가 변경될 때 관련 캐시 키를 명시적으로 r.delete(key)로 삭제하는 방식이 가장 안전합니다.
Redis는 도입 복잡도 대비 성능 향상 효과가 매우 큰 도구입니다.
사용자가 많아지기 전에 미리 적용해 두세요.
작성한 정보가 조금이나마 유익하고 도움이 되셨다면, 가시기 전에 아래 광고 한번 살짝 눌러주시면 정말 큰 힘이 됩니다. 감사합니다!