何时应该使用expireAfterWrite设置的Guava LoadingCache调用cleanUp()?

时间:2015-08-18 04:18:56

标签: java caching garbage-collection guava evict

这似乎是我自己发现的一件简单的事情,但我在这里。

基本的Guava缓存接口只能说明cleanUp()

  

void cleanUp()
  执行缓存所需的任何挂起的维护操作。究竟执行哪些活动 - 如果有的话 - 取决于实现。

CacheBuilder()说:

  

如果请求expireAfterWrite或expireAfterAccess,则可能会在每次缓存修改,偶尔的缓存访问或对Cache.cleanUp()的调用时逐出条目。过期的条目可能由Cache.size()计数,但读取或写入操作永远不可见。

     

如果请求weakKeys,weakValues或softValues,则垃圾收集器可以回收缓存中存在的密钥或值。具有回收键或值的条目可以在每次高速缓存修改,偶尔的高速缓存访​​问或对Cache.cleanUp()的调用时从高速缓存中删除;这些条目可以在Cache.size()中计算,但在读取或写入操作中永远不可见。

     

某些缓存配置将导致在写操作期间或在没有写入的情况下偶尔执行读操作期间执行的定期维护任务的累积。返回的高速缓存的Cache.cleanUp()方法也将执行维护,但使用高吞吐量高速缓存不需要调用它。只有使用removeListener,expireAfterWrite,expireAfterAccess,weakKeys,weakValues或softValues构建的缓存才会执行定期维护。

所以cleanUp可能会或可能不会做任何事情,它可能会或可能没有任何好处被召唤。但据我所知,LocalCache.cleanUp()方法可以某些,但我只是没有遵循什么。 广泛地说,什么时候LoadingCache应该有cleanup()调用?

注意:我链接到cleanUp的LocalCache引用,因为当我在Guava 18中的CacheBuilder上调用.load()时,调试器所说的实例化了。

具体,我的用例是标准数据库支持的加载缓存。我们被要求公开在某些数据库记录更改或被删除且有效期不够快的情况下擦除某些缓存的能力。我们采用了快速而肮脏的方法,并允许使用invalidateAll()清除可疑缓存。我们之后应该致电cleanUp()吗?为什么或为什么不呢?

0 个答案:

没有答案