개발 기록

> [Redis] Redis 명령어 - ZSET (SortedSets) 본문

SQL&NoSQL

> [Redis] Redis 명령어 - ZSET (SortedSets)

1z 2024. 2. 6. 10:47

 

 

 

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/