redis - data type sorted set
의 자료 구조를 거쳐 sorted set에 관하여 기술하겠다.
🐳 sorted set이란

sorted set은 스코어-값 쌍으로 저장되는 자료구조이다.
저장되는 시점에 스코어 값에 따라 정렬된다.
같은 스코어를 가진 경우 데이터(값)에 사전순으로 정렬된다.
즉 score 값을 기준으로 자동 정렬되어있는 자료구조이다.
🐳 sorted set의 특징
🌊 자료구조 'set'과의 유사성
데이터는 중복없이 저장된다는 점에서
set과 유사하다.
🌊 자료구조 'hash'와의 유사성
각 데이터는 스코어와 연결돼 있어서
key-field-value의 구조를 갖는 hash와
key-score-value의 구조를 갖는 sorted set의
구조적 유사성이 있다.
🌊 자료구조 'list'와의 유사성
모든 데이터는 스코어를 기준으로 정렬되어있어
list처럼 인덱스를 이용하여 접근할 수 있다.
INFO
list와 sorted set중 인덱스로 접근시 더 빠른 자료구조는?
좀 더 친숙한 list일 것같지만 sorted set이다.
list: O(n)
sorted set: O(log(n))
따라서 인덱스를 이용해 데이터에 접근할 일이 많다면
list 보다 sorted set을 이용하자
🐳 sorted set 명령어
🌊 ZADD 데이터 삽입
zadd key score value
zadd key score1 value1 score2 value2 ...
zadd를 이용하면 sorted set에 데이터를 저장할 수 있다.
이때 저장하고자 하는 데이터가 이미 있는 경우에는 스코어에 의하여 재정렬된다.
스코어는 double precision floating number(배정밀도 부동소수점 숫자)의
String만 허용한다.
코드
zadd key score value 로 저장가능하다.
127.0.0.1:6379> zadd score:1 100 user:b
(integer) 1
zadd key score1 value1 score2 value2 ... 로 복수의 데이터 저장 가능하다.
127.0.0.1:6379> zadd score:1 150 user:a 150 user:c 200 user:f 300 user:e
(integer) 4
zadd 의 옵션들
- XX: 데이터가 이미 존재하는 경우에만 스코어를 업데이트 한다. (update)
- NX: 데이터가 존재하지 않는 경우에만 새로 삽입한다. (create)
- LT: 업데이트 하고자 하는 스코어가 기존 데이터의 스코어보다 작을 때만 갱신한다. 존재하지 않는 경우에는 삽입한다.
- RT: 업데이트 하고자 하는 스코어가 기존 데이터의 스코어보다 클 때만 갱신한다. 존재하지 않는 경우에는 삽입한다.
🌊 ZRANGE 인덱스로 조회
zrange key startIDX endIDX [withscores] [rev]
zrange는 기본적으로 인덱스로 조회한다.
코드
127.0.0.1:6379> zrange score:1 1 3
1) "user:a"
2) "user:c"
3) "user:f"
withscores 옵션으로 조회하면 스코어와 함께 조회한다.
127.0.0.1:6379> zrange score:1 1 3 withscores
1) "user:a"
2) "150"
3) "user:c"
4) "150"
5) "user:f"
6) "200"
rev 옵션으로 조회시 역순으로 조회한다.
127.0.0.1:6379> zrange score:1 1 3 withscores rev
1) "user:f"
2) "200"
3) "user:c"
4) "150"
5) "user:a"
6) "150"
🌊 ZRANGE 스코어로 조회
zrange key startScore endScore byscore [withscores] [rev]
byscore로 조회시 score를 기준으로 조회한다.
코드
127.0.0.1:6379> zrange score:1 100 200 withscores byscore
1) "user:b"
2) "100"
3) "user:a"
4) "150"
5) "user:c"
6) "150"
7) "user:f"
8) "200"
(는 해당 score는 제외하고 조회하라는 뜻이다.
127.0.0.1:6379> zrange score:1 100 (200 withscores byscore
1) "user:b"
2) "100"
3) "user:a"
4) "150"
5) "user:c"
6) "150"
rev사용시 역순으로 조회해야한다.
127.0.0.1:6379> zrange score:1 (200 100 withscores byscore rev
1) "user:c"
2) "150"
3) "user:a"
4) "150"
5) "user:b"
6) "100"
+inf, -inf로 구간을 지정하자.
127.0.0.1:6379> zrange score:1 -inf +inf byscore withscores
1) "user:b"
2) "100"
3) "user:a"
4) "150"
5) "user:c"
6) "150"
7) "user:f"
8) "200"
9) "user:e"
10) "300"
127.0.0.1:6379> zrange score:1 (150 +inf byscore withscores
1) "user:f"
2) "200"
3) "user:e"
4) "300"
🌊 ZRANGE 사전순으로 조회
zrange key startScore endScore bylex [withscores] [rev]
문법만 간단히 들겠다...
철자에 ( -> 해당 철자 포함
철자에 [ -> 해당 철자 미포함
가장 첫문자는 -
가장 마지막 문자는 +
맺으며
sorted set은 실시간 리더보드, 최근 검색기록, 태그기능등
다양한 적용 방식이 있는 만큼 구조와 커맨드를 잘 익혀야한다.
'NoSQL > REDIS' 카테고리의 다른 글
| [Redis] pub/sub , stream 실시간 메시징의 전초 - (1) pub/sub (0) | 2023.12.27 |
|---|---|
| [Redis] redis 자료구조 - bit map, Hyperloglog (0) | 2023.12.24 |
| [Redis] Redis Docker 실습 3- 자료구조-hash,set (0) | 2023.12.24 |
| [Redis] Redis Docker 실습 2- 자료구조-list (0) | 2023.12.23 |
| [Redis] Redis Docker 실습 1-자료구조 String (1) | 2023.12.23 |