当前位置: 首页 > 面试题库 >

谷歌番石榴缓存invalidateAll()和cleanUp()之间的区别

司空坚
2023-03-14
问题内容

说我有一个Cache这样定义的:

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

根据我的阅读 (如果我错了,请纠正我):

如果将值写入Cache0:00,则应在60秒后将其移至“准备退出”状态。从中实际删除值Cache将在下一次 缓存修改
时发生(究竟是什么缓存修改?)。 那正确吗?

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


问题答案:

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

我将重点讨论 expireAfterAccess ,但是 expireAfterWrite 的过程几乎相同。从机制 上讲
,当您在CacheBuilder中指定 expireAfterAccess
时,缓存的每个段都会维护一个条目的链接列表访问队列,其顺序为从最近访问到最新访问。缓存条目实际上本身就是链接列表中的节点,因此,在访问条目时,它会将其从访问队列中的旧位置删除,然后移至队列的末尾。

第二部分 :通过此链接:Guava CacheLoader-如果同时设置了expireAfterWrite和expireAfterAccess,则invalidate不会立即使条目无效

invalidate 应该立即删除该条目-不等待其他查询-并且应强制在该键的下一个查询中重新加载该值。

cleanUp:执行缓存所需的所有暂挂维护操作。确切地执行哪些活动(如果有)取决于实现。

github文档中获取 :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构建的缓存不会“自动”执行清理和逐出值,也不会在值过期后立即执行清理或逐出值,或类似的任何操作。取而代之的是,如果写操作很少,它会在写操作期间或偶尔的读操作期间执行少量维护。

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

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

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



 类似资料:
  • 问题内容: 我在commons- lang中使用了简单的DTO。现在,我尝试使用Google Guava代替Apache Commons库。我在番石榴找到了。但是如果班上有很多成员,这太冗长了。例如: 如果我使用commons-lang,则简单得多: 有什么更好的方法可以用Guava而不是commons-lang 来实现? 番石榴文件 问题答案: 我有番石榴的小招。我将 IntelliJ IDEA

  • 问题内容: 在过去的几周内,我一直在尝试使用番石榴的MapMaker查找理想的缓存实现。 根据我所学的知识,我的下一个尝试将弃用软值,以使用maximumSize和expireAfterAccess: 哪里 但是,我仍然要解决的一个问题是,一旦它们用完了,即使对象很容易到达,此实现也将逐出对象。这可能会导致环境中漂浮着具有相同UID的多个对象,而这是我所不希望的(我相信我试图实现的目标称为规范化)

  • 问题内容: 刚刚发现了Guava库项目。 这些与GWT兼容吗? 问题答案: 从该页面的介绍性PDF中, 您可以在…上使用这些库。 在JDK 6上 在Android上, 我们认为。需要志愿者来帮助我们进行测试。 在Google App Engine上, 我们认为。需要志愿者来帮助我们进行测试。 在GWT上-参差不齐! 由于GWT的JDK库支持 可能参差不齐,也许是2/3,所以到目前为止,这些库中的东

  • 问题内容: 在我的Java代码中,我通过以下方式使用Guava的Multimap(com.google.common.collect.Multimap): 此处,Multimap键是URL的一部分,而值是URL的另一部分(转换为整数)。现在,我分配了JVM 2560 Mb(2.5 GB)堆空间(通过使用Xmx和Xms)。但是,它只能存储900万个这样的(键,值)整数对(大约1000万个)。但是,理

  • 从Java8开始,我们可以在ConcurrentHashMap上使用。compute*方法来按键同步处理,这样,如果两个线程同时在同一个键上执行。compute*方法,回调仍然会相继执行,而不是同时执行。但是ConcurrentHashMap不能像缓存通常允许的那样提供及时删除数据的能力。 Guava/Caffeine缓存提供了基于时间的自动删除值的能力,但是您没有基于键的同步处理的讨厌特性,如在

  • 问题内容: 我想知道哪个更有效,为什么? 1) 要么 2) 问题答案: 我看不出您为什么要在此处使用builder的任何原因: 比在这种情况下制作一个更具可读性, 不会推断通用类型,并且在用作单行代码时必须自己指定类型, (来自docs) 在与另一个不可变集合调用时 做得很好( 尝试避免在安全的情况下实际复制数据 ), (从源) 调用以前创建的,同时避免为零元素和一元素集合创建任何列表(分别返回空