Redis

Redis - Sorted Sets

개발 일기92 2024. 6. 16. 16:27

소개

Sorted Sets는 key 하나에 여러개의 score와 value로 구성.
Value는 score로 sort되며 중복되지 않는다.
score가 같으면 value로 sort.
Sorted Sets에서는 집합이라는 의미에서 value를 member라 부른다.
Sorted Sets은 주로 sort가 필요한 곳에 사용.

1. ZADD key score(숫자) member : sadd에서 score가 추가된 형태로 insert.

명령>	zadd myzip 60 "경기"
결과>	1
명령>	zadd myzip 20 "서울"
결과>	1
명령>	zadd myzip 40 "부산"
결과>	1
명령>	zrange myzip 0 -1   score 순서로 표시된다
결과>	1) 서울
2) 부산
3) 경기
명령>	zrange myzip 0 -1 withscores   withscores 옵션을 사용하면 score가 표시된다
결과>	1) 20 -> 서울
2) 40 -> 부산
3) 60 -> 경기

 

score member를 여러개 입력하면?

명령>	zadd myzip 100 "충청"80 "전라"
결과>	2
명령>	zrange myzip 0 -1 withscores
결과>	1) 20 -> 서울
2) 40 -> 부산
3) 60 -> 경기
4) 80 -> 전라
5) 100 -> 충청

 

score가 같으면 member로 sort.

명령>	del myzip
결과>	1
명령>	zadd myzip  10 "충청"  10 "전라"  10 "서울"  10 "경기"  10 "부산"
결과>	5
명령>	zrange myzip 0 -1 withscores
결과>	1) 10 -> 경기
2) 10 -> 부산
3) 10 -> 서울
4) 10 -> 전라
5) 10 -> 충청

 

member의 중복허용x 

but! score는 update된다. 0을 반환하기 때문에 아무일도 일어나지 않은 것으로

오해할 수 있다. 

명령>	zadd myzip  1 "서울"
결과>	0   0을 리턴한다
명령>	zrange myzip 0 -1 withscores
결과>	1) 1 -> 서울   score가 1로 update 되었다
2) 10 -> 경기
3) 10 -> 부산
4) 10 -> 전라
5) 10 -> 충청

버전 3.0.2에서 추가된 옵션

  • NX: 멤버가 이미 있으면 업데이트하지 않고 없을 경우에만 추가한다.
  • XX: 이미 존재하는 멤버에 스코어를 업데이트한다.
  • CH: 스코어를 업데이트한 경우에만 업데이트한 멤버수를 리턴한다. 스코어가 같으면 0을 리턴하고, 다르면 업데이트하고 1을 리턴한다. 리턴 값에만 영향을 미치는 옵션이다.
  • INCR: 스코어를 주어진 값만큼 증가시킨다.

버전 6.2.0에서 추가된 옵션

  • LT: 새 스코어가 현재 스코어 보다 적은 경우에만 기존 요소를 업데이트 합니다.
  • GT: 새 스코어가 현재 스코어 보다 큰 경우에만 기존 요소를 업데이트 합니다.

 

ZADD key [NX|XX] [GT|LT] [CH] [INCR] score member [score member ...]   [ex seconds]

  • 이 명령은 version 1.2.0 부터 사용할 수 있습니다.
  • 논리적 처리 소요시간은 O(log(N))이다. N은 집합의 member 개수입니다.
  • version 2.4 이후 부터 member를 여러 개 입력할 수 있습니다.
  • add된 member 개수를 리턴합니다.
  • 서브쿼리와 멤버 자동 삭제 기능은 Enterprise 서버에서 사용할 수 있습니다.

2. ZINCRBY key increment(정수,음수,실수) member : 해당 mem의 score를 증감한다.

명령>	zadd mysite  1000 google.com 900 facebook.com 800 youtube.com
결과>	3
명령>	zrevrange mysite 0 -1 withscores
결과>	0) 1000 -> google.com
1) 900 -> facebook.com
2) 800 -> youtube.com
명령>	zincrby mysite 150 youtube.com    youtube.com을 150 증가
결과>	950
명령>	zrevrange mysite 0 -1 withscores
결과>	0) 1000 -> google.com
1) 950 -> youtube.com   950으로 증가해서 순위가 바뀌었다
2) 900 -> facebook.com
명령>	zincrby mysite -60 google.com   감소
결과>	940
명령>	zrevrange mysite 0 -1 withscores
결과>	0) 950 -> youtube.com
1) 940 -> google.com
2) 900 -> facebook.com

 

