首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >invalidateAll()和cleanUp()之间的区别

invalidateAll()和cleanUp()之间的区别
EN

Stack Overflow用户
提问于 2016-12-12 16:39:16
回答 1查看 8K关注 0票数 5

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

代码语言:javascript
复制
private static Cache<String, Long> alertsUIDCache = CacheBuilder.newBuilder().
           expireAfterAccess(60).build();

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

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

另外,我不知道invalidateAll()cleanUp()方法有什么区别,有人能给出一个解释吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-12 16:55:59

第一部分从这个链接:How does Guava expire entries in its CacheBuilder?

我将重点讨论expireAfterAccess,,但是expireAfterWrite的过程几乎是相同的。在机制方面,当您在expireAfterAccess中指定CacheBuilder时,缓存的每个部分都为条目维护一个链接列表访问队列,以便从最近访问到最近的访问。缓存条目实际上是链接列表中的节点,因此当访问一个条目时,它会将自己从访问队列中的旧位置中移除,并移动到队列的末尾。

第二部分:从这个链接:Guava CacheLoader - invalidate does not immediately invalidate entry if both expireAfterWrite and expireAfterAccess are set

invalidate应该立即删除条目--而不是等待另一个查询--并且应该强制将该值重新加载到该键的下一个查询中。

cleanUp:执行缓存所需的任何挂起的维护操作。具体执行哪些活动--如果有的话--取决于实现。

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

显式删除

在任何时候,您都可以显式地使缓存条目失效,而不是等待条目被逐出。这是可以做到的:

代码语言:javascript
复制
individually, using Cache.invalidate(key)
in bulk, using Cache.invalidateAll(keys)
to all entries, using Cache.invalidateAll()

什么时候开始清理?

使用CacheBuilder构建的缓存不会“自动”执行清除和驱逐值,也不会在值过期后立即执行清除或清除任何类似的操作。相反,它在写操作期间执行少量的维护,如果很少写入,则执行偶尔的读操作。

这样做的原因如下:如果我们想要持续地执行缓存维护,我们需要创建一个线程,它的操作将与用户操作竞争共享锁。此外,一些环境限制线程的创建,这将使CacheBuilder在该环境中不可用。

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

如果您想为很少有写操作的缓存安排常规的缓存维护,只需使用ScheduledExecutorService来安排维护。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41105447

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档