Redis 캐시 어사이드

Redis 캐시 어사이드 (Cache-aside)

데이터베이스 조회 결과를 Redis에 캐싱하고, TTL로 신선도(staleness)를 제한하는 전형적인 캐싱 패턴입니다. 읽기가 많은 워크로드에서 주 데이터베이스의 부하를 줄이고 서브 밀리초 대기 시간으로 반복 조회를 처리하고 싶을 때 사용합니다.

출처: 공식문서 — Redis cache-aside

언제 Redis 캐시 어사이드를 쓰는가

캐시 어사이드는 실제로 요청되는 데이터만 캐싱하면서, 주 데이터베이스에 과부하를 주지 않고 서브 밀리초 대기 시간으로 반복 읽기를 제공해야 할 때 사용합니다.

왜 이 문제가 어려운가

읽기가 많은 워크로드(상품 카탈로그, 사용자 프로필, API 응답)는 같은 레코드를 업데이트 사이에 수천 번 조회합니다. 내구성에 최적화된 주 데이터베이스는 모든 요청에 디스크 기반 조회 비용을 전부 지불합니다. 트래픽이 늘면 P95 대기 시간이 악화되고, 커넥션 풀이 고갈되며, 짧은 스파이크가 광범위한 서비스 장애로 이어질 수 있습니다.

인-프로세스 캐시는 단일 인스턴스에서는 해결하지만, 여러 무상태(stateless) 서비스에선 깨집니다. 각 인스턴스가 독립적으로 워밍되어 메모리를 중복 사용하고, 일관되게 무효화할 수 없기 때문입니다. 인기 캐시 키가 높은 동시성 아래에서 만료되면 수십 개 프로세스가 동시에 같은 레코드를 조회하는 **캐시 스탬피드(cache stampede)**가 발생해, 원래 막으려던 부하 스파이크를 오히려 증폭시킵니다.

이 사용 사례는 모든 쓰기에 전체 데이터셋을 미러링하는 write-through / write-behind 캐싱과는 다릅니다. 또한 정확한 키 조회 대신 임베딩 유사도로 LLM 응답을 매칭하는 시맨틱 캐싱과도 다릅니다.

Redis 솔루션에서 기대할 수 있는 것

  • 피크 트래픽에서 캐시된 엔티티의 P95 읽기 대기 시간을 5ms 미만으로 유지
  • 읽기 복제본을 프로비저닝하지 않고 히트율(hit rate)에 비례해 주 DB 부하 감소
  • 실제로 요청된 데이터만 캐싱해 메모리를 작업 세트(working set)로 제한
  • 쓰기 시 무효화로 오래된 데이터 창을 설정된 한도 내로 유지
  • 부하 중 인기 키 만료를 DB 스탬피드 없이 견딤
  • 전체 객체를 역직렬화·재작성하지 않고 캐시된 엔티티의 개별 필드 업데이트

Redis가 이 솔루션을 어떻게 지원하는가

실제로 각 캐시 엔티티는 cache:{entity}:{id} 같은 키에 저장되고, TTL로 stale 데이터를 서빙할 수 있는 시간을 제한합니다. 애플리케이션은 매 요청마다 Redis를 읽고, miss면 주 DB로 폴백해 결과를 Redis에 다시 씁니다. 업데이트 시에는 주 DB에 쓰고 캐시 키를 무효화합니다.

Redis가 캐시 어사이드에 좋은 이유가 되는 기능:

  • GET / SET과 키별 EX/PX TTL로 모든 항목의 stale 창을 제한하고, 쓰기 시 DEL로 명시적 무효화
  • Hashes(HSET, HGET)와 네이티브 JSON 경로 접근(JSON.SET, JSON.GET)으로 구조화·부분 필드 캐싱 — Memcached 같은 문자열 전용 스토어의 실질적 갭 해소
  • EVAL과 함께하는 Lua 스크립팅으로 원자적 스탬피드 완화 — 뮤텍스 락이나 확률적 조기 갱신을 외부 락 없이 단일 원자 단계로 실행
  • TTL로 재계산 없이 캐시 키의 남은 stale 시간 모니터링
  • 메모리에서의 서브 밀리초 읽기로 요청 경로의 오버헤드가 무시할 정도. 세션·레이트 리밋·큐 등에 이미 Redis를 쓰고 있다면 같은 인스턴스에서 한계 인프라 비용 0으로 캐시 어사이드를 실행

에코시스템

Redis 기반 캐시 어사이드 통합을 제공하는 라이브러리·프레임워크:

더 알아보기 (Learn more)

  • 직접 캐시 어사이드를 만들어 보는 코드 예제: redis-py(Python), node-redis(Node.js), go-redis(Go), Jedis(Java), Lettuce(Java), StackExchange.Redis(C#), Predis(PHP), redis-rb(Ruby), redis-rs(Rust) — 각 라이브러리에 대해 실행 가능한 인터랙티브 데모를 제공합니다.
  • Redis 캐싱 가이드 — 더 넓은 캐싱 패턴 개요.
  • Redis 만료·퇴출 정책 — TTL·maxmemory 퇴출 작동 원리.