我需要开发一个具有嵌入式数据库( Derby )和缓存( Guava缓存)的Spring Boot微服务。
每个客户的条目大小不同。
maximumSize
,会发生什么?大小会不断增长?会影响大小吗?记忆吗?cleanUp
格式的作业(对于每个间隔),则何时将条目从缓存中删除?以及如果我只有refreshAfterWrite
会如何影响?refreshAfterWrite
进行任何调用的情况下设置了cleanUp
,过期条目会从缓存中删除吗? (即,我将打到cache.size()
并看到它已减少)。谢谢
答案 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调用,过期的条目会从缓存中删除吗?
否,refreshAfterWrite
与expireAfterWrite
不同。该条目将符合刷新的条件,但不会被删除。如果您使用expireAfterWrite
,则该条目将过期并被删除。
(即,我将调用cache.size()并看到它已减少)。
这不是它的工作方式。缓存不是保证的工作程序。它不像一个集合。在计算尺寸时,可能没有考虑某些条目,或者某些条目仍被算作尺寸的一部分,但尚未有效删除。这是明确的written in the Javadoc for the size()
method:
大小
long size()
返回此缓存中的大约条目数。
基本上,您应该真正阅读Guava CachesExplained wiki page的整个文档。所有的实际信息都以一种非常有描述性的方式存在。