본문 바로가기

Trouble Shooting/DataBase

Redis Cache 성능 측정

 

 

1. API 설명 

음식점 예약 어플을 제작 중에 있다.

특정 조건에 따른 음식점 리스트를 출력하고자 한다.

성능 개선을 위해 캐시를 활용할 것이며 뚜렷한 변화가 있는지 측정하고자 한다.

 

입력 : 나라명, 도시명, 동명, 음식점 타입, 페이지, 페이지 당 크기

출력 : 해당 조건에 맞는 음식점 리스트

 

 

2. 기존 코드

- 서비스 클래스의 메서드

@Override
  public HashMap<String, Integer> getStoreList(String country, String city, String dong, String type, int page, int size) {
    return storeDAO.getStoreList(country, city, dong, type, page, size);
  }

 

- DAO 클래스의 메서드

@Override
  public HashMap<String, Integer> getStoreList(String country, String city, String dong, String type, int page, int size) {
    List<StoreEntity> storeInfo = queryFactory.select(storeEntity).from(storeEntity)
        .where(storeEntity.country.eq(country).and(storeEntity.city.eq(city))
            .and(storeEntity.dong.eq(dong)).and(storeEntity.type.eq(type)))
        .limit(size).offset(page * size).fetch();
    HashMap<String, Integer> result = new HashMap<>();
    for(StoreEntity info : storeInfo) {
      result.put(info.getStoreName(), info.getStoreId());
    }
    return result;
  }

 

- 해당 API는 조건에 맞는 데이터를 찾아 출력하고자 하는 형식에 맞추어 데이터를 생성하고 이를 반환해준다.

 

 

 

3. 기존 코드 성능 측정

- 1000건의 요청을 기준으로 하였다.

- 평균적으로 1.392초 안에 요청을 받을 수 있었다 즉, 고객이 요청시 1.392초 정도면 데이터를 받을 수 있었음을 의미한다.

- 하지만 평균은 그렇지만 어떠한 고객은 0.034초 안에 데이터를 받았지만 어떠한 고객은 3.039초가 걸려서 데이터를 받을 수 있었다.

 

 

 

 

4. 캐시를 사용한 코드

- 서비스 클래스의 코드

@Override
  public HashMap<String, Integer> getStoreList(String country, String city, String dong, String type, int page, int size) {
    String address = country + city + dong + type + page + size;
    Optional<StoreListDTO> storeList = storeListCache.findById(address);
    if (storeList.isEmpty() == true) {
      HashMap<String, Integer> new_storeList = storeDAO.getStoreList(country, city, dong, type, page, size);
      StoreListDTO storeListDTO = new StoreListDTO(address, new_storeList);
      storeListCache.save(storeListDTO);
      return new_storeList;
    }
    return storeList.get().getStoreList();
  }

- 처음 요청에 대해서 캐시를 확인 후 해당 키 값을 갖는 데이터가 캐시에 없다면 데이터를 DB에서 가져온다. 이 후, 데이터를 캐시에 저장하고 데이터를 반환한다.

- 이 후, 다른 요청에 대해서 만약 데이터가 캐시에 있다면 데이터를 캐시에서 꺼내서 반환해준다.

 

 

 

5. 개선 코드의 성능 측정

- 1000건의 요청에 대해서 평균적으로 0.023초 안에 데이터를 받을 수 있었다.

- 가장 적게 걸린 유저는 0.003초, 가장 오래 걸린 유저는 0.183초이지만 모두 훨씬 적기에 유저가 쾌적하게 데이터를 받을 수 있음을 유추할 수 있다.

 

 

 

 

6. 요청 수 증가

기존 코드에 2000 스레드 요청

 

캐시 사용 코드에 2000 스레드 요청

- 요청을 두배로 늘렸을 때, 서버 대수가 한대이기 때문에 대역폭의 문제로 속도 차이가 많이 나는 것을 우선적으로 확인할 수 있다.

- 요청에 대해서 여전히 응답 속도에 차이가 난다. 평균 4초의 속도를 0.061초로 줄일 수 있었고 최대 응답 시간은 7.5초에서 0.278초로 줄일 수 있었다.

 

 

 

 

7. 결론

- 캐시를 사용시 눈에 띄는 속도차이가 발생함을 확인할 수 있다.

- 유저의 관점으로 봤을 때, 유저는 7.5초안에 받을 수 있었던 데이터를 0.278초안에 데이터를 받을 수 있게 되었다.

- 서버의 관점으로 봤을 때, 평균적으로 데이터 처리 시간을 4.073초에서 0.061초로 처리시간을 줄일 수 있었다.

- 요청이 많은 정보에 대해서는 캐시 사용은 필수적이라고 생각이 든다.

 

- 추가적으로 캐시는 저장 시간을 설정할 수 있다. 실제 작업환경에서 접속사 수나 여러가지를 고려해서 캐시 저장시간에 대해서도 측정해보면 좋을 것 같다.

 

 

 

'Trouble Shooting > DataBase' 카테고리의 다른 글

복합 인덱스 적용기  (1) 2023.10.11
Indexing 적용해 성능 개선  (0) 2023.07.09