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

问题描述

Guava如何使CacheBuilder中的条目到期?

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

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

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

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

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

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

解决方法

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

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

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

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

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

猜你在找的技术问答相关文章

如何检查配对的蓝牙设备是打印机还是扫描仪(Android)
是否允许实体正文进行HTTP DELETE请求?
如何将ZipInputStream转换为InputStream?
java.util.logging Java 8中的变量
PowerMockito.doReturn返回null
Java中的RESTful调用
Swing / Java:如何正确使用getText和setText字符串
特殊字符和重音字符
Android Studio中的ndk.dir错误
错误“找不到主类”