管理Google Guava缓存中的条目

时间:2019-06-25 06:47:13

标签: java caching guava

我需要开发一个具有嵌入式数据库( Derby )和缓存( Guava缓存)的Spring Boot微服务。

每个客户的条目大小不同。

  • 如果我不设置maximumSize,会发生什么?大小会不断增长?会影响大小吗?记忆吗?
  • 如果我计划执行一个cleanUp格式的作业(对于每个间隔),则何时将条目从缓存中删除?以及如果我只有refreshAfterWrite会如何影响?
  • 可以说我在没有对refreshAfterWrite进行任何调用的情况下设置了cleanUp,过期条目会从缓存中删除吗? (即,我将打到cache.size()并看到它已减少)。

谢谢

1 个答案:

答案 0 :(得分:1)

这是很多问题。番石榴的CachesExplained wiki page上对它们都有了解释。

  

如果我不设置maximumSize,会发生什么?大小会不断增长吗?

将发生的情况是,当满足其他条件或没有可用的内存时,将释放条目。因此,是的,只要不满足这些条件,规模就会增加。 (第"Size-based Eviction"节)

  

会影响大小吗?记忆吗?

maximumSize(long)指定特定的对象大小。默认情况下,它是缓存中存在的元素数。但是,如果您使用weigher(Weigher),则可以说某个特定元素的价值或多或少,因此使其更接近于实际的内存使用情况。但是,那么您必须编写自己的Weigher。 (第"Size-based Eviction"节)

  

如果我要计划执行cleanUp的作业(对于每个间隔),那么条目何时将从缓存中删除?

当您调用cleanUp()方法时,条目将被清除。 (第"When Does Cleanup Happen?"节)

  

以及如果我只有refreshAfterWrite会怎样?

如果您使用cleanUp()缓存调用refreshAfterWrite,则无论是否触发refreshAfterWrite,都必须重新加载希望访问的条目。

  

可以说我设置了refreshAfterWrite却没有任何cleanUp调用,过期的条目会从缓存中删除吗?

否,refreshAfterWriteexpireAfterWrite不同。该条目将符合刷新的条件,但不会被删除。如果您使用expireAfterWrite,则该条目将过期并被删除

  

(即,我将调用cache.size()并看到它已减少)。

这不是它的工作方式。缓存不是保证的工作程序。它不像一个集合。在计算尺寸时,可能没有考虑某些条目,或者某些条目仍被算作尺寸的一部分,但尚未有效删除。这是明确的written in the Javadoc for the size() method

  

大小

long size()
     

返回此缓存中的大约条目数。

基本上,您应该真正阅读Guava CachesExplained wiki page的整个文档。所有的实际信息都以一种非常有描述性的方式存在。