기존 key나 mem이 없을 경우 생성하고 insert된다.

이때 score의 기준은 0.0이다.

명령>	zincrby daily_views  1 20160401    key와 member를 생성해서 저장
결과>	1
명령>	zincrby daily_views  1 20160401
결과>	2
명령>	zincrby daily_views  1 20160401
결과>	3
명령>	zincrby daily_views  1 20160402    key는 만들어 졌으므로 member만 생성해서 저장
결과>	1
명령>	zincrby daily_views  1 20160402
결과>	2
명령>	zrevrange daily_views 0 -1 withscores
결과>	0) 2 -> 20150402
1) 3 -> 20150401

3. ZRANGE key start stop :member list를 score가 적은순으로 sort하여 조회.

명령>	zadd myzip 2 "서울" 3 "부산" 5 "대구" 4 "인천" 6 "광주" 1 "경기"
결과>	6
명령>	zrange myzip 0 -1   score로 sort되어 보여진다
결과>	0) 경기
1) 서울
2) 부산
3) 인천
4) 대구
5) 광주
명령>	zrange myzip 0 -1 withscores   withscores 옵션을 사용하면 score가 표시된다
결과>	0) 1 -> 경기
1) 2 -> 서울
2) 3 -> 부산
3) 4 -> 인천
4) 5 -> 대구
5) 6 -> 광주

4. ZRANGESTORE dest_key source_key start stop : 소스키의 값을 조회하여 목적키에 insert.

6.2버전 부터 사용가능.

명령>	zadd mycity 10 Seoul 20 Busan 30 Daegu 40 Incheon 50 Gwangju 60 Gyeonggi
결과>	6
명령>	zrangestore mycity2 mycity 0 -1
결과>	1) "Seoul"
2) "Busan"
3) "Daegu"
4) "Incheon"
5) "Gwangju"
6) "Gyeonggi"
명령>	zrange mycity2 0 -1
결과>	1) "Seoul"
2) "Busan"
3) "Daegu"
4) "Incheon"
5) "Gwangju"
6) "Gyeonggi"

 

ZRANGESTORE dst src min max [ BYSCORE | BYLEX] [REV] [LIMIT offset count]


5. ZREVRANGE key start stop : mem의 list에서 큰 값부터 조회.

명령>	zadd myzip 9926 "서울" 3426 "부산" 2465 "대구" 2826 "인천" 1514 "광주" 12137 "경기"
결과>	6
명령>	zrevrange myzip 0 -1 withscores   score가 큰 순서로 보여진다
결과>	0) 12137 -> 경기
1) 9926 -> 서울
2) 3426 -> 부산
3) 2826 -> 인천
4) 2465 -> 대구
5) 1514 -> 광주

6. ZRANGEBYSCORE key min max : score로 범위 지정하여 조회.

전부 조회시 -inf, +inf 옵션 사용.

withscores 옵션 사용 가능.

명령>	zadd mycom  2009 "Sun microsystems" 1992 Wang 2002 Netscape
결과>	3
명령>	zadd mycom  1998 "Digital Equipment" 2002 K-mart 1987 "American motors"
결과>	3
명령>	zrangebyscore mycom -inf +inf withscores
결과>	0) 1987 -> American motors
1) 1992 -> Wang
2) 1998 -> Digital Equipment
3) 2002 -> K-mart   score가 같을 경우 member로 비교한다
4) 2002 -> Netscape
5) 2009 -> Sun microsystems
명령>	zrangebyscore mycom 1998 2002 withscores
결과>	0) 1998 -> Digital Equipment
1) 2002 -> K-mart
2) 2002 -> Netscape
명령>	zrangebyscore mycom 2005 +inf withscores
결과>	0) 2009 -> Sun microsystems

 

범위 '초과', '미만'  명령어.

사용법은 zrangebyscore key (min (max 

   1987 < score < 2002
명령>	zrangebyscore mycom (1987 (2002 withscores
결과>	0) 1992 -> Wang
1) 1998 -> Digital Equipment
명령>	zrangebyscore mycom (1998 2002 withscores    1998 < score <= 2002
결과>	0) 2002 -> K-mart
1) 2002 -> Netscape

 

limit offset count 옵션

-> zrangebyscore key min max limit offset count

offset은 시작점을 의미, count는 조회할 mem의 개수.

count가 0이면 조회되지 않음.

명령>	zrangebyscore mycom -inf +inf withscores limit 0 3
결과>	0) 1987 -> American motors
1) 1992 -> Wang
2) 1998 -> Digital Equipment
명령>	zrangebyscore mycom -inf +inf withscores limit 3 100
결과>	0) 2002 -> K-mart
1) 2002 -> Netscape
2) 2009 -> Sun microsystems

