1. 소개
이 기사에서는 고성능 자바 캐시 라이브러리 인 카페인을 살펴 보겠습니다.
캐시와 맵의 근본적인 차이점 중 하나는 캐시가 저장된 항목을 재활용 할 수 있다는 것입니다.
재활용 정책은 지정된 시간에 개체를 삭제하는 것입니다. 이 전략은 캐시 라이브러리의 중요한 기능인 캐시 적중률에 직접적인 영향을 미칩니다.
카페인은 Window Tinylfu 재활용 전략의 사용으로 인해 거의 최적의 적중률을 제공합니다.
2. 의존성
pom.xml에 카페인 의존성을 추가해야합니다.
<pectionency> <groupid> com.github.ben-manes.caffeine </groupid> <artifactid> 카페인 </artifactid> <버전> 2.5.5 </version> </fectionency>
Maven Central에서 최신 버전의 카페인을 찾을 수 있습니다.
3. 캐시를 채우십시오
카페인의 세 가지 캐시 충전 전략, 수동, 동기로드 및 비동기로드를 살펴 보겠습니다.
먼저 캐시에 저장 될 값 유형에 대한 클래스를 작성합니다.
클래스 dataObject {개인 최종 문자열 데이터; 개인 정적 int ObjectCounter = 0; // 표준 생성자/getters public static dataObject get (String data) {ObjectCounter ++; 새로운 DataObject (데이터)를 반환합니다. }}3.1. 수동 충전
이 전략에서는 값을 수동으로 검색하기 전에 캐시에 넣습니다.
캐시를 초기화합시다.
캐시 <문자열, dataObject> cache = caffeine.newbuilder () .expirjectwrite (1, timeUnit.minutes) .maxumsize (100) .build ();
이제 getifpresent 메소드를 사용하여 캐시에서 값을 얻을 수 있습니다. 이 값이 캐시에 존재하지 않으면이 메소드는 NULL을 반환합니다.
String key = "a"; dataObject dataObject = cache.getifPresent (key); AssertNull (dataObject);
풋 방법을 사용하여 캐시를 수동으로 채울 수 있습니다.
cache.put (key, dataObject); dataObject = cache.getifPresent (키); AssertNotnull (dataObject);
get 메소드를 사용하여 값을 얻을 수 있으며, 매개 변수 키가있는 함수를 매개 변수로 전달합니다. 캐시에 키가 존재하지 않으면 함수는 폴백 값을 제공하는 데 사용되며 계산 후 캐시에 삽입됩니다.
dataObject = cache .get (key, k-> dataObject.get ( "data for a")); AssertNotnull (dataObject); AsserTequals ( "데이터", dataObject.getData ());
Get 메소드는 원자 적으로 계산을 수행 할 수 있습니다. 이것은 여러 스레드가 동시에 값을 요청하더라도 한 번만 계산을 한 번만 수행한다는 것을 의미합니다. 이것이 Get을 사용하는 것이 getifpresent보다 낫습니다.
때로는 캐시 된 값을 수동으로 무효화해야합니다.
cache.invalidate (key); dataObject = cache.getifpresent (키); AssertNull (dataObject);
3.2. 동기 로딩
이 캐시로드 방법은 값을 초기화하는 데 사용되는 함수와 유사한 수동 전략과 함께 GET 메소드를 사용합니다. 그것을 사용하는 방법을 봅시다.
먼저 캐시를 초기화해야합니다.
LoadingCache <string, dataObject> cache = caffeine.newbuilder () .maxumsize (100) .expirjperterwrite (1, timeUnit.minutes) .build (k-> dataObject.get ( " + k));
이제 Get 메소드를 사용하여 값을 검색 할 수 있습니다.
dataObject dataObject = cache.get (키); AssertNotnull (dataObject); AsserTequals ( "" + 키 " + 키, dataObject.getData ());
getAll 메소드를 사용하여 일련의 값을 얻을 수 있습니다.
map <문자열, dataObject> dataObjectMap = cache.getall (arrays.aslist ( "a", "b", "c")); AsserTequals (3, dataObjectMap.size ());
기본 백엔드 초기화 함수에서 값을 빌드 방법으로 전달합니다. 이를 통해 액세스 값의 주요 외관으로 캐시를 사용할 수 있습니다.
3.3. 비동기 적재
이 정책은 이전과 동일한 작업을 수행하지만 작업을 비동기 적으로 수행하고 값을 포함하는 완전한 부품을 반환합니다.
AsyncloadingCache <string, dataObject> cache = caffeine.newbuilder () .MaxumSize (100) .expirjpecterWrite (1, timeUnit.minutes) .BuildAsync (k-> dataObject.get ( " + k));
우리는 완전한 문제를 반환한다는 점을 고려하여 같은 방식으로 Get and GetAll 방법을 사용할 수 있습니다.
문자열 키 = "A"; cache.get (key) .thenaccept (dataObject-> {assertNotnull (dataObject); AsserTequals ( " + key, dataObject.getData ());}); cache.getall (arrays.aslist ( "a", "b", "c")) .thenaccept (dataObjectMap-> AsserTequals (3, dataObjectMap.size ());CompletringFuture에는 많은 유용한 API가 있으며이 기사에서는 더 많은 것을 얻을 수 있습니다.
4. 가치 복구
카페인에는 크기 기반, 시간 기반 및 참조 기반의 세 가지 가치 복구 전략이 있습니다.
4.1. 크기를 기준으로 재활용
이 재활용 방법은 구성된 캐시 크기 제한이 초과 될 때 재활용이 발생한다고 가정합니다. 크기를 얻는 두 가지 방법이 있습니다. 캐시의 물체를 세거나 무게를 얻습니다.
캐시에서 객체를 계산하는 방법을 살펴 보겠습니다. 캐시가 초기화되면 크기는 0입니다.
LoadingCache <string, dataObject> cache = caffeine.newbuilder () .MaxumSize (1) .Build (k-> dataObject.get ( " + k)); AsserTequals (0, cache.estimatedSize ());
값을 추가하면 크기가 크게 증가합니다.
cache.get ( "a"); AsserTequals (1, cache.estimatedSize ());
두 번째 값을 캐시에 추가 할 수있어 첫 번째 값이 삭제됩니다.
cache.get ( "b"); cache.cleanup (); AsserTequals (1, cache.estimatedSize ());
캐시 크기를 얻기 전에 정리 방법을 호출합니다. 이는 캐시 재활용이 비동기식으로 실행되기 때문에이 접근법은 재활용이 완료 될 때까지 기다리는 데 도움이됩니다.
캐시 크기를 얻기 위해 계량기 기능을 전달할 수도 있습니다.
로드 카시 <문자열, dataObject> cache = caffeine.newbuilder () .maxumweight (10) .wigher ((k, v) -> 5) .build (k-> dataObject.get ( " + k)); AsserTequals (0, cache.estimatedSize ()); cache.get ( "a"); AsserTequals (1, cache.estimatedSize ()); cache.get ( "b"); AsserTequals (2, cache.estimatedSize ());
무게가 10을 초과하면 값이 캐시에서 삭제됩니다.
cache.get ( "c"); cache.cleanup (); AsserTequals (2, cache.estimatedSize ());
4.2. 시간 복구에 따라
이 재활용 전략은 항목의 만료 시간을 기준으로하며 세 가지 유형이 있습니다.
expirtaccess 메소드를 사용하여 접근 후 만료 정책을 구성하겠습니다.
LoadingCache <string, dataObject> cache = caffeine.newbuilder () .expirteRaccess (5, timeUnit.minutes) .build (k-> dataObject.get ( " + k));
게시 후 만료 정책을 구성하기 위해 ExpirtterWrite 방법을 사용합니다.
cache = caffeine.newbuilder () .expirtterwrite (10, timeUnit.seconds) .weakkeys () .weakValues () .build (k-> dataObject.get ( " + k)의 데이터));
사용자 지정 정책을 초기화하려면 만료 인터페이스를 구현해야합니다.
CACHE = CAFFEINE.NEWBUILDER (). 만료 (새로운 만료 <문자열, dataObject> () {@Override public long expirecreate (문자열 키, dataObject value, long arresttime) {return value.getData (). longth () * 1000; @override public value, long renter expriprefterupupdate). CurrentDuration; @Override Public Long ExpirTeRead (String key, dataObject value, Long CurrentDuration) {return currentDuration}).4.3. 참조에 따라 재활용
캐시 된 키 값의 쓰레기 수집을 활성화하기 위해 캐시를 구성 할 수 있습니다. 이를 위해 키와 값을 약한 참조로 구성하고 쓰레기 수집에 대한 소프트 참조 만 구성 할 수 있습니다.
객체에 대한 강한 언급이 없으면 약점을 사용하면 쓰레기를 수집 할 수 있습니다. SoftReference는 JVM의 전 세계적으로 최소한 사용 된 정책을 기반으로 객체가 쓰레기 수집을 허용합니다. Java 인용에 대한 자세한 내용은 여기를 참조하십시오.
Caffeine.weakkeys (), Caffeine.weakValues () 및 Caffeine.softValues ()를 사용하여 각 옵션을 활성화해야합니다.
로드 카시 <문자열, dataObject> cache = caffeine.newbuilder () .expirjperwrite (10, timeUnit.seconds) .weakkeys () .weakValues () .build (k-> dataObject.get ( " + k)); cache = caffeine.newbuilder () .expirtterwrite (10, timeUnit.seconds) .softValues () .build (k-> dataObject.get ( " + k));
5. 새로 고침
정의 된 기간 후에 항목을 자동으로 새로 고치도록 캐시를 구성 할 수 있습니다. ComphriphterWrite 메소드를 사용하는 방법을 살펴 보겠습니다.
caffeine.newbuilder () .refreshafterwrite (1, timeUnit.minutes) .build (k-> dataObject.get ( " + k));
여기서 우리는 이후와 새로 고침의 차이점을 이해해야합니다. 만료 된 항목이 요청되면 빌드 함수가 새 값을 계산할 때까지 실행이 차단됩니다.
그러나 항목을 새로 고칠 수 있으면 캐시는 이전 값을 반환하고 값을 비동기 적으로 다시로드합니다.
6. 통계
카페인은 캐시 사용을 기록하는 방법이 있습니다.
LoadingCache <string, dataObject> cache = caffeine.newbuilder () .MaxumSize (100) .recordStats () .build (k-> dataObject.get ( " + k)); cache.get ("a "); cache.get ("a "); AsserTequals (1, cache.stats (). hitCount ()); AsserTequals (1, cache.stats (). misscount ());또한 RecordStats 공급 업체를 통과하여 Statscounter의 구현을 만들 수 있습니다. 이 객체는 모든 통계 관련 변경으로 밀려납니다.
7. 결론
이 기사에서는 Java의 카페인 캐시 라이브러리에 익숙합니다. 캐시를 구성하고 채우는 방법과 요구에 따라 적절한 만료 또는 새로 고침 정책을 선택하는 방법을 보았습니다.
이 기사의 예제 소스 코드는 Github에서 찾을 수 있습니다.
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.