본문 바로가기
Q&A2026년 6월 30일1분 읽기

Redis로 캐시했는데 가끔 옛날 데이터가 나옵니다

b
backend_sujin
조회 1093댓글 1

조회가 많은 상품 정보를 Redis에 캐시하고 TTL 5분 걸어놨습니다. 그런데 관리자가 상품을 수정해도 몇 분 동안 옛날 정보가 보이는 문제가 있어요. TTL 지나면 갱신되긴 하는데, 수정 즉시 반영이 안 되니까 CS 문의가 들어옵니다. TTL을 짧게 줄이는 게 답일까요?

댓글 1

김김영삼4개월 전

TTL을 줄이는 건 임시방편일 뿐이고, 근본은 수정 시점에 캐시를 무효화(invalidate)하는 겁니다. TTL은 "혹시 무효화를 놓쳤을 때의 안전망"으로 두는 거예요.

기본 패턴 — 쓰기 시 캐시 삭제
async function updateProduct(id, data) {
await db.product.update({ where: { id }, data })
await redis.del(`product:${id}`) // 수정 즉시 캐시 제거
}

다음 조회 때 캐시가 없으니 DB에서 새로 읽어 다시 채웁니다(cache-aside). 이러면 수정 즉시 최신이 반영돼요.

흔한 함정 3가지
  • 키 불일치 — 저장할 때 키와 삭제할 때 키가 미묘하게 다르면(예: product:123 vs products:123) 삭제가 안 먹습니다. 키 만드는 함수를 하나로 통일하세요.
  • 목록 캐시 누락 — 상세(product:123)만 지우고 목록(products:list)을 안 지우면 목록엔 옛 데이터가 남습니다. 연관 키를 함께 무효화하세요.
  • 캐시 스탬피드 — TTL이 동시에 만료되면 요청이 한꺼번에 DB로 몰립니다. 인기 키는 TTL에 약간의 무작위(jitter)를 더하거나, 갱신을 한 요청만 하도록 락을 거세요.
정리

TTL 5분은 그대로 두시고, 수정/삭제 로직에 redis.del을 추가하는 게 정답입니다. TTL은 백업, 무효화가 본진입니다.

Ctrl+Enter로 등록