랭킹 측정에서 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 |
---|