~/VibeHandbook
무료 PDF

데이터베이스

redis.io

Redis

무엇인가

지금 당장 필요한 메모를 매번 서류함까지 걸어가는 대신 눈앞의 책상 위에 올려두는 상황을 떠올려 보세요. 훨씬 빠르지만, 전원이 꺼지면 책상 위 메모는 사라집니다. Redis는 그 책상처럼 데이터를 디스크가 아니라 빠른 작업 메모리(RAM, 임의 접근 메모리)에 보관하므로 읽기와 쓰기가 매우 빠릅니다. 필요하면 디스크에 저장할 수도 있습니다. 키-값 저장소로 동작하지만 리스트, 셋, 정렬된 셋, 해시, 스트림 같은 풍부한 데이터 구조를 지원합니다. 주로 기본 데이터베이스와 함께 캐시, 세션 저장소, 큐, 속도 제한기로 사용됩니다.

강점

  • 인메모리 동작 덕분에 1밀리초 미만의 지연 시간을 제공합니다.
  • 다재다능한 구조: 문자열, 해시, 리스트, 셋, 정렬된 셋, 스트림.
  • 내장 TTL(유효 시간)/만료 기능 — 각 항목이 정해진 시간이 지나면 스스로 삭제됨 — 덕분에 캐싱과 세션에 이상적입니다.
  • 원자적 연산과 Lua 스크립팅으로 안전한 카운터와 락을 구현할 수 있습니다.
  • pub/sub와 스트림으로 메시징과 이벤트 파이프라인을 지원합니다.

트레이드오프

  • 데이터는 사용 가능한 메모리에 제한되며, 대규모 데이터셋은 비용이 많이 듭니다.
  • 영속화는 선택 사항이며 충돌 시 최근 쓰기를 잃을 수 있습니다.
  • 내구성 있는 관계형 저장소를 대체하지는 못합니다.
  • 클러스터링은 샤딩과 장애 조치를 위한 운영 복잡성을 더합니다.

언제 사용하나

비용이 큰 쿼리 결과를 캐싱하거나, 세션을 저장하거나, 속도 제한을 구현하거나, 작업 큐를 관리하거나, 리더보드를 만들거나, 실시간 메시지를 전달할 때 Redis를 사용하세요. 진실의 원천(source of truth)을 보관하는 내구성 있는 데이터베이스와 함께 사용하세요.

바이브 코딩 적합성

AI에게 지시할 때는 Redis가 시스템의 기록 원천(system of record)이 아니라 캐시 또는 보조 저장소임을 명확히 하세요. 그래서 캐시 항목에는 항상 TTL을 설정해야 합니다. 또한 명확한 키 명명 규칙(예: user:123:profile)도 설계해야 합니다. 경쟁 상태(race)가 발생할 수 있는 읽기-수정-쓰기 시퀀스 대신 카운터에는 INCR, 락에는 SET ... NX EX 같은 원자적 명령을 사용하도록 요청하세요. 유용한 팁: AI에게 cache-aside 패턴을 쓰게 하세요. 이는 간단히 말해 먼저 캐시를 보고, 없으면 데이터베이스에서 가져온 뒤, 다음을 위해 캐시에 저장하는 방식입니다. 또한 AI에게 무효화(invalidation) 전략 — 오래되고 낡은 데이터를 어떻게 지우는지 — 을 설명하게 해서 더 이상 유효하지 않은 데이터가 남지 않도록 하세요.

# 1시간 만료로 값을 캐싱
SET user:123:profile "{\"name\":\"Ada\"}" EX 3600

# 원자적 속도 제한 카운터
INCR rate:ip:203.0.113.5
EXPIRE rate:ip:203.0.113.5 60

# 분산 락: 존재하지 않을 때만 설정하고 자동 만료
SET lock:job:42 "owner-a" NX EX 30

# 정렬된 셋으로 리더보드 구현
ZADD leaderboard 4200 "player:7"
ZREVRANGE leaderboard 0 9 WITHSCORES