성능향상을 위해 캐시를 적용한 과정과 성능 테스트한 결과를 작성한 글입니다.
Index
- 어떤 캐시를 사용했는가?
- 어플리케이션 적용한 곳 ?
- 적용했을 때의 코드 작성 및 캐시 설정 이유
- 성능측정 결과
#### Cache 설정 config
<cache
name="productCache"
maxEntriesLocalHeap="10000"
maxEntriesLocalDisk="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LFU"/>
<cache
name="productDetailCache"
maxEntriesLocalHeap="10000"
maxEntriesLocalDisk="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LFU"/>
<cache
name="optionDetailCache"
maxEntriesLocalHeap="10000"
maxEntriesLocalDisk="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LFU"/>
//ProductFacadeService.java
@Cacheable(cacheNames = CacheString.PRODUCT_CACHE, key = "#pageable.getPageNumber" + "-"+"#pageable.getPageSize")
@Transactional(readOnly = true)
public Page<ProductViewDto> getProductList(Pageable pageable) {
assert (pageable != null);
Page<ProductDto> productList = productService.getProductList(pageable);
List<ProductViewDto> productViewDtoList = productList.stream().map(productMapper::changeToProductViewDto).collect(Collectors.toList());
return new PageImpl<>(productViewDtoList, pageable, productList.getTotalElements());
}
//ProductService.java
@CacheEvict(value = CacheString.PRODUCT_CACHE, allEntries = true)
public Product register(ProductDto productDto) {
assert (productDto != null);
Product product = mapper.changeToProduct(productDto);
return productRepository.save(product);
}
//ProductService.java
@CacheEvict(value = CacheString.PRODUCT_CACHE, allEntries = true)
public Product updateProduct(ProductDto productDto) {
assert (productDto != null);
assert (productDto.getId() != null);
Product product = productRepository.findById(productDto.getId()).orElseThrow(InvalidArgumentException::new);
product.updateData(productDto.getName(), productDto.getCategory(), productDto.getPrice());
return product;
}
측정시나리오
결과
TPS: 13k
상위 99% 처리시간: 7ms
TPS : 700
상위 99% 처리시간: 132ms
TPS : 2.4k
상위 99% 처리시간: 399ms
(처리시간의 대부분을 insert 시간을 db쿼리에 사용함)