개발 기록
> [Redis] Redis 명령어 - ZSET (SortedSets) 본문

■
1. Zset (SortedSets)
순서가 보장되는 고유한 문자열들의 컬렉션으로 이 고유한 문자열 하나를 멤버(member)라고 부르며, 각 멤버에 연관된 점수(score)를 기준으로 멤버들이 정렬된다.

1. 특징
☞ score 는 부동 소수점 숫자 형식을 사용한다.
☞ 개별 멤버들이 중복되지 않고 고유하며 각 멤버들이 score와 1:1로 연관된다
☞ 각 멤버들의 점수를 기준으로 1차적으로 정렬되고, 점수가 같을 때에는 멤버에 따라 알파벳 순으로 정렬된다.
☞ 정렬된 상태이기에 빠르게 최소/최대값을 구할수있다.
2. 활용 사례
㉮ 순위 계산, 리더보드 구현등에 활용 : ex. 가장 높은 점수를 순서대로 나열한 목록 유지
㉯ 리율 제한 장치(Rate Limiter) : sorted set 을 사용한 sliding-window Rate limiter 구축으로 과도한 API 요청 방지
3. 규칙
☞ sorted set 요소는 순서대로 가져온다. 다음 규칙에 따라 순서가 지정된다.
㉮ B와 A가 점수가 다른 두 요소인 경우 A.score가 B.score보다 크면 A > B 이다.
㉯ B와 A의 점수가 정확히 같은 경우 A 문자열이 B 문자열보다 사전순으로 크면 A > B 이다. 정렬된 세트에는 고유한 요소만 있으므로 B 및 A 문자열은 동일할 수 없다.
☆★ 단순히 범용성이 높다는 이유만으로 Set 대신 ZSet을 쓰면 안 된다. 집합 연산의 경우 기본적으로 Set 명령어들이 ZSet 명령어들보다 효율적이므로, 멤버들이 정렬되어 관리되어야 할 이유가 없는 경우 Set을 사용하는 것이 더 권장된다.
■
2. Zset (SortedSets) 명령어
| 명령어 | 설명 | |
| ZADD | ZADD key [NX|XX] [GT|LT] [CH][INCR] score member [score member ...] |
해당 Key에 새 member 및 관련 score 추가 멤버가 이미 존재하는 경우 점수 업데이트 |
| ZSCAN | ZSCAN key cursor [MATCH pattern] [COUNT count] | sorted set member 와 socre 를 반복 |
| ZRANGE | ZRANGE key start stop [BYSCORE | BYLEX] [REV] [LIMIT offset count] [WITHSCORES] |
start과 stop 범위 내 sorted set의 member 반환 |
| ZSCORE | ZSCORE key member | 해당 member 의 score 반환 |
| ZRANK | ZRANK key member | 해당 Key에 저장된 sorted set 의 지정 member 의 순위 반환 오름차순, 순위는 0부터 시작한다. |
| ZREVRANGE | ZREVRANGE key start stop [WITHSCORES] | 요소가 내림차순으로 정렬된 것으로 간주하고 start과 stop사이의 요소를 반환한다. |
| ZCOUNT | ZCOUNT key min max | min max 사이의 점수를 가진 요소 수 반환 |
| ZREM | ZREM key member [member] | 해당 Key에 저장된 sorted set 의 지정 member 삭제 |
| ZCARD | ZCARD key | 해당 Key에 저장된 sorted set 요소 수 반환 |
| ZINCRBY | ZINCRBY key increment member | 멤버의 Score를 Increment 만큼 증가 |
(1) ZADD
: 멤버가 이미 존재하는 경우 점수 업데이트되고, 올바른 순서를 보장하기 위해 요소가 점수에 맞는 위치에 다시 삽입된다.
해당 Key가 보유한 sorted set이 없는 경우 오류 발생.
ZADD key [NX | XX] [GT | LT] [CH] [INCR] score member [score member...]
☆★ ZADD 옵션
- XX : 이미 존재하는 요소만 업데이트
- NX : 새로운 요소만 추가
- LT : 새 점수가 현재 점수 보다 작은 경우에만 기존 요소를 업데이트
- GT : 새 점수가 현재 점수 보다 큰 경우에만 기존 요소 업데이트
- CH : 추가된 새 요소 수에서 변경된 총 요소 수로 반환 값을 수정
- INCR : ZINCRBY. 이 모드에서는 하나의 점수-요소 쌍만 지정할 수 있다.
redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 1 "uno"
(integer) 1
redis> ZADD myzset 2 "two" 3 "three"
(integer) 2
// 0 부터 마지막 요소 범위내에 요소를 점수와 함께 출력
redis> ZRANGE myzset 0 -1 WITHSCORES
1) "one"
2) "1"
3) "uno"
4) "1"
5) "two"
6) "2"
7) "three"
8) "3"
(2) ZSCORE
: member 의 score 조회
return type : a double-precision floating point number
key 가 존재하지 않거나 sorted set 에 member 가 존재하지 않는 경우 nil 반환
redis> ZADD myzset 1 "one"
(integer) 1
redis> ZSCORE myzset "one"
"1"
(3) ZRANGE
: 범위 내의 요소 조회 (ex. 최상위 랭커 3명 조회)
: 요소의 순서는 오름 차순이다. 동일 점수는 사전순으로 2차 정렬
ZRANGE key start stop [BYSCORE | BYLEX] [REV] [LIMIT offset count] [WITHSCORES]
☆★ ZRANGE 옵션
- REV: 내림차순, 동점은 역 사전식
- LIMIT offset count: (=SQL SELECT LIMIT offset count )
- strart stop : 포함 범위, 음수는 sorted set 의 끝 offset 을 나타냄 (-1 : 마지막 요소, -2 : 끝에서 두 번째 요소)
ex. ZRANGE myzset 0 1 : 첫 번째 요소와 두 번째 요소 반환
- BYSCORE | BYLEX
1.WITHSCORES : score 와 함께 첫 번째 요소 부터 마지막 요소 까지 반환

