2

我计划在我的应用程序组件中使用 SelfPopulatingCache,因为它支持通读,并且看起来像是用于刷新的后备缓存。

但是,我对timeToLiveSeconds配置有点困惑。这是我的测试配置:

<ehcache>
    <diskStore path="java.io.tmpdir"/>

    <cache name="myCache" maxElementsInMemory="50000" overflowToDisk="false"
    eternal="false" timeToIdleSeconds="0" timeToLiveSeconds="2"/>

</ehcache>

在我的单元测试中,我执行以下操作:

  • 验证我的缓存中有 2 个条目
  • 睡眠 3 秒
  • 但是,在睡眠之后,我的缓存中仍然有 2 个条目。

根据其他在线帖子(而不是文档),当我下次执行阅读时,我的条目应该被驱逐。

但是,将调用 CacheEntryFactory,并且将为我的过期元素添加一个空元素到缓存中。

有什么方法可以配置它以在 timeToLiveSeconds 到期时执行完全驱逐?

4

1 回答 1

3

我相信只有在有单独的到期线程时才会发生“完全驱逐”。不幸的是,对于内存中的条目,没有这样的东西。引用Ehcache 常见问题解答

因为 MemoryStore 具有固定的最大元素数,所以它的最大内存使用量等于元素数乘以平均大小。当添加的元素超出最大大小时,LRU 元素会被推送到 DiskStore。虽然我们可以有一个过期线程来定期过期元素,但只在需要时检查效率要高得多。权衡是更高的平均内存使用量。到期线程保持 DiskStore 干净。希望 DiskStore 的锁争用较少,因为常用的值在 MemoryStore 中。我们使用 RAMFS 在 Linux 上挂载 DiskStore,因此它使用的是操作系统内存。虽然我们拥有比 2GB 32 位进程大小限制更多的资源,但它仍然是一种昂贵的资源。DiskStore 线程对其进行控制。如果您担心 CPU 使用率和 DiskStore 中的锁定,您可以将 diskExpiryThreadIntervalSeconds 设置为较高的数字,例如 1 天。或者,您可以通过将 diskExpiryThreadIntervalSeconds 设置为一个非常大的值来有效地关闭它。

于 2012-12-18T22:00:04.337 回答