假设我有一个定义如下的Cache:
private static Cache<String, Long> alertsUIDCache = CacheBuilder.newBuilder().
expireAfterAccess(60).build();从我读到的(如果我错了请纠正我):
如果值在0:00被写入Cache,则应在60秒后将其移动到“准备被逐出”状态。从Cache中实际删除值将发生在下一个缓存修改(究竟什么是缓存修改?)。,对吗?
另外,我不知道invalidateAll()和cleanUp()方法有什么区别,有人能给出一个解释吗?
发布于 2016-12-12 16:55:59
第一部分从这个链接:How does Guava expire entries in its CacheBuilder?
我将重点讨论expireAfterAccess,,但是expireAfterWrite的过程几乎是相同的。在机制方面,当您在expireAfterAccess中指定CacheBuilder时,缓存的每个部分都为条目维护一个链接列表访问队列,以便从最近访问到最近的访问。缓存条目实际上是链接列表中的节点,因此当访问一个条目时,它会将自己从访问队列中的旧位置中移除,并移动到队列的末尾。
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来安排维护。
https://stackoverflow.com/questions/41105447
复制相似问题