본문 바로가기
SQL/Redis

Redis Sorted Set 타입 특징 및 자주 쓰는 명령어 알아보기

by 흑시바 2024. 4. 14.

Sorted Set

Sorted Set은 유니크한 멤버들을 가지는 컬렉션으로, 각 멤버는 부동 소수점 숫자인 스코어(score)와 연결되어 있다. 이 스코어를 기반으로 멤버들이 자동으로 정렬된다. Sorted Set은 리더보드, 우선순위 큐 등 다양한 곳에 활용될 수 있다.

 

Sorted Set은 다음과 같은 특징을 갖는다.

- 고유한 값 저장

각 멤버는 Sorted Set 내에서 유일한 값을 갖는다.

- 자동 정렬

멤버들은 스코어에 따라 자동으로 정렬된다. 스코어가 낮은 멤버부터 높은 멤버 순으로 정렬된다. 같은 스코어를 가진 멤버는 데이터의 사전 순으로 정렬돼 저장된다.

- 빠른 접근 시간

멤버 추가, 삭제, 스코어 업데이트, 랭크 조회 등의 작업은 O(log(N)) 시간에 처리된다. (N은 Sorted Set의 멤버 수)

따라서, 인덱스를 다루는 경우 O(n)으로 접근하는 list 보다 sorted set이 더 효율 적이다.

- 범위 기반 조회

스코어 범위나 랭크 범위에 따라 멤버들을 조회할 수 있다.

명령어 (Command)

ZADD

설명: Sorted Set에 멤버를 추가한다. 한 번에 여러 아이템을 입력할 수 있고, 각 아이템은 저장되는 동시에 스코어 값으로 정렬된다.

 

사용 예제:

> ZADD shibaholic 100 white
(integer) 1
> ZADD shibaholic 200 black 300 red
(integer) 2

 

저장하는 데이터가 이미 sorted set에 존재하면 스코어만 업데이트된다.

 

ZADD는 다음과 같은 옵션을 사용할 수 있다.

 

  • NX: 멤버가 이미 존재하지 않을 경우에만 추가한다. 즉, 새로운 멤버만 추가하고, 기존 멤버의 스코어는 업데이트하지 않는다.
  • XX: 멤버가 이미 존재할 경우에만 스코어를 업데이트한다. 즉, 새로운 멤버는 추가하지 않는다.
  • CH: 변경된 멤버의 수를 반환한다. 기본적으로 ZADD는 추가된 새로운 멤버의 수만 반환하지만, CH 옵션을 사용하면 스코어가 업데이트된 멤버의 수도 포함하여 반환한다.
  • INCR: 스코어를 증가시키는 데 사용된다. 이 옵션을 사용하면 ZADD는 Sorted Set에 단일 멤버와 스코어만을 받아 해당 멤버의 스코어를 증가시키고, 최종 스코어를 반환한다. 이 옵션을 사용할 때는 한 번에 하나의 멤버만 업데이트할 수 있다.
  • LT: 새로운 스코어가 기존 스코어보다 작은 경우에만 기존 요소를 업데이트한다.
  • GT: 새로운 스코어가 현재 스코어보다 큰 경우에만 기존 요소를 업데이트한다.

ZRANGE

설명:

스코어가 낮은 순으로 정렬된 상태에서, 지정된 범위의 멤버들을 조회한다.

 

사용 예제:

> ZRANGE shibaholic 0 1
1) "white"
2) "black"
> ZRANGE shibaholic 0 1 WITHSCORES
1) "white"
2) "100"
3) "black"
4) "200"
> ZRANGE shibaholic 0 1 WITHSCORES REV
1) "red"
2) "300"
3) "black"
4) "200"
> ZRANGE shibaholic 150 250 BYSCORE WITHSCORES
1) "black"
2) "200"
> ZRANGE shibaholic 100 300 BYSCORE WITHSCORES
1) "white"
2) "100"
3) "black"
4) "200"
5) "red"
6) "300"
> ZRANGE shibaholic (100 (300 BYSCORE WITHSCORES
1) "black"
2) "200"
> ZRANGE shibaholic 100 +inf BYSCORE WITHSCORES
1) "white"
2) "100"
3) "black"
4) "200"
5) "red"
6) "300"
> ZRANGE shibaholic -inf 300 BYSCORE WITHSCORES
1) "white"
2) "100"
3) "black"
4) "200"
5) "red"
6) "300"

