- 프로젝트에 CaffeineCache를 적용해보았다.
- 캐시 설정을 한 곳에서 관리하기 위해 CacheType을 enum으로 선언하였다.
enum class CacheType(
val cacheName: String,
val capacity: Int,
val maximumSize: Long,
val expireTime: Long
) {
DEFAULT(CacheConstant.DEFAULT, 100, 500L, 60L)
}
- 각 설정에 대한 의미는 아래와 같다
- initalCapacity : 캐시 초기 크기, 캐시된 데이터가 증가하면 캐시 크기를 증가시키는 조정이 필요하다
- maximumSize : 캐시 최대 크기, 데이터가 maximumSize를 넘어서면 캐시 제거 정책에 따라 기존 데이터를 제거한다
- expireTime: 캐시 만료 시간(Time based eviction policy 사용 시 설정)
- 캐시 설정은 아래와 같이 빈으로 생성한다
@Configuration
@EnableCaching
class CacheConfig {
@Bean
fun cacheManager(): CacheManager {
val caches = CacheType.entries.map { cache ->
CaffeineCache(
cache.cacheName,
Caffeine.newBuilder()
.initialCapacity(cache.capacity)
.expireAfterAccess(cache.expireTime, TimeUnit.SECONDS)
.evictionListener<Any, Any>{key, _, cause -> println("cache eviction! $key :: $cause")}
.maximumSize(cache.maximumSize)
.build()
)
}
val cacheManager = SimpleCacheManager()
cacheManager.setCaches(caches)
return cacheManager
}
}
- cache 생성 시 eviction 정책을 설정할 수 있다. 정책에는 size-based, time-based, reference-based가 있다.
- size-based : 크기 기반 정책, 캐시 사이즈가 maximumSize로 설정한 크기 이상이 될 때 eviction을 수행한다
- Time-based : 캐시 만료기준을 지정하고 기준에 따라 캐시를 삭제한다. 기준은 expire-after-access, expire-after-write, custom-policy가 있다.
- Reference-based : WeakReference를 이용해 Strong Referece가 없는 캐시의 key나 value를 삭제할 수 있도록 한다
- evictionListerner를 설정해서 캐시의 삭제여부를 로깅할 수도 있다
baeldun 참고자료