Redis

[Redis] ZSET

montmer27 2026. 3. 27. 21:15

개념

ZSET: 중복을 허용하지 않고 자동으로 정렬되는 집합 자료구조 (Sorted Set)

구성 요소

  • key : 저장되는 타이틀
  • value : 저장되는 실제 데이터
  • score : 해당 데이터를 정렬하기 위한 기준이 되는 숫자

장점 (DB와 비교) -> 실시간 순위 변동이 잦은 데이터 처리에 유리

  1. 자동 정렬 (정렬 비용이 사실상 0원)
  2. 점수 변경 시 순위가 즉시 반영
  3. TOP N 조회가 빠름 (실시간 반응성, 고성능 동시에 만족)

대표 명령어 (score가 높은 값이 자동으로 상위에 정렬)

  1.  zadd key score value
  2. zincrby key score value (score만큼 증가시킴)
  3. zrevrange key start_idx end_idx (점수가 높은 순서로 지정된 범위만큼 가져옴)
    1. zrange : 오름차순으로 표시
    2. + withscores : score도 함께 표시

추가 명령어 : https://redis.io/docs/latest/commands/?group=sorted-set

 

Commands

Redis Cloud Fully managed and integrated with Google Cloud, Azure, and AWS.

redis.io

 

실무 사용 예시

  • 실시간 인기 상품/검색어/게시물 등
  • 실시간 시청 TOP10
  • 그밖에 순위가 구현된 많은 것들

 

왜 DB로는 구현하지 않는가?

: GROUP BY, ORDER BY는 성능 소모가 매우 큰데, 데이터가 많아지면 속도가 급격하게 느려져 DB가 버티지 못함.

 

Time Window 개념 : 단순 누적이 아니라 데이터를 시간 단위로 관리하여 최근 데이터만 조회할 수 있도록 하는 개념. Key를 시간으로 쪼개서 관리함.

시간 단위로 데이터 관리하는 법 예시

1. 데이터 추가 (key - {score-value} {score-value} {score-value} 형식) 


ZADD category_rank:2025-11-26 120 electronics 95 fashion 80 beauty 60 food 40 sports 20 book

ZADD category_rank:2025-11-27 140 electronics 110 fashion 70 beauty 90 food 50 sports 30 book

ZADD category_rank:2025-11-28 160 electronics 130 fashion 100 beauty 85 food 60 sports 25 book

2. 여러 ZSET을 하나로 묶기: (zunionstore {이름} {키 갯수} {key} {key} {key} aggregate sum)

aggregate sum: 각 카테고리의 value가 같은 것들끼리 score를 합산함

여기서 어떤 날짜까지 합산하느냐에 따라서 타임 윈도우가 정해진다. (모든 날짜를 더해버린다면 사실 의미가 없어짐)

zunionstore category_rank:recent3 3 category_rank:2025-11-26 category_rank:2025-11-27 category_rank:2025-11-28 aggregate sum

category_rank 아래 recent3가 추가됨

이제 최신 데이터를 조회할 수 있다.


zrevrange category_rank:recent3 0 2 withscores

1) "electronics"

2) "420"

3) "fashion"

4) "335"

5) "beauty"

6) "250"