1

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

基本番石榴缓存接口只有这样说cleanUp()

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

CacheBuilder()说:

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

如果请求了weakKeys、weakValues 或softValues,则缓存中存在的键或值可能会被垃圾收集器回收。在每次缓存修改、偶尔的缓存访问或调用 Cache.cleanUp() 时,可能会从缓存中删除具有回收键或值的条目;此类条目可能会计入 Cache.size(),但对于读取或写入操作将永远不可见。

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

所以 cleanUp 可能会或可能不会做任何事情,并且它可能会或可能不会对被调用有任何好处。但据我所知,LocalCache.cleanUp()方法做了一些事情,但我只是没有遵循什么。从广义上讲,LoadingCache 什么时候应该调用 cleanup()?

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

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

4

0 回答 0