티스토리 뷰
Sorted Set이란?
Sorted Set은 Redis 자료구조 중 하나로 하나의 키에 여러 score와 member로 구성된 데이터를 관리한다. 각 member에 실수값인 score를 부여하며 score를 기준으로 정렬된 상태를 유지하는 집합이다. member는 고유값이며 서로 다른 member는 동일한 score를 가질 수 있다. score가 동일한 경우 member의 사전순(lexicographical order)으로 정렬된다.
문법 표기법
아래 문법 설명 중 옵션 표기에 대한 설명이다.
[]로 감싼 항목은 선택적(optional) 옵션이며 생략 가능하다.|는 둘 중 하나만 선택 가능함을 의미한다.
학생 성적 예시
| key | score | member |
|---|---|---|
| exam_results | 72 | charlie |
| exam_results | 85 | bob |
| exam_results | 85 | dave |
| exam_results | 93 | alice |
ZADD
의미: 멤버를 추가하거나 score를 갱신한다. 반환 값은 새로 추가된 멤버 수
문법: ZADD key [NX|XX] [GT|LT] [CH] score member
- 옵션은 key 뒤 score 앞에 지정 가능 (
|기준 하나의 옵션만 지정 가능) NX(Not eXists) — 멤버가 존재하지 않을 때만 추가XX(eXists) — 멤버가 이미 존재할 때만 갱신GT(Greater Than) — 새 score가 기존보다 클 때만 갱신 (member가 존재하지 않은 경우 새로 추가)LT(Less Than) — 새 score가 기존보다 작을 때만 갱신 (member가 존재하지 않은 경우 새로 추가)CH(Changed) — 반환 값을 새로 추가된 멤버 수 + score가 바뀐 멤버 수로 변경
예시:
ZADD exam_results 85 "bob"
ZADD exam_results NX 85 "bob"
ZADD exam_results XX GT 90 "bob"
ZADD exam_results XX GT CH 90 "bob"
ZINCRBY
의미: 멤버의 score를 지정한 값만큼 증가시킨다. 멤버가 없으면 해당 score로 새로 추가한다.
문법: ZINCRBY key increment member
예시:
ZADD exam_results 85 "bob"
# score 증가
ZINCRBY exam_results 10 "bob"
# 85 + 10 = 95
# 음수로 감소도 가능
ZINCRBY exam_results -20 "bob"
# 95 - 20 = 75
# 존재하지 않는 멤버 → score 0에서 시작하여 increment 적용
ZINCRBY exam_results 88 "alice"
# 0 + 88 (새로 추가)
ZSCORE
의미: 멤버의 score를 반환한다.
문법: ZSCORE key member
예시:
ZADD exam_results 85 "bob" 93 "alice"
ZSCORE exam_results "bob"
# "85"
# 존재하지 않는 멤버
ZSCORE exam_results "unknown"
# (nil)
ZCARD
의미: Sorted Set의 전체 멤버 수를 반환한다. (CARD = Cardinality, 집합의 원소 수)
문법: ZCARD key
예시:
ZADD exam_results 85 "bob" 93 "alice" 72 "charlie"
ZCARD exam_results
# (integer) 3
ZRANK
의미: score 오름차순 기준 멤버의 순위를 반환한다. 0부터 반환한다. 멤버가 존재하지 않으면 (nil)을 반환한다.
문법: ZRANK key member
예시:
ZADD exam_results 72 "charlie" 85 "bob" 93 "alice"
# charlie가 score 최저 → 오름차순 0등
ZRANK exam_results "charlie"
# (integer) 0
ZRANK exam_results "bob"
# (integer) 1
ZRANK exam_results "alice"
# (integer) 2
# 존재하지 않는 멤버
ZRANK exam_results "unknown"
# (nil)
ZREVRANK
의미: score 내림차순 기준 멤버의 순위를 반환한다. (REV = Reverse) 0부터 반환한다.
문법: ZREVRANK key member
예시:
ZADD exam_results 72 "charlie" 85 "bob" 93 "alice"
# alice가 score 최고 → 내림차순 0등
ZREVRANK exam_results "alice"
# (integer) 0
ZREVRANK exam_results "bob"
# (integer) 1
ZREVRANK exam_results "charlie"
# (integer) 2
ZRANGE
의미: score 오름차순으로 인덱스 범위의 멤버를 조회한다. stop이 -1이면 끝까지 조회. Redis 6.2부터 BYSCORE, BYLEX, REV, LIMIT 옵션이 추가되어 ZREVRANGE, ZRANGEBYSCORE, ZREVRANGEBYSCORE 등을 대체하는 통합 명령어가 되었다.
문법: ZRANGE key min max [BYSCORE | BYLEX] [REV] [LIMIT offset count] [WITHSCORES]
BYSCORE— min, max를 score 범위로 해석.+inf,-inf로 무한대 지정 가능.(를 접두어로 붙이면 해당 값 미포함(exclusive)BYLEX— min, max를 사전순 범위로 해석.[는 포함,(는 미포함,+,-는 최대/최소REV— 내림차순 정렬 (ZREVRANGE대체)LIMIT offset count—BYSCORE또는BYLEX와 함께 사용. offset만큼 건너뛴 후 count개 반환WITHSCORES— 멤버와 함께 score도 반환
예시:
ZADD exam_results 72 "charlie" 85 "bob" 85 "dave" 93 "alice"
# 기본: 오름차순 전체 조회
ZRANGE exam_results 0 -1 WITHSCORES
# 1) "charlie" 2) "72"
# 3) "bob" 4) "85"
# 5) "dave" 6) "85"
# 7) "alice" 8) "93"
# 내림차순 전체 조회 (ZREVRANGE 대체)
ZRANGE exam_results 0 -1 REV WITHSCORES
# 1) "alice" 2) "93"
# 3) "dave" 4) "85"
# 5) "bob" 6) "85"
# 7) "charlie" 8) "72"
# score 범위 조회 (80~95점)
ZRANGE exam_results 80 95 BYSCORE WITHSCORES
# 1) "bob" 2) "85"
# 3) "dave" 4) "85"
# 5) "alice" 6) "93"
# score 범위 + exclusive (80 초과 ~ 95 미만)
ZRANGE exam_results (80 (95 BYSCORE WITHSCORES
# 1) "bob" 2) "85"
# 3) "dave" 4) "85"
# score 범위 + LIMIT (상위 2명)
ZRANGE exam_results -inf +inf BYSCORE LIMIT 0 2
# 1) "charlie"
# 2) "bob"
# 사전순 범위 조회 (score가 동일한 멤버 중 필터링)
ZRANGE exam_results [b [d BYLEX
# 1) "bob"
# 2) "charlie"
ZREVRANGE
의미: score 내림차순으로 인덱스 범위의 멤버를 조회한다. stop이 -1이면 끝까지 조회. Redis 6.2부터 deprecated되었으며 ZRANGE에 REV 옵션으로 대체 가능하다.
문법: ZREVRANGE key start stop [WITHSCORES]
예시:
ZADD exam_results 72 "charlie" 85 "bob" 93 "alice"
# 전체 조회 (내림차순)
ZREVRANGE exam_results 0 -1 WITHSCORES
# 1) "alice"
# 2) "93"
# 3) "bob"
# 4) "85"
# 5) "charlie"
# 6) "72"
# 상위 2명만
ZREVRANGE exam_results 0 1
# 1) "alice"
# 2) "bob"
# ZRANGE REV로 대체
ZRANGE exam_results 0 -1 REV WITHSCORES
ZREM
의미: 지정된 멤버를 삭제한다. (REM = Remove) 실제로 삭제된 멤버 수가 반환된다.
문법: ZREM key member [member ...]
예시:
ZADD exam_results 72 "charlie" 85 "bob" 93 "alice"
# 단일 삭제
ZREM exam_results "charlie"
# (integer) 1
# 여러 멤버 삭제
ZREM exam_results "bob" "alice"
# (integer) 2
# 존재하지 않는 멤버 삭제 시도
ZREM exam_results "unknown"
# (integer) 0'데이터베이스' 카테고리의 다른 글
| 대기열, 시스템을 보호하라 (2) (0) | 2026.04.12 |
|---|---|
| 대기열, 시스템을 보호하라 (1) (0) | 2026.04.12 |
| 일간 랭킹 시스템을 만들면서 마주친 것들 (0) | 2026.04.10 |
| 캐싱, 간단할 줄 알았다. 그런데... (0) | 2026.03.29 |
| 서브쿼리 이해하기: 인라인뷰, 스칼라 서브쿼리, 상관·비상관 쿼리 (1) | 2025.12.01 |