ZRANGEBYSCORE key min max [withscores] [limit offset count]


7. ZRANGEBYLEX key min max : mem으로 범위 지정하여 조회.

    ZREVRANGEBYLEX key min max :  mem으로 범위 지정하여 역순 조회.

ZRANGEBYLEX key - + : 전부 조회

min,max에 값을 줄 경우 반드시 [ or (를 사용하여야 한다.

[포함할때 사용하고, (제외할 때 사용한다.

withscores 옵션 사용 불가.

명령>	zrangebylex city - +
결과>	0) Beijing
1) New Delhi
2) New York
3) Seoul
명령>	zrangebylex city "[New Delhi" +
결과>	0) New Delhi
1) New York
2) Seoul
명령>	zrangebylex city "(New Delhi" +
결과>	0) New York
1) Seoul
명령>	zrangebylex city "(New Delhi" "(Seoul"
결과>	0) New York

 

limit offset count 옵션

명령>	zrangebylex city - + limit 0 2
결과>	0) Beijing
1) New Delhi
명령>	zrangebylex city - + limit 2 2
결과>	0) New York
1) Seoul

ZRANGEBYLEX key min max [limit offset count]


8. ZCARD key : 키에 속한 멤버 수 반환.

ZLEN key 로 사용해도 됨.

명령>	zadd myzip  9926 "서울" 3426 "부산" 2465 "대구" 2826 "인천" 1514 "광주" 12137 "경기"
결과>	6
명령>	zadd myzip  1500 "강원" 2060 "충남" 2641 "경북" 570 "제주"
결과>	4
명령>	zcard myzip
결과>	10   myzip에 속한 모든 member 개수 10을 리턴

9. ZCOUNT key min max : score로 범위 지정 후 개수 조회

-inf, +inf 옵션 사용하여 전체 조회 가능.

명령>	zadd myzip  992 "서울" 342 "부산" 246 "대구" 282 "인천" 151 "광주" 1213 "경기"
결과>	6
명령>	zadd myzip  150 "강원" 206 "충남" 264 "경북" 57 "제주"
결과>	4
명령>	zcount myzip -inf +inf   집합에 속한 모든 member 수
결과>	10
명령>	zcount myzip 300 +inf    인구가 3백만명 이상인 시.도 수
결과>	3
명령>	zcount myzip 200 299    인구가 200만명에서 299만명 사이의 시.도 수
결과>	4
명령>	zcount myzip -inf 199    인구가 199만명 이하인 시.도 수
결과>	3

10. ZLEXCOUNT key min max : mem으로 범위 지정하여 개수를 리턴

- + 옵션으로 전체 조회 가능.

min,max에 값을 줄 경우 반드시 [ or (를 사용하여야 한다.

[  포함할때 사용하고, (  제외할 때 사용한다.

score가 모두 같아야 원하는 결과를 조회할 수 있다.

명령>	zrangebylex city - +
결과>	0) Beijing
1) New Delhi
2) New York
3) Seoul
명령>	zlexcount city - +
결과>	4
명령>	zlexcount city "[New Delhi" +
결과>	3
명령>	zlexcount city "(New Delhi" +
결과>	2
명령>	zlexcount city "(New Delhi" "(Seoul"
결과>	1

11. ZRANK key member : index(rank)를 반환한다.

      ZREVRANK key member : index(rank)를 역순으로 반환한다.

score 순으로 index가 매겨지며 0부터 시작.

score가 같으면 mem으로 순서를 정한다.

명령>	zrange city 0 -1 withscores
결과>	0) 50 -> New Delhi
1) 60 -> Seoul
2) 70 -> Beijing
3) 80 -> New York
명령>	zrank city "Seoul"
결과>	1
명령>	zrank city "New York"
결과>	3

12. ZSCORE key member : mem의 score 리턴. -> 1.2이상 버전

      ZMSCORE key member1 member2 : 여러개 mem의 socre 리턴 -> 6.2이상 버전

명령>	zrange city 0 -1 withscores
결과>	0) 50 -> New Delhi
1) 60 -> Seoul
2) 70 -> Beijing
3) 80 -> New York
명령>	zscore city "Seoul"
결과>	60
명령>	zscore city "New York"
결과>	80

