본문 바로가기

개발자를 위한 레디스

[개발자를 위한 레디스] sorted Set

 

1) Sorted Set이란?

 

- 레디스에서 sorted set은 스코어(score)값에 따라 정렬되는 고유한 문자열의 집합이다.

  모든 아이템은 스코어-값 쌍을 가지며, 저장될 때부터 스코어 값으로 정렬돼 저장된다. 

  같은 스코어를 가진 아이템은 데이터의 사전 순으로 정렬돼 저장된다. 

 

- 데이터는 중복 없이 유일하게 저장되므로 set과 유사하다고 볼 수 있으며,

  각 아이템은 스코어라는 데이터에 연결돼 있어 이 점에서 hash와 유사하다고 생각할 수 있다.

  또한 모든 아이템은 스코어 순으로 정렬돼 있어,

  list처럼 인덱스를 이용해 각 아이템에 접근할 수 있다. 

 

- ZADD 커맨드를 사용하면 sorted set에 아이템을 저장할 수 있으며,

  스코어-값 쌍으로 입력해야 한다. 

  한 번에 여러 아이템을 입력할 수 있으며,

  각 아이템은 sorted set에 저장되는 동시에 스코어 값으로 정렬된다. 

 

> ZADD score:220817 100 user:B
(integer) 1

> ZADD score:220817 150 user:A 150 user:C 200 user:F 300 user:E
(integer) 4

 

- 만약 저장하고자 하는 데이터가 이미 sorted set에 속해 있다면

  스코어만 업데이트 되며, 업데이트된 스코어에 의해 아이템이 재정렬된다. 

 

- 지정한 키가 존재하지 않을 때에는 sorted set 자료 구조를 새로 생성하며,

  키가 이미 존재하지만 sorted set이 아닐 경우에는 오류를 반환한다. 

  스코어는 배정밀도 부동소수점 숫자를 문자열로 표현한 값이어야 한다. 

 

- ZRANGE 커맨드를 사용하면 sorted set에 저장된 데이터를 조회할 수 있으며,

  start와 stop이라는 범위를 항상 입력해야 한다.

ZRANGE key start stop [BYSCORE | BYLEX] [REV] [LIMIT offset count]
[WITHSCORES]

 

- 이 때, 여러 가지 옵션을 이용해 다양한 조건으로 데이터를 검색할 수 있다.

  

 

2) 다양한 조건으로 sorted set에서 검색하기

 

(1) 인덱스로 데이터 조회

 

- ZRANGE 커맨드는 기본적으로 인덱스를  기반으로 데이터를 조회하기 때문에

  start와 stop 인자에는 검색하고자 하는 첫 번째와 마지막 인덱스를 전달한다. 

 

- WITHSCORE 옵션을 사용하면 데이터와 함께 스코어 값이 차례대로 출력되며,

  REV 옵션을 사용하면 데이터는 역순으로 출력된다. 

 

> ZRANGE score:220817 1 3 WITHSCORES
1) "user:A"
2) "150"
3) "user:C"
4) "150"
5) "user:F"
6) "200"

> ZRANGE score:220817 1 3 WITHSCORES REV
1) "user:F"
2) "200"
3) "user:C"
4) "150"
5) "user:A"
6) "150"

 

- list에서와 마찬가지로 음수 인덱스를 사용할 수 있으며,

  ZRANGE <key> 0 -1 커맨드는 sorted set에 저장된 모든 데이터를 조회하겠다는 것을 의미한다. 

 

 

(2) 스코어로 데이터 조회

- ZRANGE 커맨드에 BYSCORE 옵션을 사용하면 스코어를 이용해 데이터를 조회할 수 있다.

  start, stop 인자 값으로는 조회하고자 하는 최소, 최대 스코어를 전달해야 하며,

  전달한 스코어를 포함한 갑슬 조회한다.

 

- 즉 다음 예제와 같이 100, 150을 start, stop 값으로 전달했을 경우에는

  스코어가 100 이상 150 이하인 값을 조회하라는 것을 의미한다.

> ZRANGE score:220817 100 150 BYSCORE WITHSCORES
1) "user:B"
2) "100"
3) "user:A"
4) "150"
5) "user:C"
6) "150"

 

 

(3) 사전 순으로 데이터 조회

- 앞서 sorted set에 데이터를 저장할 때 스코어가 같으면 데이터는 사전 순으로 정렬된다고 설명했다.

  이러한 특성을 이용해 스코어가 같을 때, BYLEX 옵션을 사용하면

  사전식 순서를 이용해 특정 아이템을 조회할 수 있다. 

> ZRANGE mySortedSet (b (f BYLEX
banana
candy
dream
egg

 

- Start와 stop에는 사전 순으로 비교하기 위한 문자열을 전달해야 하며,

  이 때 반드시 (나 [ 문자를 함께 입력해야 한다.

  입력한 문자열을 포함하려면 (을, 포함하지 않을 때에는 [ 문자를 사용한다.

 

- 사전식 문자열의 가장 처음은 - 문자로, 가장 마지막은 + 문자로 대체할 수 있기 때문에

  ZRANGE <key> - + BYLEX 커맨드는 sorted set에 저장된 모든 데이터를 조회하겠다는 것을 의미한다.