본문 바로가기
Redis

Redis SortedSet 정말 빠른가?

by sangyunpark99 2024. 10. 17.
랭킹 측정에서 List의 Collection과
Redis의 Sorted 성능 비교를 측정한
글 입니다.

테스트 상황

100만명의 임의로 생성한 유저를 저장한 상태에서 List와 SortedSet으로 각각

임의의 랭킹을 가진 유저를 조회해보는 테스트 입니다.

 

 

임의 User 데이터 삽입 ( Redis )

@Test
void insertUser() throws Exception {
    for (int i = 0; i < 1000000; i++) {
        int score = (int) (Math.random() * 100000);
        String userId = "userId_" + i;
        rankingService.setUserScore(userId, score);
    }
}

 

Redis에 SortedSet으로 User 데이터를 추가합니다.

 

 

ZCOUNT 명령어로 100만개의 데이터가 저장되었습니다.

 

SortedSet  vs ArrayList<Integer>

507079번 순위의 유저를 조회하는 상황을 테스트 해보겠습니다.

 

ArrayList<Integer> 테스트

@Test
void inMemorySort() {

    ArrayList<Integer> list = new ArrayList<>();
    for (int i = 0; i < 1000000; i++) {
        int score = (int) (Math.random() * 1000000);
        list.add(score);
    }

    stopWatch.start();
    Collections.sort(list);
    list.get(507079);
    stopWatch.stop();

    System.out.println(String.format("time : %d ms",stopWatch.getTotalTimeMillis()));
}

 

테스트 결과

테스트 결과 507079번째 랭킹을 조회하는데 걸리는 시간은 1s 276ms가 걸립니다.

 

 

 

 

SortedSet 테스트

 

랭크 조회 코드

public Long getUserRanking(String userId) {
    ZSetOperations zSetOperations = redisTemplate.opsForZSet();
    Long rank = zSetOperations.reverseRank(LEADERBOARD_KEY, userId);

    return rank;
}

 

 

Test 코드

@Test
void redisSortedSet() throws Exception{

    stopWatch.start();
    Long rank = rankingService.getUserRanking("userId_100");
    stopWatch.stop();

    System.out.println(String.format("rank: %d || time : %d ms", rank, stopWatch.getTotalTimeMillis()));
}

 

 

테스트 결과 811ms가 걸립니다.

 

결론

Redis를 사용한 SortedSet을 사용하는 것이 더 빠른 응답시간을 가집니다.

 

이유

Sorted Set은 ArrayList와는 다르게 데이터가 데이터가 삽입, 삭제 될 때마다 즉시 정렬 상태가 유지가 됩니다.

반면에, ArrayList는 데이터를 값의 크기와 상관없이 순차적으로 삽입해준뒤, Collection.sort를 하게 되면, 퀵 정렬을 통해서 정렬하게 됩니다. list는 조회를 할때마다 정렬을 해야한다는 추가 비용이 들게 됩니다.

 

 

ArryaList가 데이터를 순차적으로 삽입해주는지 확인하는 테스트

@Test
void linkedList() {
    ArrayList<Integer> list = new ArrayList<>();

    list.add(3);
    list.add(1);
    list.add(4);
    list.add(2);

    System.out.println(list);
}

 

출력 결과

 

'Redis' 카테고리의 다른 글

Redis, 캐싱하면 정말 응답 속도가 빨라?  (0) 2024.10.01