13. ZREM key member : member삭제.

명령>	zadd mycom  2009 "Sun microsystems" 1992 Wang 2002 Netscape
결과>	3
명령>	zadd mycom  1998 "Digital Equipment" 2005 K-mart 1987 "American motors"
결과>	3
명령>	zrange mycom 0 -1 withscores
결과>	0) 1987 -> American motors
1) 1992 -> Wang
2) 1998 -> Digital Equipment
3) 2002 -> Netscape
4) 2005 -> K-mart
5) 2009 -> Sun microsystems
명령>	zrem mycom "American motors" "Wang" "Digital Equipment"
결과>	3
명령>	zrange mycom 0 -1 withscores
결과>	0) 2002 -> Netscape
1) 2005 -> K-mart
2) 2009 -> Sun microsystems

14. ZREMRANGEBYRANK key start stop : index범위로 mem 다중 삭제

음수 사용가능.

명령>	zrange myzip 0 -1 withscores
결과>	0) 1 -> New Delhi
1) 2 -> Seoul
2) 3 -> Beijing
3) 4 -> New York
명령>	zremrangebyrank myzip 1 2
결과>	2
명령>	zrange myzip 0 -1 withscores
결과>	0) 1 -> New Delhi
1) 4 -> New York

15. ZREMRANGEBYSCORE key min max : score로 범위 지정하여 mem삭제.

-inf, +inf 옵션 사용가능.=> 전체 삭제.

min,max 값을 제외하려면 앞에 (를 사용한다.]

명령>	zadd city 50 "New Delhi" 60 "Seoul" 70 "Beijing" 80 "New York"
결과>	4
명령>	zrangebyscore city -inf inf withscores
결과>	0) 50 -> New Delhi
1) 60 -> Seoul
2) 70 -> Beijing
3) 80 -> New York
명령>	zremrangebyscore city -inf (70
결과>	2
명령>	zrangebyscore city -inf inf withscores
결과>	0) 70 -> Beijing
1) 80 -> New York
명령>	zremrangebyscore city -inf 70
결과>	1
명령>	zrangebyscore city -inf inf withscores
결과>	0) 80 -> New York

16. ZREMRANGEBYLEXkey min max : mem으로 범위 지정 후 삭제.

ZRANGEBYLEX key - + : 전부 조회

min,max에 값을 줄 경우 반드시 [ or (를 사용하여야 한다.

[  포함할때 사용하고, (  제외할 때 사용한다.

score가 모두 같아야 원하는 결과를 얻을 수 있음.

명령>	zadd city 0 "New Delhi" 0 "Seoul" 0 "Beijing" 0 "New York"
결과>	4
명령>	zrangebylex city - +
결과>	0) Beijing
1) New Delhi
2) New York
3) Seoul
명령>	zremrangebylex city "(New Delhi" "(Seoul"
결과>	1
명령>	zrangebylex city - +
결과>	0) Beijing
1) New Delhi
2) Seoul
명령>	zremrangebylex city "[New Delhi" "(Seoul"
결과>	1
명령>	zrangebylex city - +
결과>	0) Beijing
1) Seoul
명령>	zremrangebylex city "[New Delhi" "[Seoul"
결과>	1
명령>	zrangebylex city - +
결과>	0) Beijing

17. ZUNION 2 key1 key2 : 합집합.

ZINTER 2 key1 key2 : 교집합

ZDIFF 2 key1 key2 : 차집합

 

각 mem의 score는 지정하지 않으면 더해진다. (합,교,차집합 전부 동일)

ex) 

src_key1 = { (1,A), (2,B), (3,C) }  
src_key2 = { (4,B), (5,C) (6,D) }
결과 = { (1,A), (6,B), (8,C), (6,D) }

 

명령>	zunion 2 src_key1 src_key2 withscores
결과>	1) "A"
2) "1"
3) "B"
4) "6"
5) "D"
6) "6"
7) "C"
8) "8"

 

weights 옵션?

사용법은 zunion 2 src_key1 src_key2 weights 2 3 이다.
첫 번째 weight 2는 src_key1의 각 score에 곱해지고, 두 번째 weight 3는 src_key2의 각 score에 곱해진다.

src_key1 = { (1,A), (2,B), (3,C) }   -> { (1*2,A) (2*2,B) (3*2,C) }
src_key2 = { (4,B), (5,C), (6,D) } -> { (4*3,B) (5*3,C) (6*3,D) }
결과         = { (2,A) (4+12,B) (6+15,C) (18,D) }
          = { (2,A) (16,B) (21,C) (18,D) }

 

