리더보드와 Sorted Set

위성구·2024년 8월 7일

Redis

목록 보기
5/7

리더보드 기능이란 실시간 랭킹을 보여주는 기능을 말합니다. 게임이라면 점수 순위, 검색 엔진이면 실시간 검색 순위, 그리고 이커머스 분야라면 인기상품과 같은 기능들을 보여주기 위해 사용할 수 있습니다.

관계형 데이터베이스로 구현하면?

이커머스를 기준으로 생각을 해보면, 인기의 기준을 가장 많이 구매한 물품으로 생각해볼 수 있습니다. 가장 많이 구입된 물품을 반환하는 기능을 만든다고 가정하면, 가장 많은 주문이 있는 물품을 구하려면 복잡한 Join과 함께, SUM , COUNT 등의 집계함수가 필요할 것입니다.

이를 피하기 위해 물품 테이블에 구매횟수 컬럼을 추가한다 해도, 결국 해당 칼럼을 빈번하게 수정해야 하며, 데이터를 조회하는 과정에서 정렬이 필요하기 때문에 성능 저하가 우려될 수 있습니다.

Sorted Set을 이용해보자

반면 Redis의 Sorted Set은 데이터를 추가하는 ZADD의 시간복잡도가 O(log(N)), M개의 데이터를 조회하기 위한 ZRANGE의 시간복잡도가 O(log(N) + M)입니다. 여기에 특별한 조회를 위한 SQL을 고민할 필요가 적기 때문에 구현도 쉽고 편하게 진행할 수 있습니다.'

구현

기본적인 entity dto controller service가 있는 프로제트에서 시작합니다.
git 주소

상품 구매 요청시 redis에 1증가
요청을 보내고 확인을 해보면

잘 들어가 있다.

데이터 순위로 가져오기

    public List<ItemDto> getMostSold() {
        Set<ItemDto> ranks = rankOps.reverseRange("soldRanks", 0, 9);// reverseRange은 linckedHashSet을 돌려준다. 이 set은 순서를 보장해준다.
        if (ranks == null) return Collections.emptyList();
        return ranks.stream().toList();
    }

profile
안녕하세요.

0개의 댓글