java – google guava缓存invalidateAll()和cleanUp()之间的区别

假设我有一个像这样定义的Cache

 private static Cache alertsUIDCache = CacheBuilder.newBuilder(). expireAfterAccess(60).build(); 

从我读到的内容 (如果我错了请纠正我):

如果在0:00将值写入Cache ,则应在60秒后将其移至“准备被驱逐”状态。 实际从Cache删除值将在下一次缓存修改时发生( 缓存修改究竟是什么?)。 是对的吗?

另外,我不确定invalidateAll()cleanUp()方法之间有什么区别,有人可以提供解释吗?

第一部分来自此链接: Guava如何使其CacheBuilder中的条目到期?

我将重点关注expireAfterAccess ,但expireAfterWrite的过程几乎完全相同。 就机制而言,当您在CacheBuilder中指定expireAfterAccess时,缓存的每个段都按照从最近访问到最近访问的顺序维护条目的链表访问队列。 高速缓存条目实际上是链接列表中的节点,因此当访问条目时,它将自己从访问队列中的旧位置移除,并将其自身移动到队列的末尾。

第二部分 :来自此链接: Guava CacheLoader – 如果设置了expireAfterWrite和expireAfterAccess,则invalidate不会立即使条目无效

invalidate应该立即删除条目 – 不等待另一个查询 – 并且应该强制该值在下一个查询到该密钥时重新加载。

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

来自guava文档 : https : //github.com/google/guava/wiki/CachesExplained

显式删除

您可以随时明确地使缓存条目无效,而不是等待条目被驱逐。 这可以做到:

 individually, using Cache.invalidate(key) in bulk, using Cache.invalidateAll(keys) to all entries, using Cache.invalidateAll() 

什么时候清理发生?

使用CacheBuilder构建的缓存不会“自动”执行清理和逐出值,也不会在值到期后立即执行或逐出任何类型。 相反,它在写入操作期间执行少量维护,或者在写入很少的情况下偶尔执行读取操作。

原因如下:如果我们想要连续执行缓存维护,我们需要创建一个线程,其操作将与共享锁的用户操作竞争。 此外,某些环境会限制线程的创建,这会使CacheBuilder在该环境中无法使用。

相反,我们把选择放在你手中。 如果您的缓存是高吞吐量,那么您不必担心执行缓存维护以清理过期的条目等。 如果您的缓存很少写入并且您不希望清除阻止缓存读取,您可能希望创建自己的维护线程,定期调用Cache.cleanUp()。

如果要为很少写入的高速缓存安排常规高速缓存维护,只需使用ScheduledExecutorService安排维护。