본문으로 건너뛰기
목록으로

Redis는 단순 캐시가 아니다 — 자료구조 10가지 총정리 (Redis 8)

Johny Cho
Software Engineer @ Kurly

Redis를 "빠른 key-value 캐시" 정도로만 쓰는 경우가 많습니다. 하지만 Redis는 값의 종류(자료구조)마다 전용 명령어를 제공해서, 큐·리더보드·위치 검색·벡터 검색까지 데이터베이스 한 대로 처리할 수 있습니다. "무엇을 저장하느냐"가 아니라 "어떤 자료구조로 저장하느냐"가 Redis 활용의 핵심입니다. Redis 8 기준으로 알아두면 좋은 10가지를 용도·명령어·사용 사례와 함께 정리합니다.

한눈에 보기

크게 핵심(자주 쓰는 것)특화(용도가 정해진 것) 로 나뉩니다.

구분자료구조한 줄 용도
핵심String키 하나에 값 하나(문자열·숫자)
핵심Hash키 하나에 필드-값 여러 개(객체)
핵심List순서 있는 목록(양쪽 끝 입출력)
핵심Set중복 없는 집합
핵심Sorted Set점수로 자동 정렬되는 집합
핵심Stream추가 전용 이벤트 로그(소비자 그룹)
핵심JSON중첩 JSON 문서
특화Geospatial위경도 기반 위치 검색
특화Vector Set임베딩 벡터 유사도 검색
특화Time Series타임스탬프 시계열 데이터

핵심 자료구조

1. String — 값 하나

가장 기본. 문자열·숫자·직렬화한 바이트를 담습니다. 숫자면 원자적 증감이 됩니다.

SET session:abc "user-123"        # 세션 토큰
INCR page:view:home # 조회수 +1 (원자적)
SET cache:key "..." EX 60 # 60초 TTL 캐시
세션·캐시·카운터처럼 "키 하나에 값 하나"면 String입니다.

2. Hash — 객체 하나

키 하나 밑에 필드-값 쌍 여러 개. 객체의 일부 필드만 읽고 쓸 수 있어 낭비가 적습니다.

HSET user:1 name "Kim" age 30 tier "gold"
HGET user:1 age # 30
HINCRBY user:1 age 1 # 나이만 +1

전체를 통째로 직렬화(String)하는 대신, 부분 갱신이 잦은 프로필·설정에 씁니다.

3. List — 순서 있는 목록

양쪽 끝에서 넣고 빼는 시퀀스. 큐(FIFO)나 스택(LIFO), 최근 목록에 맞습니다.

LPUSH queue:jobs "job-1"          # 왼쪽에 넣고
RPOP queue:jobs # 오른쪽에서 빼면 큐(FIFO)
LRANGE recent:search 0 9 # 최근 검색어 10개
BRPOP(블로킹 pop)을 쓰면 별도 폴링 없이 간단한 작업 큐가 됩니다.

4. Set — 중복 없는 집합

순서 없이 고유값만 담습니다. 포함 여부 확인과 집합 연산(교집합·합집합)이 빠릅니다.

SADD post:1:tags "redis" "db"
SISMEMBER post:1:tags "redis" # 1 (있음)
SINTER user:1:follow user:2:follow # 공통 팔로우

태그, 중복 제거, "함께 아는 친구" 같은 집합 연산에.

5. Sorted Set — 점수로 정렬되는 집합

각 원소에 점수(score) 를 붙여 자동 정렬합니다. 순위 조회가 로그 시간에 됩니다.

ZADD leaderboard 1500 "kim" 1720 "lee"
ZREVRANGE leaderboard 0 9 WITHSCORES # 상위 10명
ZREVRANK leaderboard "kim" # 내 순위
리더보드·우선순위 큐·"상위 N개"는 Sorted Set이 정석입니다.

6. Stream — 이벤트 로그

시간순으로 쌓이는 추가 전용 로그. 소비자 그룹을 지원해, 여러 소비자가 나눠 처리하고 처리 확인(ack)까지 합니다.

XADD orders * type "created" id "A-99"   # 이벤트 추가
XREADGROUP GROUP g1 c1 COUNT 10 STREAMS orders >
XACK orders g1 <id> # 처리 완료 표시

