2012-11-09 17 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)。拨打cleanUp()invalidate()似乎也没有效果。

我是否正确使用此功能或不理解缓存的工作原理?

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

“在任何时候,你可以明确地无效缓存条目,而不是等待条目被拆迁户可以这样做:

单独使用Cache.invalidate(关键)“

我会假设对invalidate的调用将优先,并且总是使条目有资格驱逐(即,下一次getUnchecked调用),即使时间少于1 minu TE。

编辑::我想通了我的问题。上述观察确实是真实的,并且是缓存的预期性质。然而,我的具体问题是,当我真的需要在不带任何参数的情况下调用invalidateAll()(这会使所有内容无效)时,我有时会调用invalidateAll([])一个空List(它不会使任何内容无效)。我几乎期望invalideAll([])等价于invalidateAll(),但我可以看到哪里会导致一些混淆。

回答

3

......我不清楚你是在描述你的期望还是你的观察,但invalidate应该立即删除条目 - 而不是等待另一个查询 - 并且应该强制值重新加载接下来查询该密钥。如果这不是什么情况,那么这是一个错误。

+0

我认为这是一个实际的应用程序级别的缺陷,我可能太快责怪LoadingCache ...会做更多的测试。 – GreenieMeanie