2016-12-19 5 views
0

일부 데이터 요소를지도에 저장할 수있는 간단한 캐시를 만들려고합니다. 이 데이터를 ~ 16 시간 정도 보관해야합니다. 이후에 오래된 항목이 만료되도록 할 수 있습니다. 나는 로딩 캐시를 인스턴스화하고있다 :Guava CacheBuilder가 예정보다 앞서 항목을 내 보냅니다.

cache = CacheBuilder.newBuilder() 
       .concurrencyLevel(4) 
       .weakKeys() 
       .expireAfterWrite(16, TimeUnit.HOURS) 
       .build(
         new CacheLoader<K, V>() { 
          public V load(K key) throws Exception { 
           return getByKey(key); 
          } 
         }); 

매분마다 ~ 16 개의 항목을 추가하는 프로세스가있다. 12 분마다 캐시가 완전히 지워집니다. 나는 expireAfterWrite()에 설정된 시간보다 훨씬 앞서 캐시를 지우는 것으로 인해 당황 스럽다.

+0

네, 분명히 'weakKeys()'일 것 같습니다. 당신이 그것을 사용했을 때 당신은 무엇을 염두에 두었습니까? –

답변

3

내 생각 엔 weakKeys()입니다. 캐시가 항목을 참조하는 유일한 것이면 가비지 콜렉션이 항목을 삭제하기로 결정할 수 있습니다. 구아바 문서에서 :

weakKeys, weakValues ​​또는 softValues가 요청되면 캐시에있는 키 또는 값을 가비지 수집기에서 회수 할 수 있습니다.