[Redis] Sorted Set

반응형

이번 글에서는 redis의 data type 중 Sorted Set에 대해 알아보겠습니다.

1. Sorted Set

redis의 sorted set은 set과 hash가 mix된 타입입니다.

sorted set은 set과 마찬가지로 unique한 elements를 가집니다. 반대로 set과는 다르게 sorted set의 모든 elements는 순서를 가집니다.

모든 sorted set의 element는 'score'라고 부르는 floating point value를 가집니다. 때문에 모든 element가 value와 mapped되는 hash의 속성을 가집니다.

2. Command Line

SORTED SET TYPE에 사용할 수 있는 redis-cli 명령어 목록은 다음과 같습니다.

@ KEY에 SCORE1인 ELEMENT1과 SCORE2인 ELEMENT2를 넣는다.

ZADD [KEY] [SCORE1] [ELEMENT1] [SCORE2] [ELEMENT2]

@ KEY의 START_INDEX와 END_INDEX 사이의 ELEMENTS를 반환한다. WITHSCORE를 명시할 경우 ELEMENT의 SCORE도 함께 반환한다.

ZRANGE [KEY] [START_INDEX] [END_INDEX] [WITHSCORE]

@ KEY의 ELEMENT의 갯수를 반환한다.

ZCARD [KEY]

@ KEY에서 ELEMENT를 제거한다

ZREM [KEY] [ELEMENT]

@ KEY에서 ELEMENT의 SCORE값을 반환한다.

ZSCORE [KEY] [ELEMENT]

@ KEY에서 ELEMENT들을 SCORE의 역순으로 정렬하고, STRAT_INDEX와 END_INDEX사이의 ELEMENT들을 반환한다.

ZREVRAGNE [KEY] [START_INDEX] [END_INDEX]

@ KEY에서 ELEMENT의 SCORE 순위를 반환한다.

ZRANK [KEY] [ELEMENT]

@ KEY에서 ELEMENT의 SCORE 역순위를 반환한다.

ZREVRANK [KEY] [ELEMENT]

@ KEY에서 ELEMENT의 SCORE를 INCREASE_NUMBER만큼 증가시킨다.

ZINCRBY [KEY] [INCREASE_NUMBER] [ELEMENT]

@ KEY에서 MIN_SCORE와 MAX_SCORE 사이의 ELEMENT의 갯수를 반환한다.

ZCOUNT [KEY] [MIN_SCORE] [MAX_SCORE]

@ KEY에서 SCORE값이 가장 큰 ELEMENT를 제거한다.

ZPOPMAX [KEY]

@ KEY에서 SCORE값이 가장 작은 ELEMENT를 제거한다.

ZPOPMIN [KEY]

'(' 는 제외, '[' 는 포함한다는 것을 의미합니다. 😎

@ KEY에서 SCORE 값이 MIN_SCORE와 MAX_SCORE 사이의 값인 ELEMENT들을 반환한다.

