[WIL] 루퍼스_부트캠프 9주차

2025. 9. 14. 20:06·Essay/WIL

 

이번주는 랭킹 시스템을 개발하였고 레디스의 ZSET 자료구조를 사용했다. 그러면서 공부했던 것들을 정리해본다. 

 

1. Redis 자료구조 학습

랭킹 시스템 구현의 핵심은 Redis ZSET(정렬된 집합) 이다.

ZSET은 (member, score) 쌍을 저장하고, 점수 기준으로 정렬된 상태를 유지한다.

랭킹 시스템에서 자주 쓰는 명령어는 다음과 같다. 

  • 점수 추가/갱신:
ZADD rank:product:day:20250914 100 productId:123 
ZINCRBY rank:product:day:20250914 1 productId:123
  • 랭킹 조회 (Top-N):
ZREVRANGE rank:product:day:20250914 0 9 WITHSCORES
  • 특정 상품 점수/순위 조회:
ZSCORE rank:product:day:20250914 productId:123 
ZREVRANK rank:product:day:20250914 productId:123
  • 대용량 처리 보조:
ZSCAN rank:product:day:20250914 0 COUNT 1000
  • 집계/복제:
ZUNIONSTORE rank:product:day:20250915 1 rank:product:day:20250914 WEIGHTS 0.8

 

2. 일일 랭킹 Key 전략

(1) 고정 윈도우 (Fixed Window)

  • 하루 단위 키를 사용한다:
    • rank:product:day:YYYYMMDD
  • 캐리오버: 이전날 점수를 α(0~1 사이 값)만큼 곱해서 다음날로 이관
  •   ZUNIONSTORE rank:product:day:20250915 1 rank:product:day:20250914 WEIGHTS 0.8
    
  • 사전 준비: 자정 10분 전(23:50) 다음날 키를 생성하고 캐리오버를 실행.
    이렇게 하면 0시 직후에도 데이터가 비어 있지 않다.

(2) 슬라이딩 윈도우 (Sliding Window)

  • 일일 랭킹일 때 더 작은 시간 단위(예: 1시간)로 나누어 시간 단위 키를 유지한다.
    • rank:product:hour:YYYYMMDDHH
  • 최근 24시간(rolling)을 합산해 일간 랭킹처럼 조회한다.
      ZUNIONSTORE rank:product:day:20250914 24 rank:product:hour:2025091400 ... rank:product:hour:2025091423
    
  • 장점: 시간 흐름에 따라 자연스럽게 갱신되므로 콜드 스타트 완화.
  • 단점: 조회/집계 시 여러 키를 합산해야 하므로 비용 증가.

3. 콜드 스타트 대비 전략

콜드 스타트란 새로운 윈도우가 시작될 때 랭킹 데이터가 비어 있는 상황을 말한다.
예를 들어 윈도우 크기가 1일이고 0시에 새로 시작된다면, 다음날 0시 조회 시 데이터가 없어 빈 화면이 노출될 수 있다.
이 경우 사용자가 해당 시점에 랭킹을 조회하면 결과가 비어 있거나 신뢰하기 어려운 결과 화면이 노출되어 서비스 신뢰성이 떨어진다.

이를 완화하기 위해 고정 윈도우일 경우는 이전 윈도우의 값을 scale down하여 다음 윈도우를 생성할 수 있다.

3.1 내 구현 방식

  • 일일 랭킹 방식 고정 윈도우 전략 채택: 하루 단위로 키를 두고, 자정 10분 전 미리 다음날 키를 생성.
  • 처음엔 모든 상품을 옮기려고 했으나, 실제로는 TOP100만 보장하면 충분하다는 점을 피드백으로 확인.
  • 피드백 전에 구현한 방식은 Redis 단일 스레드 특성을 고려해 개발
    • 한 번에 대규모 연산(O(N))을 하면 블로킹이 발생할 수 있음.
    • 따라서 ZSCAN을 이용해 일정 단위(batch)로 데이터를 가져와 ZADD 하는 방식으로 구현.
    • 파이프라이닝: 반복되는 ZADD를 파이프라인으로 묶어 왕복 비용 최소화할 수 있다고 함. 
