2012-11-09 1 views
0

을 설정하는 경우 무효화 즉시 항목을 무효화하지 않습니다구아바 CacheLoader - expireAfterWrite 및 expireAfterAccess 모두 예를 들면 그래서

CacheBuilder.newBuilder() 
      .maximumSize(1000) 
      .expireAfterAccess(1, TimeUnit.MINUTES) 
      .expireAfterWrite(1, TimeUnit.MINUTES) 
      .build(new CacheLoader<String, Object>() { 
       @Override 
       public Object load (String key) { 
        return ...; 
       } 
      }); 

반환 된 인스턴스에서 invalidate(key)를 호출하면, getUnchecked()에 대한 후속 호출은 항상 때까지 이전 값을 사용할 경우 적어도 1 분이 지났으므로 load(key)으로 다시 전화 할 것입니다. invalidate() 바로 뒤에 cleanUp()로 전화하면 아무런 효과가없는 것으로 보입니다.

이 기능을 잘못 사용하고 있거나 캐싱이 작동하는 방식에 대해 이해하고 있습니까?

http://code.google.com/p/guava-libraries/wiki/CachesExplained 당 :. "

언제든지 명시 적으로 오히려 퇴거 할 항목을 기다리지 않고 캐시 항목이 무효화 될 수 있습니다이 작업을 수행 할 수 있습니다

을 개별적으로 Cache.invalidate을 사용 (키) "

나는 시간 미만 1 MINU 경우에도) 무효화 호출이 우선하며 항상 항목이 퇴거 (즉, 바로 다음 getUnchecked 호출을받을 수 있도록 것이라고 생각할 겁니다 테.

편집 :: 나는 내 문제를 파악했습니다. 위의 관찰은 참으로 사실이며 캐시의 예상되는 특성입니다. 그러나, 내가 정말로 invalidateAll()을 호출 할 때 (항상 무효화하는) 매개 변수없이 invalidateAll()을 호출해야 할 때 빈 목록 (무효화되지 않음)을 사용하여 invalidateAll ([])을 호출하는 것이 문제였습니다. invalideAll ([])이 invalidateAll()과 동등 할 것이라고 거의 예상 할 수 있지만, 어디에서 혼란을 겪을 수 있는지 알 수있었습니다.

답변

3

... 당신의 기대 또는 관찰 내용을 설명하고 있는지 확실하지 않지만 invalidate은 즉시 다른 항목을 기다리지 않고 항목을 삭제해야하며 매우 큰 그 키에 대한 다음 쿼리. 그게 무슨 일이 아니야, 그때 그것은 버그 야.

+0

실제 응용 프로그램 수준의 결함이며 LoadingCache를 비난하기에는 너무 빠르다고 생각합니다. 더 많은 테스트를 수행 할 것입니다. – GreenieMeanie

관련 문제