2014-03-12 3 views
0

구아바 캐시가 처음이며 몇 가지 조언을 구합니다.구아바 캐시의 키 선택

일부 계산을 담당하는 클래스 인 "함수"를 캐시하고 싶습니다. 각 클래스에는 3 개의 double 속성이 있습니다. 시작, 최대, 증분

캐시에 저장할 키를 만드는 가장 좋은 방법은 무엇입니까? 어쩌면 복잡한 대상일까요?

나는 Hasher를 사용하는 것에 대해 생각하고 있었지만 복잡한 객체의 경우 동일한 해시가 동일한 객체를 의미하지는 않습니다. 따라서 key-> value는 고유하지 않습니다.

또한 캐시는 키를 어떻게 찾습니까? 동일한 키를 전달하는 키에 2 개의 객체를 사용하면 Cache는이 객체를 고유 키로 간주합니다. key1 == key2를 기반으로 작동합니까?

public static void testGuavaCache() { 
    Cache<Object, String> CACHE = CacheBuilder.newBuilder().weakKeys().weakValues().build(); 

    for (int i = 0; i < 2; i++) { 
     Joiner joiner = Joiner.on('|'); 
     String key1 = joiner.join(i, i, i, i, i, i, i); 

     for (int j = 0; j < 2; j++) { 
      String key = joiner.join(i, i, i, i, i, i, i); 
      System.out.println(key1.equals(key)); 
      System.out.println(key1 == key); 
      try { 
       String m = CACHE.get(key, new Callable<String>() { 
        @Override 
        public String call() throws Exception { 
         return "test"; 
        } 
       }); 

       System.out.println("Size = " + CACHE.size()); 

      } catch (ExecutionException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

출력된다 :

true 
false 
Size = 1 
true 
false 
Size = 2 
true 
false 
Size = 3 
true 
false 
Size = 4 

weakKeys 분리()는 문제를 해결한다. 예상 되나요?

+0

개체를 만들 때 비용이 많이 듭니까? 그렇지 않다면 캐싱을 잊어 버리고 필요에 따라 다시 작성하십시오. – maaartinus

답변

2

weakKeys에 대한 문서를 읽어

경고 :이 방법을 사용하는 경우, 결과 캐시 키의 평등을 결정하는 정체성 (==) 비교를 사용합니다.

는 그래서 그래, 당신은 weakKeys 사용을 중지해야하며, 또한 적절한 값 객체를 가지는 대신 String에 함께 일을 연결 해제 아마 더 좋을 것 같아.

+0

고맙습니다. 대답은 RTFM입니다 :) – YaRiK

-1

인수가 문자열 인 경우 함수에 대한 모든 인수를 구분 기호로 연결하십시오. 이렇게하면 결과가 고유하게 정의됩니다. 인수가 숫자 또는 둘 모두의 조합 인 경우이를 ByteBuffer로 인코딩하고 해시 코드를 키로 사용하여 메모리를 절약 할 수 있습니다. 인수 데이터가 큰 경우 (아마도 +32 바이트) MD5와 같은 다이제스트 알고리즘을 사용하여 키를 인코딩하고 그 결과를 키로 사용할 수 있습니다. 이 경우 캐시 된 결과를 계산하는 것과는 달리 다이제스트를 생성하는 데 드는 처리 비용을 비교해야합니다.