ZSCAN rank:product:day:20250914 0 COUNT 1000 
ZADD rank:product:day:20250915 <score*α> member

3.2 TOP100만 보장

ZUNIONSTORE로 한 번에 처리. N이 클 경우 블로킹 가능성 존재. 그러나 100건은 1초 이내로 빠르게 처리 가능.

4. Key의 TTL 관리

1) TTL 부여 시점

  • 키 생성 시점에만 TTL을 설정
    • 언제 만료될지 한눈에 예측 가능
    • 매번 TTL을 신경 쓰지 않아도 됨
ZADD rank:product:day:20250914 ...
EXPIRE rank:product:day:20250914 172800   # 2일. 초 단위

2) TTL을 2일로 설정한 이유

  • 캐리오버 시 사용하기 위해 전날 키가 일정 기간 유지되어야 한다.
    • 오늘 키: 오늘 + 내일 새벽까지 보장
    • 어제 키: 오늘까지 유지 → 내일 새벽에 자동 소멸

 


🚀 루퍼스 Loop:Pak L2 Backend
백엔드 경력 3년 이상 대상, 10주 실무 중심 부트캠프.
Java/Kotlin 중 하나를 선택해 실전 문제 해결·코드 리뷰·운영 관점 설계 등 실무 기술을 집중적으로 다룹니다.

🎁 20만원 할인 코드: N17NC

저작자표시 비영리 변경금지 (새창열림)

'Essay > WIL' 카테고리의 다른 글

[루퍼스] 10주간 돌아보기  (0) 2025.09.19
[WIL] 부트캠프 8주차  (0) 2025.09.07
[WIL] 부트캠프 7주차 : Spring Application Event 기본 용어와 튜토리얼 코드  (0) 2025.09.07
[WIL] 부트캠프 6주차  (0) 2025.08.24
[WIL] 부트캠프 5주차  (1) 2025.08.18
'Essay/WIL' 카테고리의 다른 글
  • [루퍼스] 10주간 돌아보기
  • [WIL] 부트캠프 8주차
  • [WIL] 부트캠프 7주차 : Spring Application Event 기본 용어와 튜토리얼 코드
  • [WIL] 부트캠프 6주차
devstep
devstep
웹 백엔드 개발자
  • devstep
    개발 여정
    devstep
  • 전체
    오늘
    어제
    • 분류 전체보기 (99) N
      • Java (24)
      • Spring Framework (17)
        • Spring (14)
        • JPA (3)
      • Database (9)
        • RDBMS공통 (1)
        • MySQL (6)
        • Redis (1)
        • Oracle (1)
      • Concept (13)
        • 테스트코드 (4)
        • 클린코드 (2)
        • 성능테스트 (4)
        • 설계 (1)
        • 인증 (1)
        • REST API (1)
      • git (2)
      • Intellij (4)
      • Computer Science (3)
        • 네트워크 (1)
        • 자료구조 (1)
        • 보안 (1)
      • Essay (22) N
        • Learning Essay (10)
        • WIL (12) N
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    자바메모리모델
    성능테스트
    비대칭암호화
    클린코드
    innodb
    블록암호화
    aggregate
    JMeter
    seed
    nginx
    카프카
    JavaMemoryModel
    tdd
    ClusteredIndex
    DDD
    테스트코드
    부하테스트
    JVM
    nofile
    대칭암호화
    단위테스트
    보안
    부하테스트도구
    springsecurity
    bean
    component
    linux
    인텔리제이실행에러
    applicationcontext
    storageEngine
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
devstep
[WIL] 루퍼스_부트캠프 9주차
상단으로

티스토리툴바