Redis는 단순 캐시가 아니다 — 자료구조 10가지 총정리 (Redis 8)
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 캐시
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" # 내 순위
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)로 위치·벡터·시계열까지 커버한다.
이 글은 cloudbro.ai — 엔지니어라면 반드시 알아야 할 Redis 자료구조 10가지를 바탕으로 명령어 예시를 더해 정리한 것입니다.
