본문으로 건너뛰기
김신건의 로그

Redis

· 수정 · 📖 약 2분 · 889자/단어 #database #in-memory #key-value #nosql #cache
레디스, redis

정의

Redis (REmote DIctionary Server)는 인메모리 키-값 저장소이다. Salvatore Sanfilippo가 2009년 만들었고, 현재는 Redis Ltd. 가 개발을 주도한다. BSD 라이선스 (7.4부터는 RSALv2/SSPLv1 듀얼).

메모리에 데이터를 올려 microsecond 단위 응답 속도를 제공한다. 캐시, 세션 저장소, 메시지 브로커, 리더보드 등에 쓰인다.

핵심 특성

  • Single-threaded event loop: 명령 처리는 단일 스레드, I/O multiplexing (epoll/kqueue)으로 동시 처리
  • 영속성 옵션: RDB snapshot 또는 AOF (append-only file) 로 디스크 백업 가능
  • 복제(Replication): master-replica 구조, 비동기 복제
  • Pub/Sub: pubsub-bus 메시지 브로커 기능
  • 트랜잭션: MULTI/EXEC로 명령 묶기, ACID는 아님 (격리 수준 낮음)

데이터 타입

타입설명주요 사용처
String바이너리 안전 문자열, 최대 512MB캐시, counter (INCR/DECR)
List연결 리스트, 양끝 삽입/삭제 O(1)큐, 최근 항목 목록
Hashfield-value 맵객체 저장 (user:1 → {name, email})
Set중복 없는 문자열 집합태그, 멤버십, 집합 연산
Sorted Set스코어로 정렬된 집합리더보드, 타임라인
Streamappend-only 로그, consumer group이벤트 소싱, 메시지 큐
HyperLogLog확률적 카디널리티 추정unique visitor 카운팅 (메모리 절약)
Geo경도/위도 좌표, 반경 검색위치 기반 서비스
Bitmap비트 배열 (String 기반)출석 체크, feature flag

영속성 (Persistence)

방식동작장점단점
RDB주기적 snapshot (SAVE/BGSAVE)파일 작음, 복구 빠름마지막 snapshot 이후 데이터 손실 가능
AOF모든 쓰기 명령 로그손실 최소화 (fsync 정책 따라)파일 큼, 복구 느림 (REWRITE 필요)

혼용 가능 (RDB + AOF). fsync 정책: always (느리지만 안전) / everysec (기본, 최대 1초 손실) / no (OS 관리).

복제·고가용성

  • Master-Replica: 비동기 복제, replica는 읽기 전용
  • Sentinel: 자동 failover, 모니터링, 알림
  • Cluster: 수평 확장, 16384 슬롯 hash partitioning, 노드 장애 시 자동 failover

Cluster는 단일 명령이 여러 슬롯에 걸치면 실행 불가 (hash tag {user:1} 로 회피 가능).

캐싱 패턴

패턴설명장단점
Cache-aside (Look-aside)앱이 읽기 전 캐시 확인 → miss면 DB 읽고 캐시 갱신가장 흔함, 캐시/DB 불일치 가능
Write-through쓰기마다 캐시+DB 동시 갱신일관성 높음, 쓰기 느림
Write-behind (Write-back)캐시 먼저 쓰고 비동기로 DB 반영쓰기 빠름, 장애 시 손실 위험

TTL (Time-To-Live) + Eviction policy (메모리 부족 시):

  • noeviction: 쓰기 거부
  • allkeys-lru, allkeys-lfu: 전체 키 중 LRU/LFU 제거
  • volatile-lru, volatile-lfu: TTL 있는 키만 대상
  • allkeys-random, volatile-random: 무작위 제거

주요 사용처

  • 캐시: DB 쿼리 결과, API 응답, 세션 데이터
  • Session Store: 분산 환경에서 사용자 세션 공유
  • Rate Limiting: INCR + EXPIRE로 요청 수 제한
  • Leaderboard: Sorted Set으로 랭킹 실시간 갱신
  • Pub/Sub Bus: 실시간 알림, 채팅 메시지 브로커
  • Queue: List (LPUSH/RPOP) 또는 Stream + consumer group
  • 분산 락: SETNX + EXPIRE (Redlock 알고리즘)

약점·주의점

  • 메모리 비용: 모든 데이터가 RAM에, 큰 데이터셋은 비쌈
  • Single-thread 제약: 무거운 연산 (KEYS *, SMEMBERS 큰 Set) 은 전체 차단
  • Key 단위 Atomicity: 여러 키 걸친 트랜잭션은 롤백 불가 (MULTI/EXEC는 isolation 약함)
  • 데이터 일관성: 비동기 복제라 failover 시 일부 쓰기 손실 가능
  • 네트워크 비용: 클라이언트-서버 왕복, 파이프라이닝으로 완화

💬 댓글

사이트 검색 / 명령어

검색

스크롤 = 확대/축소 · 드래그 = 이동 · 0 = 원래 크기 · ESC = 닫기