본문 바로가기
Python

Redis-Py : ZSet(Sorted Set) 랭킹 구현 활용

by Byeong 2024. 12. 8.

 

 ZSETSorted Set으로 세트와 정렬된 목록의 기능을 결합한 Redis의 강력한 데이터 구조이다.  요소를 추가, 제거 또는 업데이트할 수 있으며, 항상 점수 또는 순위로 정렬된 순서를 유지한다. 이러한 특성 덕분에 쉽게 랭킹 시스템 구현이 가능하며 관리가 간편하다.

 

여기서는 ZSET의 대표적인 함수 몇 가지를 정리하려고 한다.

 


1. ZINCRBY : 점수 증가 및 감소

특정 멤버의 점수를 증가시키거나 감소시키는 데 사용한다. 멤버가 존재하지 않으면 자동으로 추가된다.

redis_client.zincrby(key, increment, member)

#점수 증가 
redis_client.zincrby('ranking', 10, 'player1')

#점수 감소
redis_client.zincrby('ranking', -5, 'player1')

 

 

- 'ranking'이라는 ZSET에서 'player1'의 점수를 10 증가도 가능하고 반대로 -5로 감소도 가능하다.

- 멤버가 없는면 자동으로 추가된다. 

 

Python-Redis-Commands-ZINCRBY

 


2. ZRANGE : 점수 오름차순 조회

ZSET에서 점수가 낮은 순서대로(오름차순) 멤버를 조회한다.

#점수가 낮은 순서대로 
redis_client.zrange( key, start, stop, WITHSCORES)

#하위 3명을 출력
redis_client.zrange('ranking', 0, 2, WITHSCORES=True)

#출력 예시
[('player3', 5.0), ('player1', 10.0), ('player2', 15.0)]

- 'ranking'이라는 ZSET에서 점수가 낮은 하위 3명을 출력.

- WITHSCORES=True를 설정하면 점수도 함께 출력된다(기본값은 False).

 

Python-Redis-Commands-ZRANGE

 


3. ZREVRANGE : 점수 내림차순 조회

ZSET에서 점수가 높은 순서대로(내림차순) 멤버를 조회한다. ZREVRANGE에서 REV는 REVerse 역순을 의미 한다.

#점수가 높은 순서대로
redis_client.zrevrange( key, start, stop, WITHSCORES)

#상위 3명을 출력
redis_client.zrange('ranking', 0, 2, WITHSCORES=True)

#출력 예시
[('player2', 15.0), ('player1', 10.0), ('player2', 5.0)]

 

- 'ranking'이라는 ZSET에서 점수가 낮은 상위 3명을 출력.

- WITHSCORES=True를 설정하면 점수도 함께 출력된다(기본값은 False).

 

Python-Redis-Commands-ZREVRANGE

 


4. ZSCORE : 특정 사용자 점수 조회

ZSET에서 특정 멤버의 점수를 조회할 때 사용한다.

#특정 사용자 조회
redis_client.zscore( key, member )

#player2 점수 조회
redis_client.zrange('ranking','player2 )

#출력 예시 
15.0

- 'player2'의 점수를 조회

 

Python-Redis-Commands-ZSCORE

 


5. ZADD : 멤버 추가 및 점수 업데이트

ZSET에 멤버와 점수를 추가하거나, 기존 멤버의 점수를 업데이트한다.

#사용자 추가 
redis_client.zadd( key, {member: score} )

#player1과 player2 추가 
redis_client.zadd('ranking', {'player1': 10, 'player2':30})

- 'ranking'이라는 ZSET에 'player1'은 10점,  'player2'은 30점으로 추가 

 

Python-Redis-Commands-ZADD

 

 


6. ZREM : 멤버 삭제 

ZSET에서 특정 멤버를 삭제할 때 사용한다. 한 번에 여러 멤버를 삭제할 수도 있다.

#사용자 삭제
redis_client.zrem( key, member)

#player1과 player2 삭제
redis_client.zadd('ranking', 'player1', 'player2')

- 'ranking'이라는 ZSET에 'player1'과  'player2'를 삭제

 

Python-Rdis-Commands-ZREM

 


마무리

 ZSET은 Redis의 유연하고 강력한 데이터 구조로, 랭킹 시스템부터 다양한 정렬된 데이터 관리에 활용할 수 있다. Z로 시작하는 함수는 대부분 ZSET 관련이므로, 필요에 따라 문서를 참고해 적합한 명령어를 선택해서 사용하면 좋다.

 

Redis-Py Commands 문서