[개발자를 위한 레디스] 실시간 리더보드를 위한 Sorted Set 활용(1)

박상준·2024년 6월 13일
1

REDIS

목록 보기
13/20

절대적 리더보드

  • 서비스 내 모든 사용자를 대상으로 상위권 목록만을 표시
  • 전체 게임 사용자 중 상위 10명의 순위를 보여주는 리더보드

상대적 리더보드

  • 사용자마다 다른 데이터를 보여준다.
  • 사용자의 스코어를 기준으로 특정 그룹 내 순위를 표시한다.
  • 특정 지역 사용자들끼리만 순위를 매기거나, 사용자 주변의 순위를 보여주는 리더보드

레디스를 사용해야하는 이유

  1. 실시간 반영
    • 사용자의 점수가 변할 때마다 즉각적으로 리더보드에 반영되어야 한다.
  2. 데이터의 처리
    • 많은 사용자의 데이터를 빠르게 처리할 수 있어야 한다.

Sorted Set 사용

  • 데이터가 저장될 떄 이미 정렬되어 들어가기에 별도로 정렬할 필요가 없음
  • ZADD
    • 사용자 스코어를 추가시 사용

      ZADD 는 Sorted Set 에 값을 추가하는 경우 사용된다.

      ZADD key score1 member1 [score2 member2 ...]
      • 이런식으로 key : Sorted Set 의 이름
      • score1
        • 첫 번째 멤버에 대한 점수
      • member1
        • 첫 번째 멤버
      • [score2 member2 ... ] (선택) 추가적으로 입력할 점수와 멤버 쌍

예시

  • daily-score:220817 이라는 Sorted Set 에 플레이어와 그들의 점수를 추가하기
  • 데이터가 추가된 이후에는 ZRANGE 명령어로 정렬된 결과를 확인 가능하다.

Sorted Set 으로 데이터 업데이트

  • 데이터 증가

랭킹합산

  • 주간 리더보드 초기화 및 랭킹 합산

    • 매주 월요일마다 리더보드를 초기화한다고 가정.

    • 특정 주의 주간 리더보드를 계산하려면 각 일자의 스코어를 합산해야 한다.

    • 이를 위하여 Redis 의 ZUNIONSTORE 커맨드 사용
      - 지정한 키들에 있는 각 아이템의 점수를 합산하여 새로운 Sorted Set 에 저장한다.

      기본 사용법

      ZUNIONSTORE 기본 사용법은 다음과 같다

      ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]
    • destination

      • 결과를 저장할 새로운 키
    • numkeys

      • 합산할 키의 개수
    • key [key ...

      • 합산할 키들
    • WEIGTHS weight [weigh …]

      • (선택임) 각 키의 점수에 곱할 가중치
    • AGGREGATE SUM|MIN|MAX
      - (선택임) 합산 방식을 지정한다
      - 기본값은 SUM 이다.

      주간 리더보드 계산

    • 22년 8월 15 ~ 17일까지의 데이터를 합산해 주간 리더보드 계산

      ZUNIONSTORE weekly-score:2208-3 3 daily-score:220817 daily-score:220818 daily-score:220819

      합산된 데이터 조회

    • ZREVRANGE
      - 점수 순서의 역순으로 데이터를 반환한다.

      ![](https://velog.velcdn.com/images/qkrtkdwns3410/post/9bbfcd4d-d3be-423b-934e-68b0398a70fe/image.png)

      가중치 적용하는법

    • 특정 일자의 점수에 가중치를 적용하려면 WEIGHT 옵션을 사용해야한다.

    • 8월 16일 의 점수에 2 배의 가중치를 적용하려면 다음과 같이 한다.

      ZUNIONSTORE weekly-score:2208-3 3 daily-score:220815 daily-score:220816 daily-score:220817 WEIGHTS 1 2 1

profile
이전 블로그 : https://oth3410.tistory.com/

0개의 댓글