> ZADD shibaholic 0 white 0 black 0 red 0 orange 0 blue
(integer) 2
> ZRANGE shibaholic (b (w BYLEX
1) "black"
2) "blue"
3) "orange"
4) "red"

 

예제에서 나오는 0 1은 검색하고자 하는 첫 번째와 마지막 인덱스를 의미한다.

음수 인덱스 사용이 가능하며, 0 -1을 입력하는 경우 sorted set에 저장된 모든 데이터를 조회한다는 의미이다.

 

ZRANGE는 다음과 같은 옵션을 사용할 수 있다.

 

  • WITHSCORES: 데이터와 함께 스코어 값이 차례대로 출력된다.
  • REV: 데이터가 역순으로 출력된다.
  • BYSCORE: 스코어를 이용해 데이터를 조회할 수 있다. 인자 값으로 조회하고자 하는 최소, 최대 스코어를 전달하면 전달한 스코어를 포함한 값을 조회한다. 인수로 전달하는 스코어에 '(' 문자를 추가하면 해당 스코어를 포함하지 않는 값만 조회할 수 있다.
  • -inf, +inf: 최솟값과 최댓값을 표현한다. 특정 스코어보다 작거나 큰 모든 값을 출력할 때 이용한다.
  • BYLEX: 사전 순으로 범위를 조회한다. 스코어가 같을 때 BYLEX 옵션을 사용하면 사전식 순서를 이용해 특정 아이템을 조회할 수 있다. 입력한 문자열을 포함하려면 '(' 문자를, 포함하지 않을 때는 '[' 문자를 사용한다. 

ZREVRANGE

설명: 스코어가 높은 순으로 정렬된 상태에서, 지정된 범위의 멤버들을 조회한다.

 

사용 예제:

> ZREVRANGE shibaholic 0 1
1) "red"
2) "black"
> ZREVRANGE shibaholic 0 1 WITHSCORES
1) "red"
2) "300"
3) "black"
4) "200"

ZREM

설명: 멤버를 삭제한다.

 

사용 예제:

> ZREM shibaholic black
(integer) 1

ZSCORE

설명: 지정된 멤버의 스코어를 조회한다.

 

사용 예제:

> ZSCORE shibaholic red
"300"

ZRANK / ZREVRANK

설명: 멤버의 랭크(위치)를 조회한다. ZRANK는 낮은 스코어부터, ZREVRANK는 높은 스코어부터 계산한다.

 

사용 예제:

> ZRANK shibaholic 'white'
(integer) 0
> ZRANK shibaholic 'black'
(integer) 1
> ZRANK shibaholic 'red'
(integer) 2

> ZREVRANK shibaholic 'white'
(integer) 2
> ZREVRANK shibaholic 'black'
(integer) 1
> ZREVRANK shibaholic 'red'
(integer) 0

ZINCRBY

설명:

 지정된 값으로 멤버의 스코어를 증가시킨다.

 

사용 예제:

> ZINCRBY shibaholic 100 red
"400"

ZRANGEBYSCORE / ZREVRANGEBYSCORE

설명: 스코어 범위에 해당하는 멤버들을 조회한다. ZRANGEBYSCORE는 낮은 스코어부터, ZREVRANGEBYSCORE는 높은 스코어부터 조회한다.

 

사용 예제:

> ZRANGEBYSCORE shibaholic 100 200
1) "white"
2) "black"
> ZREVRANGEBYSCORE shibaholic 200 100
1) "black"
2) "white"

REFERENCE

https://redis.io/docs/latest/develop/data-types/sorted-sets/

https://redis.io/docs/latest/commands/?group=sorted-set

 

댓글