- Redis Data Type 32023년 06월 02일
- starryeye
- 작성자
- 2023.06.02.:47
Redis 가 제공하는 Data Type 종류에 대해 계속 알아보겠다.
5. Sorted Set (ZSets)
하나의 Key 에 Value 로는 정렬된 데이터 집합으로 이루어진 형태이다.
-> Key 는 변수이고, Value 는 C++ 의 set 이라 생각하면 편하다.
-> 그런데 차이점은, Value 에 각 데이터들은 score 라는 값(숫자)이 존재하고 이를 바탕으로 정렬한다.
(각 데이터는 member 로 불린다.)
특징
1. Redis 의 Sets 와 유사하게 유니크한 값의 집합이다.
2. 정렬된 상태를 유지한다.
-> 최소/최대 값을 빠르게 조회할 수 있다.
3. 활용
랭킹(리더 보드) 기능에 활용 가능하다.
4. 대표적 명령어
명령어 기능 ZADD [Key] [Score] [Member] [Score] [Member] ... Key 값을 가진 ZSets 에 Score-Member 쌍의 Value 들을 저장한다. ZRANGE [Key] [StartIndx] [EndIndx] Key 값을 가진 ZSets 가 오름차순으로 정렬되었을 때,
StartIndx 부터 EndIndx 까지의 범위의 값(Member)을 반환한다.
O(log(N) + M) N: 전체 Member 수, M: 리턴하는 Member 수ZRANK [Key] [Member] Key 값을 가진 ZSets 의 Member 에 해당하는 순위를 반환한다.
(오름차순 기준)
O(log(N) + N)ZREVRANK [Key] [Member] Key 값을 가진 ZSets 의 Member 에 해당하는 순위를 반환한다.
(내림차순 기준)
O(log(N) + N)ZREM [Key] [Member] [Member] ... Key 값을 가진 ZSets 의 Member 들을 삭제한다. ZLEN [Key] Key 값을 가진 ZSets 에 속한 Member 의 총 갯수를 반환한다. http://redisgate.kr/redis/command/zsets.php
5. 예시
> leaderboard:455 라는 Key 를 가진 ZSets 에 Score - Member 쌍으로 저장했다.
마지막 라인은 덮어쓰기 되었다.
> leaderboard:455 라는 Key 를 가진 ZSets 의 0순위 부터 2순위 까지의 Member 를 구한다.
(REV 명령어로, 내림차순 적용)
> leaderboard:455 라는 Key 를 가진 ZSets 의 user:2 라는 Member 의 순위를 구한다.
(내림차순)
https://redis.io/docs/data-types/sorted-sets/
6. Sorted Set 의 데이터 구조
http://redisgate.kr/redis/configuration/internal_skiplist.php
zip list, skip list
6. Bitmaps
Key 하나에 Value 는 0 과 1 로 이루어진 벡터, Bitmap 형태이다.
특징
1. 비트 벡터이므로 비트 연산이 가능하다.
2. 하나의 비트맵이 가지는 공간은 4 byte 로 2^32 - 1 이다.
3. 활용
비트 벡터의 각 인덱스를 유저 Id 로 매핑 시키고,
방문 여부를 의미하도록 정하면 BITCOUNT 연산은 전체 방문 수를 의미하게 된다.
비트맵의 비트 연산 기본 활용인 Bit masking 으로 사용할 수 있다.
4. 대표적 명령어
명령어 기능 SETBIT [Key] [Offset] [Value] Key 값에 해당하는 비트맵의 특정 Offset 의 값을 Value(0 or 1)로 변경한다. GETBIT [Key] [Offset] Key 값에 해당하는 비트맵의 특정 Offset 의 값을 반환 받는다. BITCOUNT [Key] Key 값에 해당하는 비트맵에서 비트가 1인 인덱스의 수를 센다.
O(N)BITOP [Operation] [Dest Key] [Key1] [Key2] Key1, Key2 에 해당하는 비트맵을 Operation 에 해당하는 비트 연산을 수행하여 결과를 Dest Key 의 비트맵에 할당한다.
AND, XOR, OR, NOThttp://redisgate.kr/redis/command/bits.php
5. 예시
> pings:2024-01-01-00:00 이라는 Key 에 해당하는 Bitmaps 의 123 Offset 에 1을 할당
> pings:2024-01-01-00:00 이라는 Key 에 해당하는 Bitmaps 의 123 Offset 의 값을 구하였다.
https://redis.io/docs/data-types/bitmaps/
7. HyperLogLog
하나의 Key 에 Value 는 데이터의 집합이다.
-> Redis Sets 와 비슷하다.
특징
1. 데이터 집합 내의 유니크 값 개수를 구하는데 사용된다.
2. 확률적 자료구조로 개수를 구하는데 오차(0.81%)가 있으며, 매우 큰 데이터를 다룰 때 사용된다.
3. 속도
1백만개의 데이터를 insert
-> SADD 보다 PFADD 가 1.6 배 빠르게 측정됨
조회는 PFCOUNT 와 SCARD 모두 O(1) 이다.
4. 공간
Set에 1백만개의 숫자를 저장하면 4,848kb,
1천만개의 숫자를 저장하면 46,387kb를 사용하지만,
HyperLogLog를 사용하면 원소 개수와 상관없이 고정으로 12kb만 사용한다.
4. 활용
데이터 정확도를 높게 보장하지 않아도 된다면,
회원 Id 를 HyperLogLog 에 빠르게 적재하고 방문자 수를 빠르게 조회 할 수 있다.
5. 대표적 명령어
명령어 기능 PFADD [Key] [Element] [Element] ... Key 값에 해당하는 HyperLogLog 에 값들을 저장한다.
O(1)PFCOUNT [Key] Key 값에 해당하는 HyperLogLog 의 전체 요소의 갯수를 구한다.
O(1)PFMERGE [Dest Key] [Key1] [Key2] Key1, Key2 의 HyperLogLog 에 속한 모든 요소를 병합 하여 Dest Key 에 해당하는 HyperLogLog 에 할당한다.
O(N)http://redisgate.kr/redis/command/hyperloglog.php
6. 예시
> members 라는 Key 에 해당하는 HyperLogLog 에 123, 500, 12 의 값들을 저장하였다.
> members 라는 Key 에 해당하는 HyperLogLog 의 총 Value 갯수를 구하였다.
'DataBase > NoSQL' 카테고리의 다른 글
Redis Core, I/O, Transaction, Lock (0) 2023.06.03 Redis Data Type 2 (1) 2023.06.02 Redis Data Type 1 (0) 2023.06.02 Redis 시작해보기 (0) 2023.06.01 MongoDB Sharded Cluster (0) 2023.06.01 다음글이전글이전 글이 없습니다.댓글