Spring Cache (2) - Provider 비교 및 구현

Casper·2023년 8월 17일
0

Spring Cache

목록 보기
2/2
post-thumbnail

Cache Evict 전략

Cache Provider를 소개하기 앞서
캐시 저장 공간은 제한적이기 때문에 각 Provider는 서로 다른 기존의 캐시 제거 전략을 갖고 있습니다.
대표적인 전략은 아래 표와 같으며 각 캐시 구현체는 필요에 따라 각 전략을 혼합하고 커스터마이징 하여 캐시를 관리합니다.

전략명설명
LRU (Least Recently Used)캐시가 적중된 지 가장 오래된 캐시를 제거합니다
FIFO (First In First Out)가장 먼저 생성된 캐시를 제거합니다
FILO (First In Last Out)가장 최근에 생성된 캐시를 제거합니다
LFU (Least Frequently Used)적중 빈도가 가장 낮은 캐시를 제거합니다
Time Based Eviction일정시간 적중되지 않은 캐시를 제거합니다

Cache Provider

Spring에서 사용 가능한 대표적인 Cache Provider 목록과 상세 정보는 아래 표와 같습니다.

이름캐시저장위치TTL 여부비고
ConcurrentMapCacheLocalO1.Spring Boot의 기본 캐시 구현체 중 하나
2.기본적으로 자바의 ConcurrentHashMap을 사용하여 캐시를 관리
CaffeineLocalO1.캐시 크기를 설정,제한 가능
2.애플리케이션 요구 사항에 따라 자동으로 캐시 관리를 해주어 고성능 제공
EhcacheLocal and DistributedO1.기본적으로는 Local 캐시이지만 필요에 따라 분산환경 지원 가능(Terracota)
InfinispanLocal and DistributedO1.여러 노드에 분산하여 저장하고 공유할 수 있는 분산 데이터 그리드를 제공으로 고가용성과 확장성을 달성
RedisLocal and DistributedO1.다양한 데이터 타입을 지원하며, 문자열, 리스트, 해시맵, 집합, 정렬된 집합 등 다양한 데이터 구조를 저장하고 처리할 수 있습니다.
2.필요시 분산환경 지원 및 디스크 저장 가능
3.ub/Sub(Publish/Subscribe) 메시징 시스템을 내장하고 있어, 메시지 기반 통신을 지원하며, 실시간 이벤트 처리 및 푸시 알림에 유용

Benchmarks

캐시 구현체들의 성능 비교입니다. (MacBook Pro i7-4870HQ CPU @ 2.50GHz(4코어) 16GB Yosemite에서 실행)

1. 계산

캐시는 제한이 없고 완전히 채워져 있으며 결과는 상수를 반환한다고 가정합니다.
항목이 있을 때 잠금으로 인한 오버헤드를 보여줍니다.

2. 읽기(100%)

최대 크기로 구성된 캐시에서 동시에 8개의 스레드를 읽습니다.

3. 읽기(75%) / 쓰기(25%)

6개의 스레드는 최대 크기로 구성된 캐시 에서 동시에 읽고 2개의 스레드는 캐시에 씁니다.

4. 쓰기(100%)

8개의 스레드는 최대 크기로 구성된 캐시에 동시에 씁니다.

Spring Configuration (Caffeine)

대부분의 벤치마크에서 좋은 성능을 보여주는 Caffeine을 간단히 설정하는 방법을 알아보겠습니다.

의존성

<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
    <groupId>com.github.ben-manes.caffeine</groupId>
    <artifactId>caffeine</artifactId>
    <version>3.1.1</version>
</dependency>

Configuration

@Bean
public Caffeine<Object, Object> caffeineConfig() {
	return Caffeine.newBuilder()
		.expireAfterWrite(300, TimeUnit.SECONDS)
		.initialCapacity(10);
}

@Bean
public CacheManager cacheManager(Caffeine caffeine) {
   CaffeineCacheManager caffeineCacheManager = new CaffeineCacheManager();
   caffeineCacheManager.setCaffeine(caffeine);
   return caffeineCacheManager;
}

위와 같은 간단한 설정만으로도 1부에서 설명드린 어노테이션을 사용하며 캐시를 구성할 수 있으며
stats (통계 활성화 여부), asynchronous (비동기 캐싱), cache-null-values(null 저장 여부) 등의 프로젝트에 맞는 추가 설정 또한 가능합니다.
자세한 사항은 Github 에서 확인 가능합니다.

profile
Emotional Developer

0개의 댓글