Redis란 무엇인가

한 줄 정의

Redis (Remote Dictionary Server) = 인메모리 데이터 구조 저장소. 캐시, 메시지 브로커, 데이터베이스로 사용 가능.


Redis가 빠른 이유

일반 DB (디스크 기반):
  요청 → 네트워크 → DB 프로세스 → 디스크 I/O → 응답
  지연: 수 밀리초 ~ 수십 밀리초

Redis (인메모리):
  요청 → 네트워크 → Redis 프로세스 → RAM 접근 → 응답
  지연: 수십 마이크로초 (0.1ms 이하)

속도의 근거:

  • 모든 데이터가 RAM에 상주
  • 단순한 자료구조 (해시테이블, 링크드리스트 등)
  • 싱글 스레드 이벤트 루프 (I/O 멀티플렉싱) → 컨텍스트 스위칭 없음
  • 네트워크 레이어 최소화 (RESP 프로토콜)

Redis vs 일반 캐시

단순 캐시 (Memcached):
  key → value (문자열만)
  TTL, 만료
  끝

Redis:
  key → String, List, Set, Sorted Set, Hash, Bitmap,
        HyperLogLog, Geospatial, Stream
  TTL, 만료, 만료 이벤트
  트랜잭션, Lua 스크립트
  영속성 (RDB, AOF)
  Pub/Sub
  복제, Sentinel, Cluster
  → 캐시 + 데이터베이스 + 메시지 브로커

아키텍처

┌──────────────────────────────────────────┐
│                Redis Server               │
│                                           │
│  ┌────────────────────────────────────┐  │
│  │     Event Loop (싱글 스레드)        │  │
│  │                                    │  │
│  │  I/O Multiplexing (epoll/kqueue)   │  │
│  │    ↕ 수천 개 클라이언트 동시 처리   │  │
│  └────────────────────────────────────┘  │
│                                           │
│  ┌──────────────────┐  ┌──────────────┐  │
│  │   In-Memory DB   │  │  Persistence  │  │
│  │  (Hash Table)    │  │  (RDB / AOF) │  │
│  └──────────────────┘  └──────────────┘  │
└──────────────────────────────────────────┘

싱글 스레드의 장점:

  • 경쟁 조건(Race Condition) 없음
  • 원자적 명령어 보장
  • 락(Lock) 없음 → 오버헤드 없음

싱글 스레드의 제약:

  • 오래 걸리는 명령어(KEYS *, FLUSHALL 등)가 전체 서버 블로킹
  • CPU 코어 하나만 사용 (Redis 6.0+부터 I/O 스레드 도입)

데이터 타입 한눈에

타입설명주요 명령어
String문자열, 정수, 바이너리SET, GET, INCR, APPEND
List순서 있는 연결 리스트LPUSH, RPUSH, LRANGE, BLPOP
Set중복 없는 집합SADD, SMEMBERS, SUNION, SINTER
Sorted Set점수 기반 정렬 집합ZADD, ZRANGE, ZRANK, ZSCORE
Hash필드-값 맵HSET, HGET, HMGET, HINCRBY
Bitmap비트 배열SETBIT, GETBIT, BITCOUNT
HyperLogLog확률적 중복 제거PFADD, PFCOUNT
Geospatial위경도 인덱스GEOADD, GEODIST, GEORADIUS
Stream메시지 스트림XADD, XREAD, XGROUP

영속성

Redis는 인메모리지만 영속성을 제공.

RDB (Redis Database Backup):
  특정 시점의 스냅샷을 .rdb 파일로 저장
  빠른 재시작, 적은 디스크 사용
  마지막 스냅샷 이후 데이터 유실 가능

AOF (Append Only File):
  모든 쓰기 명령을 .aof 파일에 추가
  데이터 유실 최소화
  파일 크기 증가

복합 사용:
  RDB + AOF 동시 사용 → 빠른 재시작 + 데이터 안전성

주요 사용 사례

캐싱

DB 부하 감소:
  클라이언트 → Redis (캐시 히트) → 응답 (빠름)
  클라이언트 → Redis (캐시 미스) → DB → Redis 저장 → 응답

세션 저장소

여러 서버 인스턴스가 공유하는 세션:
  서버 1 ─┐
  서버 2 ─┼─→ Redis (세션 저장) ← 모든 서버가 공유
  서버 3 ─┘

분산 락

동시 접근 제어:
  서비스 A: SET lock:order-123 "서비스A" NX EX 30  → 성공
  서비스 B: SET lock:order-123 "서비스B" NX EX 30  → 실패 (이미 존재)

리더보드 / 랭킹

Sorted Set으로 점수 기반 실시간 순위:
  ZADD leaderboard 9500 "alice"
  ZADD leaderboard 8800 "bob"
  ZRANK leaderboard "bob"  → 1 (0-based, alice가 0위)

Rate Limiting

초당 API 호출 제한:
  INCR rate:user-123:2024010112
  EXPIRE rate:user-123:2024010112 60

Pub/Sub

실시간 메시지:
  채팅 서버 A → PUBLISH channel:room-1 "안녕하세요"
  채팅 서버 B ← SUBSCRIBE channel:room-1  → 수신

작업 큐

백그라운드 작업:
  API 서버: LPUSH queue:email-send '{"to":"alice@..."}'
  Worker:   BRPOP queue:email-send  → 이메일 발송

Redis 버전 역사

버전주요 기능
1.0 (2009)기본 자료구조
2.6 (2012)Lua 스크립팅
3.0 (2015)Redis Cluster
4.0 (2017)모듈 시스템, Lazy Freeing
5.0 (2018)Redis Streams
6.0 (2020)ACL, SSL, I/O 멀티스레딩
6.2 (2021)COPY, GETDEL, LMPOP
7.0 (2022)Redis Functions, Multi-Part AOF
7.2 (2023)Sharded Pub/Sub, LMPOP 개선
8.0 (2025)Redis Stack 통합, 성능 개선

정리

  • Redis = 인메모리 데이터 구조 저장소, 단순 캐시 그 이상
  • RAM 기반 → 마이크로초 응답 시간
  • 풍부한 자료구조 → 다양한 문제를 Redis 하나로 해결
  • 영속성 + 복제 + 클러스터 → 프로덕션 고가용성 지원
  • 캐시, 세션, 분산락, 랭킹, 큐, Pub/Sub 등 광범위한 활용