챕터 1 정리

최길중·2026년 4월 29일

Redis ZSET 실시간 랭킹 실습 요약

이번 실습에서는 RedisRedisInsight를 Docker로 실행하여 Redis 데이터를 직접 저장하고, GUI로 확인하는 환경을 구성했다.

Redis는 메모리 기반의 빠른 데이터 저장소이고, RedisInsight는 Redis 데이터를 시각적으로 확인할 수 있는 도구이다.


1. Redis / RedisInsight 실행

Redis 컨테이너 실행

docker run -d -p 6379:6379 --name redis redis:latest

RedisInsight 컨테이너 실행

docker run -d --name redisinsight -p 5540:5540 redis/redisinsight:latest

RedisInsight 접속 주소

http://localhost:5540

RedisInsight에서 Redis 연결 시 설정값은 다음과 같다.

Host: host.docker.internal
Port: 6379

2. redis-cli 테스트

Redis 컨테이너에 접속한다.

docker exec -it redis redis-cli

PING 테스트

PING

응답 결과

PONG

값 저장 및 조회

SET hello world
GET hello

RedisInsight에서도 저장된 값을 GUI로 확인할 수 있다.


3. ZSET이란?

ZSET(Sorted Set)은 각 데이터에 score를 부여하고, 그 점수를 기준으로 자동 정렬되는 Redis 자료구조이다.

쉽게 말하면 ZSET은 점수에 따라 자동으로 정렬되는 리스트라고 볼 수 있다.

항목설명
key데이터를 저장하는 이름
value실제 저장되는 값
score정렬 기준이 되는 점수

4. ZSET의 장점

ZSET은 실시간 랭킹 기능에 적합하다.

  • 별도의 ORDER BY 없이 자동으로 정렬된다.
  • 점수 변경 시 순위가 즉시 반영된다.
  • TOP N 조회가 빠르다.
  • 실시간 인기 상품, 인기 검색어, 인기 게시물 등에 활용하기 좋다.

5. ZSET 핵심 명령어

5.1 ZADD

ZADD는 값과 점수를 저장하는 명령어이다.

ZADD category_rank 1 "A"
ZADD category_rank 2 "B"

위 명령어는 category_rank라는 key에 "A", "B" 값을 저장하고 각각 점수 1, 2를 부여한다.


5.2 ZINCRBY

ZINCRBY는 특정 value의 score를 증가시키는 명령어이다.

ZINCRBY category_rank 1 "A"

위 명령어는 "A"의 score를 1 증가시킨다.
점수가 변경되면 ZSET 내부 순위도 즉시 반영된다.


5.3 ZREVRANGE

ZREVRANGE는 score가 높은 순서대로 데이터를 조회하는 명령어이다.

TOP 3 조회

ZREVRANGE category_rank 0 2 WITHSCORES

TOP 5 조회

ZREVRANGE category_rank 0 4 WITHSCORES

0 2는 0번 인덱스부터 2번 인덱스까지 조회한다는 뜻이므로 TOP 3를 의미한다.


6. ZSET은 어디에 사용될까?

ZSET은 실무에서 순위가 필요한 기능에 자주 사용된다.

  • 실시간 인기 상품
  • 실시간 인기 검색어
  • 오늘의 인기 게시물
  • 실시간 시청 TOP 10
  • 쇼핑몰 인기 카테고리
  • 게임 순위표

즉, 조회수나 클릭 수처럼 점수가 계속 변하고 순위가 필요한 기능에 적합하다.


7. DB 대신 ZSET을 사용하는 이유

DB로 랭킹을 만들면 보통 아래와 같은 쿼리를 사용한다.

SELECT category, COUNT(*)
FROM logs
GROUP BY category
ORDER BY COUNT(*) DESC
LIMIT 10;

하지만 데이터가 많아질수록 GROUP BYORDER BY의 비용이 커진다.
또한 실시간으로 순위를 계속 갱신해야 하는 상황에서는 DB에 부담이 커질 수 있다.

반면 Redis ZSET은 score가 변경되는 순간 순위가 자동으로 반영된다.
TOP N 조회도 빠르기 때문에 실시간 랭킹 처리에 유리하다.


8. Time Window 개념

실시간 랭킹에서는 전체 누적 데이터가 아니라 최근 N일 데이터가 필요한 경우가 많다.

예를 들어 최근 3일 인기 카테고리를 구하려면 날짜별로 ZSET key를 분리해서 저장하는 것이 좋다.

잘못된 방식은 하나의 key에 모든 점수를 계속 누적하는 방식이다.

ZADD category_rank 1 "A"
ZADD category_rank 2 "B"

올바른 방식은 날짜별로 key를 분리하는 방식이다.

ZADD category_rank:2025-11-26 1 "A"
ZADD category_rank:2025-11-26 2 "B"

ZADD category_rank:2025-11-27 1 "A"
ZADD category_rank:2025-11-27 2 "B"

이렇게 날짜별 ZSET을 만들면 최근 3일, 최근 7일 같은 기간 기반 랭킹을 계산할 수 있다.


9. 최근 3일 랭킹 만들기

최근 3일 인기 카테고리 TOP 3를 구하려면 먼저 날짜별 ZSET 데이터를 준비한다.

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

3일치 데이터를 하나의 ZSET으로 합칠 때는 ZUNIONSTORE를 사용한다.

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새로 생성될 ZSET key
3합칠 ZSET 개수
category_rank:2025-11-26 ~ 2025-11-28합칠 대상 key
AGGREGATE SUM같은 value의 score를 합산

이후 최근 3일 TOP 3를 조회한다.

ZREVRANGE category_rank:recent3 0 2 WITHSCORES

10. Spring Boot 연동

build.gradle에 Redis 의존성을 추가한다.

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.springframework.boot:spring-boot-starter-data-redis'
    compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'
}

application.yml에 Redis 연결 정보를 작성한다.

spring:
  data:
    redis:
      host: localhost
      port: 6379

Redis 설정 클래스를 작성한다.

@Configuration
public class RedisConfig {

    @Bean
    public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory factory) {
        return new StringRedisTemplate(factory);
    }
}

11. Spring Boot에서 ZSET 사용

카테고리를 조회할 때마다 score를 증가시킨다.

redis.opsForZSet().incrementScore(CATEGORY_KEY, category, 1);

TOP 3 카테고리를 조회한다.

redis.opsForZSet().reverseRangeWithScores(CATEGORY_KEY, 0, 2);

날짜별 ZSET을 만들 때는 날짜를 key에 포함한다.

CATEGORY_DAILY_KEY + currentDate.toString();

예시 key는 다음과 같다.

category:2025-11-26
category:2025-11-25
category:2025-11-24

최근 3일 데이터를 합칠 때는 unionAndStore()를 사용할 수 있다.

redis.opsForZSet().unionAndStore(baseKey, otherKeys, resultKey);

12. 정리

Redis ZSET은 score를 기준으로 데이터를 자동 정렬하는 자료구조이다.

조회수, 클릭 수, 검색 수처럼 점수가 계속 변하는 데이터를 실시간 랭킹으로 보여줄 때 매우 유용하다.

특히 날짜별 key를 분리하고 ZUNIONSTORE를 활용하면 최근 3일, 최근 7일과 같은 Time Window 기반 랭킹도 쉽게 구현할 수 있다.

profile
취준생

0개의 댓글