2. BYSCORE : score 가 100보다 크고 120보다 작은 요소 반환

3. <start><stop> : 점수 앞에 '(' 문자 를 붙여서 범위 제외를 지정할 수 있다.
3-1. 1 < score <= 5 범위의 모든 요소 반환

3-2. 5 < score < 10 범위의 모든 요소 반환

(4) ZRANK / ZREVRANK
: member 의 순위 반환
: 오름차순 정렬이며 순위는 0부터 시작한다. (즉 점수가 가장 낮은 멤버의 순위는 0 이다.)
: key 가 존재하지 않거나, sorted set에 member 가 존재하지 않는 경우 Nil 반환
☆★ ZREVRANK 를 사용하면 내림차순 기준 순위를 얻을 수 있다.
ZRANK key member [WITHSCORE]
1. WITHSCORE 옵션 미사용시 member 순위 반환

2. WITHSCORE 옵션 사용시 member의 순위와 점수 반환
redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 2 "two"
(integer) 1
redis> ZADD myzset 3 "three"
(integer) 1
redis> ZRANK myzset "three"
(integer) 2
redis> ZRANK myzset "four"
(nil)
redis> ZRANK myzset "three" WITHSCORE
1) (integer) 2
2) "3"
(5) ZREM
: zset 내의 특정 member 제거
return type : 제거된 요소 개수 반환
해당 key 에 sorted set 이 존재하지 않는 경우 에러 발생
redis> ZADD myzset 1 "one"
(integer) 1
redis> ZREM myzset "one"
(integer) 1
(5) ZCARD
: 해당 키에 저장된 Sorted Set 의 모든 member 개수 반환
redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 2 "two"
(integer) 1
redis> ZCARD myzset
(integer) 2
(6) ZCOUNT
: min과 max 사이 score의 개수를 반환.
redis> ZCOUNT myzset -inf +inf
(integer) 3
redis> ZCOUNT myzset (1 3
(integer) 2
(7) ZINCRBY
: member의 score를 증가, 음수는 score 감소
return type : member 의 새 점수
* 해당 key sorted set 에 지정 member 가 존재 하지 않는 경우, 이전 점수를 0.0 으로 가정하고 증가한다.
* 해당 key 가 존재하지 않는 경우, 지정 member 를 가진 sorted set 을 생성한다.
* 해당 key 에 sorted set 이 존재하지 않는 경우 에러 발생
ZINCRBY key increment member
redis> ZADD myzset 1 "one"
(integer) 1
redis> ZINCRBY myzset 2 "one"
"3"
출처
https://redis.io/docs/data-types/sorted-sets/
'SQL&NoSQL' 카테고리의 다른 글
| >[MySQL] DB 인덱스의 구조와 적용 (0) | 2024.02.23 |
|---|---|
| > [Redis] Redis 구현 방법 차이 - RedisTemplate, RedisRepository, @Cacheable (0) | 2024.02.04 |
| > [Redis] Spring Data Redis 자료구조 - RedisTemplate 사용 방법 (0) | 2024.02.03 |
| >[Redis] Spring Boot 3 Redis Sentinel 환경 구성 및 구현 - 2. Spring Redis Sentinel config (0) | 2024.01.09 |
| > [Redis] Ubuntu - Redis 설치 (0) | 2024.01.09 |