java管理Google Guava缓存中的条目
我需要开发一个带有嵌入式数据库(Derby)和缓存(Guava cache)的Spring Boot微服务
每个客户的条目大小不同
- 如果我不设置
maximumSize
,会发生什么?规模会不断扩大吗?它会影响尺寸吗?记忆李> - 如果我计划了一个预执行
cleanUp
(每个间隔)的作业,那么这些条目将在何时从缓存中删除?如果我只做了refreshAfterWrite
,会有什么影响李> - 假设我设置
refreshAfterWrite
而不调用cleanUp
,过期的条目将从缓存中删除吗?(也就是说,我会打电话给cache.size()
,看看它是否被减少了)李>
谢谢
# 1 楼答案
这是很多问题。它们都是用番石榴来解释的
当满足其他条件时,或者当内存不再可用时,条目将被释放。因此,是的,只要不满足这些条件,规模就会扩大。(第"Size-based Eviction"节)
maximumSize(long)
指定特定的对象大小。默认情况下,它是缓存中存在的元素数。但是如果你使用weigher(Weigher)
,你可以说一个特定的元素值多少,这样就更接近实际的内存使用情况。但是你必须自己写Weigher
。(第"Size-based Eviction"节)当您调用
cleanUp()
方法时,条目将被清除。(第"When Does Cleanup Happen?"节)如果使用
refreshAfterWrite
缓存调用cleanUp()
,则无论refreshAfterWrite
是否被触发,都必须再次加载要访问的条目不,
refreshAfterWrite
与expireAfterWrite
不同。该条目将有资格进行刷新,但不会被删除。如果使用了expireAfterWrite
,则条目将过期并被删除事情不是这样的。缓存不是保证的工作进程。这不像是收藏。可能在计算大小时没有考虑到某些条目,或者某些条目仍被计算为大小的一部分,但尚未有效删除。这是明确的written in the Javadoc for the ^{} method :
基本上,你应该真正阅读番石榴CachesExplained wiki page的全部文档。所有的实际信息都在那里,以一种非常描述性的方式