MMeshOps
Redis 실전: 서비스 장애를 막는 안전한 캐싱과 상태 관리
9예상 3중급

[요약] Part 2. Redis 데이터를 안전하게 다루는 핵심 원칙

Part 2. 날아가는 데이터를 다루는 5가지 필수 개념의 핵심 내용을 불릿 포인트로 정리하고 복습하는 요약 회차입니다.

이전 회차들을 통해 Redis에 들어간 데이터를 언제 비우고, 어떻게 갱신하며, 문제가 생겼을 때 어떻게 대처하는지 배웠습니다. 이번 요약 회차에서는 Part 2에서 다룬 '날아가는 데이터를 다루는 핵심 원칙'들을 짧고 명확하게 복습합니다.

데이터 수명 관리: 무한정 쌓아두지 말 것

Redis는 메모리 저장소이므로 모든 데이터가 무한히 쌓이면 결국 서버 전체가 다운(OOM)될 수 있습니다.

  • TTL(Time To Live)의 필수 적용
  • 모든 캐시 데이터에는 명확한 수명(TTL)을 부여해야 합니다.
  • 데이터의 중요도와 실시간성에 따라 수명을 조정합니다. (예: 세션 1시간, 인증번호 3분)
  • 과거 데이터(Stale Data) 방지
  • 수명이 끝난 데이터는 메모리에서 지워져 사용자에게 잘못된 과거 정보가 노출되는 것을 막습니다.

캐시 무효화와 데이터 갱신 전략

메인 데이터베이스 원본이 변경되었을 때 Redis의 데이터를 가만히 두면 심각한 정보 불일치가 발생합니다.

  • 캐시 무효화 (Cache Invalidation)
  • 원본 데이터 변경(수정/삭제) 시 기존 Redis 데이터를 직접 덮어쓰기보다는 아예 지워버리는 방식을 선호합니다.
  • 동시성 문제가 줄어들고 코드가 훨씬 단순해집니다.
  • 무효화 타이밍
  • 데이터베이스의 쿼리가 성공적으로 끝난 직후 관련된 Redis 키(Key)를 즉시 삭제해야 합니다.

캐시 미스 대응과 복구 패턴

Redis에 원하는 데이터가 없을 때 당황하지 않고 메인 데이터베이스에서 데이터를 다시 채워넣는 흐름입니다.

  • Cache-Aside 패턴
  • 캐시 히트(Cache Hit): Redis에 데이터가 있으면 즉시 반환하여 속도를 높입니다.
  • 캐시 미스(Cache Miss): Redis에 데이터가 없으면 PostgreSQL에서 읽어옵니다.
  • 복구 갱신: 읽어온 원본 데이터를 즉시 Redis에 적재(TTL 포함)해 다음 사용자를 대비합니다.

메모리 방어와 안전한 식별자 규칙

예측 불가능한 트래픽이나 개발자의 실수로부터 Redis를 보호하는 최후의 수단입니다.

  • 메모리 퇴출 정책 (LRU)
  • 한계치(maxmemory) 도달 시 가장 오래 사용되지 않은(Least Recently Used) 데이터부터 삭제하여 여유 공간을 만듭니다.
  • 안전한 네임스페이스 규칙
  • 단순한 숫자로만 키(Key)를 지으면 데이터가 덮어써지는 사고가 발생합니다.
  • 콜론(`:`)을 사용해 `user:profile:1` 형식으로 계층화하여 직관성과 안전성을 확보합니다.

Part 2의 핵심 개념을 모두 담은 종합 예시

// [캐시 미스와 무효화, TTL, 네이밍 규칙 종합 세트]

// 1. 네임스페이스를 활용한 안전한 조회 (캐시 히트 확인)
let profile = await redisClient.get(`user:profile:${id}`);

if (!profile) {
  // 2. 캐시 미스 시 DB에서 원본 조회
  const originData = await db.query('SELECT ...');
  
  // 3. 복구 시 무한 방치 방지를 위해 TTL 600초 적용
  await redisClient.set(`user:profile:${id}`, JSON.stringify(originData), { EX: 600 });
}

// ... 다른 로직 수행 ...

// 4. 정보가 변경되면 즉시 캐시 무효화(삭제) 진행
await db.query('UPDATE ...');
await redisClient.del(`user:profile:${id}`);

개념 퀴즈

퀴즈 답을 맞춰야 학습 완료가 됩니다.

Part 2에서 배운 Redis 활용 원칙 중 올바르지 않은 것은 무엇인가요?

3줄 요약

  1. 1모든 캐시에 TTL을 설정하고 한계 도달 시 LRU 정책으로 삭제되도록 구성해 서버 메모리 고갈을 예방합니다.
  2. 2원본 데이터가 수정되었을 땐 Redis 캐시를 즉시 삭제(무효화)하여 데이터 불일치와 오류를 막습니다.
  3. 3안전한 키(Key) 명명 규칙과 Cache-Aside 패턴을 철저히 지키면 복잡한 갱신 로직 없이도 견고한 시스템을 만들 수 있습니다.