반응형
Redis의 Sorted Set은 특정 요소들의 집합으로, 각 요소는 고유한 값(value)과 정수나 부동소수점 형식의 점수(score)를 함께 가집니다. 이 점수에 따라 요소들이 자동으로 정렬됩니다.
특징:
- 자동 정렬: 요소들이 점수에 따라 오름차순으로 자동 정렬됩니다.
- 빠른 조회: 특정 범위에 있는 요소들을 빠르게 조회할 수 있습니다.
- 범위 조회 지원: 점수나 멤버 인덱스를 기반으로 부분 집합을 효율적으로 검색 가능합니다.
- 순위 계산: 요소들의 순위(rank)를 쉽게 계산할 수 있습니다.
- 중복 불가: 멤버 값은 중복될 수 없습니다. (단, 점수는 중복 가능)
- O(log(N)) 복잡도: 추가, 삭제, 조회 연산의 시간 복잡도는 O(log(N))입니다.
주요 명령어:
- ZADD: Sorted Set에 요소를 추가합니다.
- ZRANGE: 지정한 범위의 요소를 가져옵니다.
- ZREM: 요소를 삭제합니다.
- ZSCORE: 요소의 점수를 확인합니다.
- ZRANK: 요소의 순위를 확인합니다.
//ZADD key score member [score member ...] 추가
ZADD le/aderboard 100 alice
ZADD leaderboard 200 bob 150 charlie
//ZSCORE key member 조회
ZSCORE leaderboard alice # 결과: 100
//ZRANGE key start stop [WITHSCORES] 인덱스기반(시작; 0) 범위 조회 [점수도 같이 반환]
ZRANGE leaderboard 0 -1 WITHSCORES # 전체 조회
//ZRANGEBYSCORE key min max [WITHSCORES] 점수 기반 범위 조회
ZRANGEBYSCORE leaderboard 100 200 WITHSCORES
//ZRANK key member 0시작 순위 반환(오름차순)
ZRANK leaderboard bob # 결과: 2
//ZREVRANK key member 내림차순 순위 반환
ZREVRANK leaderboard bob # 결과: 0
//ZREM key member [member ...] 특정 맴버 삭제
ZREM leaderboard alice
활용 사례
(1) 리더보드
게임에서 점수에 따라 순위를 관리할 때 유용합니다.
- 점수를 score로, 사용자 이름이나 ID를 member로 저장.
- 순위 조회, 점수 범위 내 사용자 검색 등이 가능.
(2) 태스크 스케줄링
- 점수를 타임스탬프로 사용하여 작업을 스케줄링.
- 특정 시간 범위의 작업을 조회하거나 삭제 가능.
(3) 우선순위 큐
- 점수를 우선순위로 사용하여 작업을 관리.
주의점
- 메모리 사용량: 점수와 멤버를 함께 저장하므로 메모리 사용량이 단순 Set보다 큽니다.
- 점수 정밀도: 점수는 부동소수점(Floating Point)이므로 정밀도에 주의해야 합니다.
TTL 설정
Redis의 Sorted Set 자체에는 직접적인 TTL(Time To Live) 설정이 지원되지 않습니다. Redis는 Key-Value 기반으로 동작하므로, TTL은 키(key) 단위로 설정됩니다. 따라서 zset 안의 각 맴버에게 만료시간을 설정하는 것이 아닌 Sorted Set 전체에 대해 TTL을 설정해야 합니다.
- TTL은 키 전체에 적용됩니다. Sorted Set의 개별 멤버에 TTL을 설정할 수는 없습니다.
- 개별 멤버 TTL 관리가 꼭 필요하다면, 점수를 TTL처럼 사용하거나 별도 키로 TTL 관리하는 방법이 가장 실용적입니다.
- TTL 설정 후, 키이 삭제되면 Sorted Set에 저장된 모든 멤버도 함께 삭제됩니다.
- TTL은 주로 일시적인 데이터에 사용됩니다. 예를 들어, 일일 리더보드나 임시 작업 큐 등에 적합합니다.
- 키가 이미 만료된 상태에서 접근하면, Redis는 키를 자동으로 삭제하고, 해당 키에 대한 작업은 무시됩니다.
레디스로 구현하려면..
sorted set으로 랭킹 저장하고 각 맴버별로 hash만들어서 ttl 설정한 후 노티피케이션이나 주기적으로 확인하여 set에서 삭제하는 로직 작성하여 수동으로 관리해야함..
# Sorted Set에 멤버 추가
ZADD myset 100 user1
ZADD myset 200 user2
# user1의 TTL이 필요하면 별도 키 생성 후 TTL 적용
SET user1_temp_value some_value
EXPIRE user1_temp_value 3600 # user1_temp_value 키에 TTL 1시간 설정
728x90
반응형
'개발 > cache' 카테고리의 다른 글
분산락 - redis 사용 (0) | 2024.11.08 |
---|---|
[redis] 기초 (0) | 2023.02.08 |