2017-11-30 52 views
0

구아바 캐시 개체가 포함 된 두 개의 클래스와 세 번째 싱글 톤 클래스가 있습니다. 클래스 A에서이 캐시를 사용하여 get (key) 및 increment가 수행되고 호출 될 때 증가하고 3000/분의 속도로 호출됩니다. get (key)를 사용하여 클래스 B에이 값을 db에 추가하고 키에 대해 0을 넣습니다. A와 B 모두 한 번에 같은 값을 읽으면 문제가 발생할 수 있습니다. 예를 들어 key의 값이 12이고 두 값이 모두 12, B가 0으로 설정된 경우 A가 다시 13으로 설정합니다. 무엇을해야할까요? B.지도보기위한 대구아바 캐시와 같은 기능을 업데이트하도록 선택해야합니다.

+0

클래스 B는 15 분 간격으로 호출되어 추가됩니다. –

답변

1

사용

cache.asMap().compute(key, (k, v) -> v==null ? 1 : v+1) 

int[] result = {0}; 
cache.asMap().computeIfPresent(key, (k, v) -> { 
    result[0] = v; 
    return 0; // or null if you want to remove the entry 
}); 

키에 컴퓨팅 잠금 ConcurrentMap이다.

아마 캐시가 필요하지 않습니다. ConcurrentHashMap, AtomicLongMap 또는 (Xaerxess로 표시된) ConcurrentHashMultiset을 사용하는 것을 고려해보십시오. 마지막 선택은 아마도 멀티 세트가 계산을위한 것이기 때문에 최선일 것입니다.

+1

OP에 캐시가 필요 없다고 동의합니다. ['ConcurrentHashMultiset'] (https://google.github.io/guava/releases/23.0/api/docs/com/google/common/collect/)을 권하고 싶습니다. ConcurrentHashMultiset.html)을 AtomicLongMap보다 우선합니다. 왜냐하면 클래스 B가 수행하는 경우 (즉, "캐시"에서 제거하는 경우) 상자에서 값을 0으로 처리하기 때문입니다. – Xaerxess