====== Caffeine - java cache ====== * [[https://github.com/ben-manes/caffeine|Caffeine]] [[java:guava|Guava]]의 Cache를 대체하는 Java 8 용 캐시 * [[https://www.baeldung.com/java-caching-caffeine|Introduction to Caffeine | Baeldung]] ===== Eviction ===== * [[https://github.com/ben-manes/caffeine/wiki/Eviction|Eviction · ben-manes/caffeine Wiki]] ==== weakKeys() / weakValues() ==== * ''weakKeys()'' / ''weakValues()'' 설정을 사용하면 캐시 Key와 value가 ''Weak Reference''로 저장되고, 객체 reference가 없으면 JVM GC 대상으로 지정되게 된다. * 이 경우 key 와 value 모두가 GC 대상이다. * 그러나 **Key 를 비교할 때 ''equals()'' 메소드가 아니고 identity 비교(''=='')를 하게 된다.** * 이는 Key 역할을 하는 객체가 값이 같아도 reference 가 다르면 다른것으로 인식하게 되어 cache hit 가 안됨을 뜻한다. * ''AsyncCache'' 에서 **사용불가** LoadingCache graphs = Caffeine.newBuilder() .weakKeys() .weakValues() .build(key -> createExpensiveGraph(key)); ''weakKeys()''를 사용하려면 **Key 역할을 하는 객체의 레퍼런스도 캐시하던지 정적 상수로 만들던지 하는 식**으로 key 의 값이 동일하면 그 reference도 동일하게 처리해야만한다. ==== softValues() ==== LoadingCache graphs = Caffeine.newBuilder() .softValues() .build(key -> createExpensiveGraph(key)); * 캐시의 value ''SoftReference''로 GC 대상이 된다. * 값의 비교도 identity 비교(''=='') 를 사용한다. * 단, 문서에서는 ''SoftReference'' 가 JVM에서 메모리 상황에 따라 least-recently-used 방식으로 GC 대상으로 지정된다. ''SoftReference''는 성능에 영향을 줄 수 있어서 명시적으로 캐시 사이즈를 지정하는 것을 권장한다. * ''AsyncCache'' 에서 **사용불가**