有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java管理Google Guava缓存中的条目

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

每个客户的条目大小不同

  • 如果我不设置maximumSize,会发生什么?规模会不断扩大吗?它会影响尺寸吗?记忆
  • 如果我计划了一个预执行cleanUp(每个间隔)的作业,那么这些条目将在何时从缓存中删除?如果我只做了refreshAfterWrite,会有什么影响
  • 假设我设置refreshAfterWrite而不调用cleanUp,过期的条目将从缓存中删除吗?(也就是说,我会打电话给cache.size(),看看它是否被减少了)

谢谢


共 (1) 个答案

  1. # 1 楼答案

    这是很多问题。它们都是用番石榴来解释的

    If I'll not set maximumSize, what will happened? the size will grow constantly?

    当满足其他条件时,或者当内存不再可用时,条目将被释放。因此,是的,只要不满足这些条件,规模就会扩大。(第"Size-based Eviction"节)

    it will effected the size? memory?

    maximumSize(long)指定特定的对象大小。默认情况下,它是缓存中存在的元素数。但是如果你使用weigher(Weigher),你可以说一个特定的元素值多少,这样就更接近实际的内存使用情况。但是你必须自己写Weigher。(第"Size-based Eviction"节)

    If I'll scheduled a job that preform cleanUp (for each interval), when the entries will remove from the cache?

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

    and how it will effected if I've only refreshAfterWrite?

    如果使用refreshAfterWrite缓存调用cleanUp(),则无论refreshAfterWrite是否被触发,都必须再次加载要访问的条目

    Lets say I set refreshAfterWrite without any call to cleanUp, the the expired entries will removed from the cache?

    不,refreshAfterWriteexpireAfterWrite不同。该条目将有资格进行刷新,但不会被删除。如果使用了expireAfterWrite,则条目将过期并被删除

    (i.e., I'll call to cache.size() and see that it has been decreased).

    事情不是这样的。缓存不是保证的工作进程。这不像是收藏。可能在计算大小时没有考虑到某些条目,或者某些条目仍被计算为大小的一部分,但尚未有效删除。这是明确的written in the Javadoc for the ^{} method

    size

    long size()
    

    Returns the approximate number of entries in this cache.

    基本上,你应该真正阅读番石榴CachesExplained wiki page的全部文档。所有的实际信息都在那里,以一种非常描述性的方式