명령>	zunion 2 src_key1 src_key2 weights 2 3 withscores
결과>	1) "A"
2) "2"
3) "B"
4) "16"
5) "D"
6) "18"
7) "C"
8) "21"

 

aggregate 옵션?

사용법은 zunion 2 src_key1 src_key2 aggregate sum|min|max 이다.
sum은 각 score를 합한다. aggregate를 지정하지 않으면 sum 이 default이므로 sum으로 계산된다.
min은 각 member에서 적은 score를 취하고,

max는 큰 score를 취한다.

src_key1 = { (1,A), (2,B), (3,C) }  
src_key2 = { (4,B), (5,C), (6,D) }
aggregate min = { (1,A) (2,B), (3,C), (6,D) }
aggregate max = { (1,A) (4,B), (5,C), (6,D) }
명령>	zunion 2 src_key1 src_key2 aggregate min withscores
결과>	1) "A"
2) "1"
3) "B"
4) "2"
5) "C"
6) "3"
7) "D"
8) "6"
명령>	zunion 2 src_key1 src_key2 aggregate max withscores
결과>	1) "A"
2) "1"
3) "B"
4) "4"
5) "C"
6) "5"
7) "D"
8) "6"

ZUNION numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX] [WITHSCORES]


18. ZUNIONSTORE dest_key2src_key1 src_key2 : 합집합 구한후 dest key에 저장.

ZINTERSTORE dest_key2src_key1 src_key2 : 교집

ZDIFFSTORE dest_key2src_key1 src_key2  : 차집합 -> 6.2버전에서 사용가능.

 

각 mem의 score는 지정하지 않으면 더해진다

weights, aggregate 옵션 사용 가능.

 

soure key를 목적지로 사용하여 소스키 삭제 후 결과만 insert가 가능.

ZUNIONSTORE src_key1 2 src_key1 src_key2

 

ZUNIONSTORE dest_key numkeys src_key [src_key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]


19. ZSCAN key cursor : mem이 많을 경우 지정하여 반복 조회. -> 2.8버전부터 사용가

명령>	zadd myzip 1 A1 2 A2 3 A3 4 B1 5 B2 6 B3 7 C1 8 C2 9 C3
결과>	9
명령>	sscan myset 0
결과>	next cursor -> 0
0) 1 -> A1
1) 2 -> A2
2) 3 -> A3
...
8) 9 -> C3

 

count, pattern옵션 사용 가능.

명령>	zscan myzip 0 count 5
결과>	next cursor -> 0
0) E1
1) A2
2) C2
...
8) 9 -> C3
명령>	zscan myset 0 match B*
결과>	next cursor -> 0
0) 4 -> B1
1) 5 -> B2
2) 6 -> B3

ZSCAN key cursor [MATCH pattern] [COUNT count]


20. ZPOPMIN key count : 작은 값 부터 count 수만큼 꺼내옴.(조회 후 삭제됨.) -> 5.0.0버전 부터.

ZPOPMAX key count

 

BZPOPMIN key timeout : timout동안 데이터 들어오면 꺼내옴. 이미 있을경우 바로 꺼내옴. BLPOP과 같음.

BZPOPMAX key timeout


21. ZISMEMBER key member : mem있는지 확인. -> ent버전만 사용가능.

존재 시 : 1 반환

없을 때 : 0 반환.


22. ZRANDMEMBER key : 임의 멤버 조회. -> 6.2버전 사용 가능.

명령>	zadd mycity 10 Seoul 20 Busan 30 Daegu 40 Incheon 50 Gwangju 60 Gyeonggi
결과>	6
명령>	zrandmember mycity
결과>	Gyeonggi

 

count 옵션 사용 가능.

명령>	zrandmember mycity 3
결과>	1) "Gyeonggi"
2) "Seoul"
3) "Daegu"
명령>	zrandmember mycity -3
결과>	1) "Incheon"
2) "Incheon"
3) "Seoul"

 

ZRANDMEMBER key [count [withscores]]

 

출처 : http://redisgate.kr/redis/command/zsets.php

'Redis' 카테고리의 다른 글

Redis - sentinel  (1) 2024.06.18
Redis - Hashes  (0) 2024.06.16
Redis - Sets  (0) 2024.06.16
Redis - Lists 데이터 타입, 명령어  (2) 2024.06.16
Redis - String 데이터 타입, 명령어  (0) 2024.06.16