java - google invalidateAll() 和 cleanUp() 之间的番石榴缓存差异

java - google guava cache difference between invalidateAll() and cleanUp()

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

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

据我所见(如有错误请指正):

如果值在 0:00 写入 Cache,它应该在 60 秒后移动到 "ready to be evicted" 状态。 Cache 中的值的实际删除将在下一次 缓存修改 发生(缓存修改到底是什么?)。 是吗?

另外,我不知道invalidateAll()cleanUp()方法有什么区别,有人可以解释一下吗?

第一部分 来自link : How does Guava expire entries in its CacheBuilder?

我将重点介绍 expireAfterAccess,但是 expireAfterWrite 的过程几乎相同。就机制而言,当您在 CacheBuilder 中指定 expireAfterAccess 时,缓存的每个段都会维护一个 linked 列表访问队列,以从最近到最近的顺序排列条目访问最近访问。缓存条目本身实际上是 linked 列表中的节点,因此当访问条目时,它会将自己从访问队列中的旧位置移除,并将自己移动到队列的末尾。

第二部分: 从这个 link : 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 构建的缓存不会执行清理和逐出值 "automatically," 或在值过期后立即执行,或任何类似的操作。相反,它会在写入操作期间执行少量维护,或者如果写入很少,则在偶尔的读取操作期间执行。

原因如下:如果我们要持续的进行Cache的维护,就需要创建一个线程,它的操作会和用户的操作竞争共享锁。此外,某些环境限制线程的创建,这会使 CacheBuilder 在该环境中无法使用。

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

如果您想为很少写入的缓存安排定期缓存维护,只需使用 ScheduledExecutorService 安排维护。