포스트

Redis란 무엇인가: 인메모리와 자료구조

Redis란 무엇인가: 인메모리와 자료구조

캐시 한 번 써보려다 빠진 Redis

처음 Redis를 접한 건 “DB 부하 줄이려고 캐시 좀 얹자”였습니다. 그런데 알고 보니 Redis는 단순 캐시를 넘어 다양한 자료구조를 다루는 인메모리 데이터 저장소였고, 랭킹·세션·큐·분산 락 같은 데도 두루 쓰이더라고요.

왜 빠른가: 인메모리 + 단일 스레드

  • 인메모리: 데이터를 디스크가 아닌 메모리(RAM) 에 둡니다. 디스크 I/O가 없으니 읽기/쓰기가 마이크로초 단위로 빠릅니다.
  • 단일 스레드 이벤트 루프: 명령을 한 번에 하나씩 순차 처리합니다. 의외로 이게 장점인데, 락 경합·컨텍스트 스위칭이 없어 단순하고 빠르며, 각 명령이 원자적으로 실행됩니다. (네트워크 I/O 등 일부는 멀티스레드로 보강)

단일 스레드라서, KEYS *처럼 오래 걸리는 명령 하나가 전체를 멈출 수 있습니다. 무거운 명령을 운영에서 함부로 쓰면 안 되는 이유입니다.

핵심은 “자료구조 서버”

Redis가 단순 key-value와 다른 점은 값(value)의 타입이 다양하다는 것입니다.

flowchart TD
    K["Key"] --> S["String<br/>문자열/숫자 (카운터, 캐시)"]
    K --> L["List<br/>순서 있는 목록 (큐, 스택)"]
    K --> H["Hash<br/>필드-값 맵 (객체 저장)"]
    K --> SE["Set<br/>중복 없는 집합 (태그, 좋아요)"]
    K --> Z["Sorted Set<br/>점수순 정렬 집합 (랭킹)"]

대표 자료구조와 쓰임새:

  • String: 캐시 값, 조회수 카운터(INCR)
  • List: 작업 큐, 최근 목록
  • Hash: 객체(사용자 프로필 등)를 필드 단위로
  • Set: 중복 제거, 태그, 교집합/합집합 연산
  • Sorted Set(ZSet): 점수 기반 랭킹 보드(실시간 순위)
1
2
3
4
5
INCR  post:42:views            # String 카운터
LPUSH queue:email "job1"        # List 큐
HSET  user:1 name "park" age 30 # Hash 객체
ZADD  ranking 1500 "alice"      # Sorted Set 랭킹
ZREVRANGE ranking 0 9 WITHSCORES # 상위 10명

이 외에도 Stream(메시지 스트림), Bitmap, HyperLogLog(근사 카운트), Geo(좌표) 등이 있습니다.

TTL — 만료 시간

키에 만료 시간을 줄 수 있어 캐시·세션에 딱입니다.

1
2
SET session:abc "userdata" EX 3600   # 1시간 뒤 자동 삭제
TTL session:abc                       # 남은 시간 확인

어디에 쓰나

  • 캐시: DB 앞단 캐싱(가장 흔함)
  • 세션 저장소: 분산 서버 간 세션 공유
  • 랭킹/리더보드: Sorted Set
  • 작업 큐 / 메시지: List, Stream
  • 분산 락: SET key val NX EX

정리

  • Redis = 인메모리 + (대체로) 단일 스레드라서 빠르고 원자적.
  • 단순 key-value가 아니라 자료구조 서버(String/List/Hash/Set/ZSet 등).
  • TTL로 캐시·세션 관리가 쉽다.
  • 무거운 명령(KEYS * 등)은 단일 스레드를 막으니 주의.
  • 다음 글에선 인메모리인 Redis가 데이터를 어떻게 영속화하는지(RDB/AOF) 다룹니다.
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.