-
Notifications
You must be signed in to change notification settings - Fork 0
성능 테스트(Redis 적용)
KIYUN KIM edited this page Apr 5, 2022
·
3 revisions
JMeter를 이용해 성능테스트를 해본 결과 메인페이지나 상세페이지 같은 주요 페이지에서 많은 데이터를 조회해 오다 보니 성능 이슈가 있었습니다. 그래서 최적화 과정이 반드시 필요했고 그중 하나로 데이터를 가져올때 매번 데이터베이스를 접근할 필요 없이 메모리 영역에서 빠른속도로 데이터를 가져올 수 있는 캐시를 적용하기로 했습니다.
두 저장소 모두 key-value 방식의 인메모리 방식으로 문법적으로 사용하기 쉽고 1ms 이하의 응답시간을 제공하여 디스크 기반의 데이터베이스보다 빠르게 데이터를 읽을 수 있지만 String 뿐만 아니라 List, Set, Hash 등 다양한 데이터 구조를 저장할 수 있고 돌발 상황 발생 시 데이터를 복구 할수 있는 Redis를 사용하기로 결정하였습니다.
- 캐시가 필요하다고 판단되는 페이지에 @Cacheable 어노테이션을 추가해 Redis 저장소에 저장
@Transactional(readOnly = true)
// 첫 조회때 interest 파라미터가 null이 아니면 interest를 키값으로 캐싱
@Cacheable(value="mainByInterest", key="#interest",condition="#interest != null")
public MainResponseDto mostPopularArtWork(Long accountId, String interest) {
if (accountId != 0) {
List<ArtworkMain> artWorkList = getArtworkList(interest);
List<TopArtist> topArtist = getTopArtist();
isFollow(accountId,topArtist);
return MainResponseDto.builder().artwork(artWorkList).top_artist(topArtist).build();
}
List<ArtworkMain> artworkList = getArtworkList("");
List<TopArtist> topArtist = getTopArtist();
return MainResponseDto.builder().artwork(artworkList).top_artist(topArtist).build();
}
- 캐시에 저장된 데이터가 변경되었을때 @CacheEvict 어노테이션을 추가하여 캐시를 삭제하고 새롭게 DB에서 조회
@Transactional
// 데이터가 삭제될때 키값이 category(interest)인 캐시를 삭제
@CacheEvict(value="mainByInterest", key="#category")
public void deleteArtwork(Long accountId, Long artworkId, String category) {
ArtWorks artWorks = artworkValidation(accountId, artworkId);
List<ArtWorkImage> artWorkImages = artWorkImageRepository.findByArtWorksId(artWorks.getId());
artWorkImages.forEach((img) -> {
fileProcessService.deleteImage(img.getArtworkImg());
});
artWorkImageRepository.deleteAllByArtWorksId(artworkId);
artWorkLikesRepository.deleteAllByArtWorksId(artworkId);
artWorkBookMarkRepository.deleteAllByArtWorksId(artworkId);
artWorkCommentRepository.deleteAllByArtWorksId(artworkId);
artWorkRepository.delete(artWorks);
}
- 캐시 적용 전 JMeter 결과
- 캐시 적용 후 JMeter 결과
유저 수, 시간, 루프카운트를 각각 500, 1, 100으로 놓고 테스트한 결과 캐시를 적용한 마이페이지와 페인페이지에서 유의미한 성능 개선이 있음을 확인하였습니다.
https://kukekyakya.tistory.com/11
https://chrisjune-13837.medium.com/redis-vs-memcached-10e796ddd717