Redis 리더보드

Redis 리더보드 (Leaderboard)

연속적으로 변하는 점수로 플레이어·상품·판매자·주식 등의 엔티티를 순위화하고 그 순위를 실시간으로 사용자에게 서빙하는 리더보드 패턴입니다. Redis 정렬 집합(sorted set)이 순위를 자동 유지하고, 동반 해시가 사용자 메타데이터를 담습니다.

출처: 공식문서 — Redis leaderboard

언제 Redis 리더보드를 쓰는가

연속적으로 변하는 점수로 엔티티를 순위화하고 그 순위를 실시간으로 사용자에게 서빙해야 할 때 사용합니다.

왜 이 문제가 어려운가

관계형 DB에서 한 엔티티의 순위를 계산하려면 전체 테이블에 ORDER BY(최선 O(N))를 수행해야 하고, 수백만 행에서는 조회 시간이 초 단위로 늘어납니다. 결과를 캐싱해도 점수가 모든 사용자 행동마다 변하므로 어떤 TTL 기반 캐시든 즉시 오래되거나 만료 시 thundering-herd 갱신을 촉발합니다.

로컬 인-프로세스 구조는 로드 밸런서 뒤에서 깨집니다. 단일 인스턴스가 완전한 순위를 갖지 못하기 때문입니다. 전용 OLAP·리더보드 서비스는 순위 문제를 풀지만, 본질적으로 하나의 정렬 데이터 구조인 것을 위해 운영 오버헤드를 추가합니다.

이 사용 사례는 이벤트 이력을 기록하지만 순위화된 상태는 유지하지 않는 Redis Streams나, heavy hitter를 근사하지만 정확한 순위·이웃 쿼리는 못 하는 확률형 Top-K와도 다릅니다.

Redis 솔루션에서 기대할 수 있는 것

  • 모든 점수 변화에 갱신되는, 각 사용자의 정확한 전체 순위와 바로 위·아래 이웃 표시
  • 쓰기 성능 저하 없이 수천 동시 독자에게 top-N 페이지 서빙
  • 스스로 생성·만료되는 일간·주간·월간 보드
  • 앱 측 정렬 없이 시간 윈도우 보드를 복합 순위로 집계
  • 약 500MB RAM에서 수백만 순위 멤버 지원
  • 새 인프라 프로비저닝 없이 기존 배포에 리더보드 기능 추가

Redis가 이 솔루션을 어떻게 지원하는가

실제로 리더보드는 Redis 정렬 집합(보드당 하나의 키)으로 저장되며, 멤버는 엔티티 ID로 키되고 점수는 순위화할 값으로 매겨집니다. 엔티티별 동반 해시가 메타데이터(이름, 아바타, 티어)를 담아 정렬 집합을 가볍게 유지합니다.

  • Sorted sets가 순위 순서를 자동 유지 — ZADD, ZRANGE, ZREVRANK 모두 집합 크기와 무관하게 O(log N)
  • ZINCRBY가 점수를 원자적으로 제자리 갱신 — read-modify-write 사이클도 캐시 무효화도 없음
  • ZRANGE + REV + LIMIT가 top-N과 "내 주변(around me)" 이웃 쿼리를 한 명령으로 처리
  • 윈도우별 키의 EXPIRE로 일간·주간·월간 보드 자동 정리, ZUNIONSTORE로 앱 수준 조정 없이 윈도우 집계
  • Hashes로 엔티티 메타데이터 저장 → 정렬 집합이 작고 빠르게 유지
  • 읽기·쓰기의 서브 밀리초 대기 시간으로 요청 경로에 부담 없이 앉음. 이미 Redis를 쓰는 스택이면 한계 인프라 비용 0

에코시스템

더 알아보기 (Learn more)

  • Redis 리더보드를 직접 만드는 코드 예제: redis-py, node-redis, go-redis, Jedis, Lettuce, StackExchange.Redis, Predis, redis-rb, redis-rs — 각 라이브러리용 실행 가능한 인터랙티브 데모.
  • Redis Sorted Sets — 순위·범위 쿼리 심화.
  • 확률형 Top-K — 근사 heavy hitter와의 차이.