카프카식 메시지 큐가 필요하지만 별도 브로커까지는 과할 때 유용합니다.

7. JSON — 중첩 문서

중첩된 JSON 문서를 저장하고 JSONPath로 일부만 읽고 씁니다(Redis 8부터 코어 내장).

JSON.SET user:1 $ '{"name":"Kim","addr":{"city":"Seoul"}}'
JSON.GET user:1 $.addr.city # "Seoul"
JSON.SET user:1 $.addr.city '"Busan"' # 일부만 수정

문서 구조가 복잡하고 부분 수정이 잦으면 Hash보다 JSON이 편합니다.

특화 자료구조

8. Geospatial — 위치 검색

위경도를 넣고 반경/영역 검색을 합니다. 내부적으로는 지오해시를 Sorted Set에 담는 방식입니다.

GEOADD stores 127.02 37.50 "gangnam"
GEOSEARCH stores FROMLONLAT 127.0 37.5 BYRADIUS 3 km ASC

"내 주변 매장", "반경 N km 안" 같은 위치 기반 기능에.

9. Vector Set — 벡터 유사도 검색

텍스트·이미지를 숫자 배열(임베딩)로 바꿔 넣고, 가장 비슷한 것을 찾습니다(근사 최근접 이웃, ANN). Redis 8에서 새로 들어온 타입입니다.

VADD docs VALUES 3 0.1 0.2 0.3 "doc-1"   # 벡터 추가
VSIM docs VALUES 3 0.1 0.2 0.25 COUNT 5 # 가장 비슷한 5개

LLM의 검색 보강(RAG)에서 "관련 문서 찾기"를 이 Vector Set로 처리합니다. 임베딩·RAG 개념은 AI 개념 글에서 다뤘습니다.

10. Time Series — 시계열

타임스탬프가 붙은 값을 쌓고, 보존 기간·다운샘플링을 내장 지원합니다.

TS.CREATE cpu RETENTION 86400000        # 1일 보존
TS.ADD cpu * 73.4 # 현재 시각에 값 추가
TS.RANGE cpu - + AGGREGATION avg 60000 # 1분 평균

서버 메트릭, IoT 센서처럼 "시간에 따라 계속 쌓이는 수치"에.

보너스 — String에 얹힌 것들

따로 자료구조는 아니지만 자주 쓰는 두 가지도 알아두면 좋습니다(내부적으로 String 기반).

  • Bitmap — 비트 하나로 on/off. SETBIT user:active 1001 1 → "N일차 출석" 같은 대량 플래그를 아주 작은 메모리로.
  • HyperLogLog대략적인 고유 개수 세기. PFADD visitors user1 → 오차 ~1%로 수억 개 UV를 몇 KB로 카운트.

어떤 걸 언제 쓰나

하고 싶은 것자료구조
캐시·세션·카운터String
부분 수정 잦은 객체Hash / JSON
작업 큐·최근 목록List
중복 제거·집합 연산Set
리더보드·우선순위Sorted Set
이벤트 스트림·메시지 큐Stream
주변 검색·반경Geospatial
유사도(임베딩) 검색Vector Set
메트릭·센서 시계열Time Series
대량 on/off · 근사 카운트Bitmap · HyperLogLog

정리

  • Redis는 단순 key-value가 아니라 자료구조마다 전용 명령어를 제공하는 도구다.
  • 핵심 7가지(String·Hash·List·Set·Sorted Set·Stream·JSON)로 대부분의 캐시·큐·순위·문서 요구를 처리한다.
  • 특화 3가지(Geospatial·Vector Set·Time Series)로 위치·벡터·시계열까지 커버한다.
"이 데이터에 가장 맞는 자료구조가 무엇인가"를 먼저 고르면, Redis 명령어 하나로 끝날 일을 애플리케이션 코드로 힘들게 구현하지 않게 됩니다.

이 글은 cloudbro.ai — 엔지니어라면 반드시 알아야 할 Redis 자료구조 10가지를 바탕으로 명령어 예시를 더해 정리한 것입니다.