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

时间:2016-12-12 16:39:16

标签: java guava google-guava-cache

假设我有一个Cache定义如下:

private static Cache<String, Long> alertsUIDCache = CacheBuilder.newBuilder().
           expireAfterAccess(60).build();

从我的阅读(如果我错了请纠正我):

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

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

1 个答案:

答案 0 :(得分:7)

来自此链接的

第一部分How does Guava expire entries in its CacheBuilder?

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

第二部分: 来自此链接:Guava CacheLoader - invalidate does not immediately invalidate entry if both expireAfterWrite and expireAfterAccess are set

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

cleanUp:执行缓存所需的任何待处理维护操作。究竟执行哪些活动 - 如果有的话 - 取决于实现。

来自番石榴文件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安排维护。