ZRANGEBYSCORE [KEY] [(|[] [MIN_SCORE] [(|[] [MAX_SCORE]

@ KEY에서 ELEMENT의 NAME이 MIN_LETTER와 MAX_LETTER 사이의 값인 ELEMENT들을 반환한다.

ZRANGEBYLEX [KEY] [(|[] [MIN_LETTER] [(|[] [MAX_LETTER]

@ KEY에서 ELEMENT의 NAME이 MIN_LETTER와 MAX_LETTER 사이의 값인 ELEMENT들을 숫자를 반환한다.

ZLEXCOUNT [KEY] [(|[] [MIN_LEETER] [(|[] [MAX_LETTER]

@ KEY에서 ELEMENT들을 역순으로 정렬한뒤 ELEMENT의 NAME이 MIN_LETTER와 MAX_LETTER 사이의 값인 ELEMENT들을 숫자를 반환한다.

ZREVRANGEBYLEX [KEY] [(|[] [MIN_LETTER] [(|[] [MAX_LETTER]

@ KEY에서 ELEMENT들을 역순으로 정렬한뒤 ELEMENT의 NAME이 MIN_LETTER와 MAX_LETTER 사이의 값인 ELEMENT들을 제거한다.

ZREMRANGEBYLEX [KEY] [(|[] [MIN_LETTER] [(|[] [MAX_LETTER]

@ KEY에서 ELEMENT의 RANK가 MIN_RANK와 MAX_RANK 사이의 값인 ELEMENT들을 제거한다.

ZREMRANGEBYRANK [KEY] [(|[] [MIN_RANK] [(|[] [MAX_RANK]

@ KEY에서 ELEMENT의 SCORE가 MIN_SCORE와 MAX_SCORE 사이의 값인 ELEMENT들을 제거한다.

ZREMRANGEBYSCORE [KEY] [(|[] [MIN_SCORE] [(|[] [MAX_SCORE]

@ KEY에서 ELEMENT들을 역순으로 정렬한뒤 ELEMENT의 SCORE가 MIN_SCORE와 MAX_SCORE인 ELEMENT들을 제거한다.

ZREVRANGEBYSCORE [KEY] [(|[] [MIN_SCORE] [(|[] [MAX_SCORE]

3. Operation

set과는 다르게 sorted set은 각 element들의 score가 존재합니다.

따라서 intersetcion과 union을 구현하기위해선 score를 해결할 방법이 필요합니다. 동일한 element일지라도 각 set에서의 score가 다를 수 있기 때문입니다.

아래와 같이 2개의 sorted set에 'Hello'라는 동일한 element가 있을 경우 redis는 weightaggregation 변수를 사용해 두개의 element의 score를 하나로 통합합니다.

image.png

✔ WEIGHT : 각 element의 score에 multiply할 값 입니다.

✔ AGGREGATION : sorted set의 element의 score를 합치는 규칙입니다. SUM, MIN, MAX가 있습니다. SUM일 경우 각 element의 score를 하나로 합칩니다. MIN일 경우 score가 가장 작은 element의 score를 사용합니다. MAX일 경우 score가 가장 큰 element의 score를 사용합니다.

WEIGHT의 기본값은 1이며, AGGREAGATION의 기본값은 SUM입니다.

3-1) Intersection of Sorted Sets

image.png


@ DESTINATION SORTED SET에 KEY1과 KEY2에서 동일한 ELEMENT를 저장합니다.

ZINTERSTORE [DESTINATION] [KEY_COUNT] [KEY1] [KEY2] [WEIGHTS] [KEY1_WEIGHT] [KEY2_WEIGHT] [ARGGREATION SUM|MIN|MAX] 

위에서 KEY1의 각 ELEMENT들의 SCORE에는 KEY1_WEIGHT를 곱합니다. KEY2의 각 ELEMENT들의 SCORE에는 KEY2_WEIGHT를 곱합니다. 마지막으로 AGGREAGTION 규칙에따라 SCORE를 선택합니다.

3-2) Union of Sorted Sets

image.png


@ DESTINATION SORTED SET에 KEY1과 KEY2의 모든 ELEMENT를 저장합니다. 이때 중복된 ELEMENT는 한번만 저장합니다.

ZUNIONSTORE [DESTINATION] [KEY_COUNT] [KEY1] [KEY2] [WEIGHTS] [KEY1_WEIGHT] [KEY2_WEIGHT] [ARGGREATION SUM|MIN|MAX] 

위에서 KEY1의 각 ELEMENT들의 SCORE에는 KEY1_WEIGHT를 곱합니다. KEY2의 각 ELEMENT들의 SCORE에는 KEY2_WEIGHT를 곱합니다. 마지막으로 AGGREAGTION 규칙에따라 SCORE를 선택합니다.


참고 자료 : https://www.udemy.com/course/redis-bootcamp-for-beginners/


추천서적

 

Redis Essentials

COUPANG

www.coupang.com

파트너스 활동을 통해 일정액의 수수료를 제공받을 수 있음


반응형

'Redis' 카테고리의 다른 글

[Redis] Publish/Subscribe  (0) 2020.08.20
[Redis] Transaction  (0) 2020.08.20
[Redis] Set  (0) 2020.08.20
[Redis] Hash  (0) 2020.08.20
[Redis] List  (0) 2020.08.20

댓글

Designed by JB FACTORY