Redis에서 `Sorted Set`을 사용하여 리더보드를 구현하는 이유

CosmoNumb·2024년 8월 19일
0

DB

목록 보기
1/8
post-thumbnail

Redis의 Sorted Set은 점수 기반으로 데이터를 자동 정렬하는 기능을 제공하여 리더보드 구현에 매우 적합합니다.

1. 자동 정렬

Sorted Set은 각 요소에 대한 점수를 기반으로 자동으로 정렬된 상태를 유지합니다. 리더보드에서는 사용자들의 점수에 따라 순위를 매겨야 하는데, Sorted Set을 사용하면 별도의 정렬 로직 없이 점수에 따라 자동으로 순위가 유지됩니다.

  • 예시: 게임에서 플레이어의 점수를 Sorted Set에 저장한다고 가정해봅시다. 다음과 같이 점수를 저장할 수 있습니다.
    ZADD leaderboard 150 "player1"
    ZADD leaderboard 200 "player2"
    ZADD leaderboard 100 "player3"
    이 명령어들을 실행하면, Sorted Set은 자동으로 점수에 따라 player2, player1, player3 순으로 정렬됩니다.

2. 빠른 순위 계산

Sorted Set은 특정 사용자의 순위를 빠르게 계산할 수 있습니다. 리더보드에서 사용자의 순위를 조회하는 것은 매우 중요합니다. Redis의 ZRANKZREVRANK 명령어를 사용하면 사용자의 순위를 효율적으로 조회할 수 있습니다.

  • 예시: player1의 순위를 조회하고 싶다면 다음과 같이 할 수 있습니다.
    ZREVRANK leaderboard "player1"
    이 명령어는 player1의 순위를 점수의 내림차순으로 계산하여 반환합니다. 예를 들어, player1이 두 번째로 높은 점수를 가지고 있다면 1이 반환됩니다(0부터 시작하는 순위).

3. 범위 기반 조회

리더보드에서는 상위 N명의 사용자 또는 특정 점수 범위 내의 사용자들을 조회하는 기능이 필요합니다. Sorted Set은 이러한 범위 기반 조회를 매우 효율적으로 처리합니다.

  • 예시: 상위 10명의 플레이어를 조회하려면 다음과 같이 할 수 있습니다.
    ZREVRANGE leaderboard 0 9 WITHSCORES
    이 명령어는 점수가 높은 순으로 상위 10명의 플레이어와 그들의 점수를 반환합니다.

4. 효율적인 메모리 사용

Redis의 Sorted Set은 데이터를 압축하여 저장하므로 메모리 사용이 효율적입니다. 이는 리더보드와 같은 대규모 사용자 데이터를 관리할 때 중요한 장점입니다.

  • 예시: 수천 명의 플레이어의 점수를 저장하고 정렬해야 할 때, Sorted Set은 최소한의 메모리로 이를 처리할 수 있습니다.

5. 점수 업데이트

리더보드에서 사용자의 점수가 변동될 때 이를 실시간으로 반영할 수 있어야 합니다. Sorted Set은 점수 업데이트 시 자동으로 순위를 조정해 주기 때문에, 매우 효율적입니다.

  • 예시: player1의 점수가 180으로 증가했을 때, 다음과 같이 업데이트할 수 있습니다.
    ZADD leaderboard 180 "player1"
    이 명령어를 실행하면 player1의 점수가 업데이트되고, 자동으로 순위가 다시 계산됩니다.

6. 범용성 및 확장성

Sorted Set은 분산 환경에서도 잘 동작합니다. Redis의 클러스터링 기능을 사용하면 대규모 리더보드도 쉽게 확장할 수 있습니다. 이로 인해 대규모 사용자 기반을 가진 애플리케이션에서도 효율적으로 리더보드를 관리할 수 있습니다.

7. 실제 사례

많은 대형 게임이나 실시간 애플리케이션에서 Redis의 Sorted Set을 사용하여 리더보드를 구현하고 있습니다. 다음은 몇 가지 사용 사례입니다:

  • 게임 리더보드: 점수를 기반으로 플레이어의 순위를 유지하며, 상위 플레이어를 실시간으로 표시합니다.

    ZADD leaderboard 150 "player1"
    ZADD leaderboard 200 "player2"
    ZREVRANGE leaderboard 0 9 WITHSCORES  # 상위 10명 조회
  • 소셜 미디어: 특정 활동(예: 좋아요 수, 댓글 수)에 따라 사용자나 게시물의 순위를 정렬합니다.

    ZADD post_likes 100 "post1"
    ZADD post_likes 250 "post2"
    ZREVRANGE post_likes 0 4 WITHSCORES  # 가장 많이 좋아요를 받은 상위 5개 게시물 조회
  • 운동 앱: 사용자의 운동 기록(예: 달리기 시간, 거리)에 따라 순위를 유지하고 상위 기록을 표시합니다.

    ZADD run_distances 5.0 "user1"
    ZADD run_distances 10.0 "user2"
    ZREVRANGE run_distances 0 4 WITHSCORES  # 상위 5명의 주행 거리 조회

결론

Redis의 Sorted Set은 리더보드와 같은 순위 기반 시스템을 구현하는 데 매우 적합합니다. 자동 정렬, 빠른 순위 계산 및 범위 조회, 효율적인 메모리 사용 등 다양한 장점을 제공하여 실시간으로 순위를 관리하고 표시해야 하는 상황에서 특히 유용합니다. 이러한 이유로 많은 애플리케이션에서 Sorted Set을 사용해 리더보드를 구현하고 있습니다.

0개의 댓글