반응형
캐시(cache}
Cache는 나중에 요청올 결과를 미리 저장해두었다가 빠르게 서비스를 해주는 것을 의미한다.
자주 사용되는 기능을 cache를 이용해서 제공하면 향상된 성능 효과를 볼 수 있다.
Memory Hierarchy
- Capacity(공간 사용) : core -> L1 cache -> L2 cache -> L3 cache -> Memory -> Disk
- Latency(지연 시간) : Disk -> Memory -> L3 cache -> L2 cache -> L1 cache -> core
Cache 사용하는 곳
- 사용빈도가 높은 단순 반복 작업
- 결과가 자주 변경되지 않는 데이터
ehcache 설정
build.gradle
// ehcache
implementation 'org.springframework.boot:spring-boot-starter-cache'
implementation 'net.sf.ehcache:ehcache:2.10.6'
- spring-boot-starter-cache
- 캐시관련 설정을 편리하게 지원해주는 패키지, CacheManager, EhCacheManagerFactoryBean 지원
- 기본 CacheManager로 ConcurrentHashMap 사용
- ehcache
- 기본 CacheManager로 ConcurrentHashMap에서 Ehcache 교체하기 위해 의존성 추가
ehcache.xml 설정
<ehcache>
<diskStore path="java.io.tmpdir"/>
<defaultCache
maxEntriesLocalHeap="10000"
maxEntriesLocalDisk="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU"/>
<cache name="promotionCache"
maxEntriesLocalHeap="100000"
maxEntriesLocalDisk="100000"
eternal="false"
timeToIdleSeconds="0"
timeToLiveSeconds="3600"
overflowToDisk="false"
diskPersistent="false"
diskExpiryThreadIntervalSeconds="3600"
memoryStoreEvictionPolicy="LRU"/>
</ehcache>
<defaultCache>
태그- 소스안의 모든 캐시에 대한 정보를 저장하면 필수적으로 필요
- 각 캐시별로 저장한다면 필요 없음
<cache>
태그- 각 캐시마다 필요한 태그로 분류해서 관리하는 목적
- 설정 옵션
옵션 | 설명 | 기본값 |
---|---|---|
maxEntriesLocalHeap | 메모리에 생성될 최대 객체 갯수 | 0 |
maxEntriesLocalDisk | 디스크에 생성될 최대 객체 갯수 | 0 |
eternal | 저장될 캐시 삭제 설정 true로 설정 시 timeToIdleSeconds, timeToLiveSeconds 설정 무시됨 | false |
timeToIdleSeconds | 해당 초가 지나면 캐시 삭제 | 0 |
timeToLiveSeconds | 해당 초 동안 캐시가 사용되지 않으면 캐시 삭제 | 0 |
overflowToDisk | 오버플로우된 항목에 대해 disk에 저장할 지 여부 | false |
diskPersistent | 캐시를 disk에 저장하여, 서버 로드 시 캐시를 | false |
diskExpiryThreadIntervalSeconds | Disk Expiry 스레드의 작업 수행 간격 | 0 |
memoryStoreEvictionPolicy | 객체 갯수가 maxEntriesLocalHeap에 도달하면 객체를 제거하고 새로 추가하는 정책 | LRU |
memoryStoreEvictionPolicy
- LRU(Least Recently Used) : 가장 오랫동안 호출되지 않은 캐시를 삭제
- LFU(Least Frequently Used) : 호출 빈도가 가장 적은 캐시를 삭제
- FIFO(First In First Out) : 캐시가 생성된 순서대로 가장 오래된 캐시를 삭제
configuration
@Configuration
public class CacheConfiguration {
@Bean
public EhCacheManagerFactoryBean ehCacheManagerFactory() {
EhCacheManagerFactoryBean cacheManagerFactoryBean = new EhCacheManagerFactoryBean();
cacheManagerFactoryBean.setConfigLocation(new ClassPathResource("ehcache.xml"));
cacheManagerFactoryBean.setShared(true);
return cacheManagerFactoryBean;
}
@Bean
public EhCacheCacheManager ehCacheCacheManager() {
EhCacheCacheManager cacheManager = new EhCacheCacheManager();
cacheManager.setCacheManager(ehCacheManagerFactory().getObject());
cacheManager.setTransactionAware(true);
return cacheManager;
}
}
사용할 service의 추가
@Cacheable(cacheNames = "promotionCache", key = "#request.itmeId")
public Response getItem(Request request)
- @Cacheable(cacheNames = "promotionCache", key = "#request.accountNum")
- ehcache.xml에서 지정한 promotionCache 캐시를 사용하겠다는 의미이다.
- 여기서 key는 메소드 argument인 request.itemId 사용하겠다는 의미이다.
- request.itemId에 따라 별도로 캐시한다는 의미이다.
- promotionCache 메소드의 argument에 따라 캐시되기 때문에 request.itemId의 캐시 여부를 체크한다.
- 캐시 안되어 있을 경우 캐시를 하고, 있으면 캐시 내용을 전달한다.
반응형
'프로그래밍이야기 > Spring' 카테고리의 다른 글
[Chaos Engineering] CM4SB 적용 내용 정리 (0) | 2022.02.13 |
---|---|
[Chaos Engineering] 개념 정리 (0) | 2022.02.13 |
Spring Boot Cache 적용 (0) | 2022.01.30 |
[Spring Boot] 지원 버전 확인하기 (0) | 2022.01.23 |
[Spring WebFlux] Timeout on Mono blocking read 해결 (0) | 2021.11.10 |
댓글