본문 바로가기

개발/Spring

[Spring] Caffeine Cache 적용

 

의존성 추가

implementation 'com.github.ben-manes.caffeine:caffeine'

 

caffeine 적용 후 확인

System.out.println("cacheManager bean = " + cacheManager.getClass().getName());
// org.springframework.cache.caffeine.CaffeineCacheManager

 

 

간단하게 읽고 쓰고, 변경되면 제거하는 설정도 해주어서 따로 스케줄러로 관리는 하지 않으려고 한다. 최대 크기는 설정하고 싶어서 config를 추가했다.

@Configuration
@EnableCaching
public class CacheConfig {

    @Bean
    public CaffeineCacheManager caffeineCacheManager() {
        CaffeineCacheManager cacheManager = new CaffeineCacheManager();
        cacheManager.setCaffeine(Caffeine.newBuilder()
                .expireAfterAccess(10, TimeUnit.MINUTES) // 10분 후 만료
                .maximumSize(1000)); // 최대 1000개 저장
        return cacheManager;
    }
}

 

Cache Eviction 전략 두 가지

 

1. sized-based

최대 크기나 무게 제한을 설정하면 접근 빈도나 최근 접근한 시점에 따라 제거

.maximumSize(1000) // 항목 당 최대 캐시 개수
.maximumWeight(1000) // 총 무게 기준
  • maximumSize()maximumWeight()은 함께 사용할 수 없음

 

2. time-based

저장/교체, 마지막 접근 시간을 기준으로 만료

.expiresAfterWrite(10, TimeUnit.MINUTES) // 저장/교체한 시간 기준
.expireAfterAccess(10, TimeUnit.MINUTES) // 저장/교체, 마지막 접근 시간 기준
  • 만료 시간이 되었다고 바로 제거가 되지 않고 이벤트(읽기, 쓰기, 교체 등) 이벤트가 발생할 때 제거 → 세세한 메모리 관리가 필요하다면 제거 스케줄러 이용

 

참조 옵션

weakKeys(), weakValues(), softValues() 모두 GC(가비지 컬렉터)에 의해 회수될 수 있다. 회수된 캐시는 수정, 접근 또는 Cache.cleanUp을 호출할 때 제거된다. Cache.estimatedSize()에서 계산될 수 있지만 읽기/쓰기는 불가능 하다.

 

1. 약한 참조 WeakReference

  • GC가 필요하다고 판단하면 즉시 수거
  • 메모리가 부족하지 않아도 GC가 바로 제거 가능

2. 소프트 참조 SoftReference

  • 메모리가 부족할 때만 GC가 수거

번외. 강한 참조 StrongReference

  • 우리가 일반적으로 사용하는 참조 방식
  • 해당 객체가 참조되는 한 GC가 수거하지 않음

 

참고

https://velog.io/@sexywoong/Caffeine-Cache