2

我当前的配置如下,我打算只缓存最多 30 个元素,并在数量超过 30 时驱逐最旧的元素:

<ehcache>
    <diskStore path="/path/to/store/"></diskStore>
    <cache name="myCache"
       eternal="false"
       maxEntriesLocalHeap="30"
       maxEntriesLocalDisk="30"
       memoryStoreEvictionPolicy="FIFO">
        <persistence strategy="localTempSwap"/>
    </cache>
</ehcache>

我有另一个计划的作业,它每分钟运行一次,将一个新元素放入缓存中。所以我希望在最近 30 分钟内只获得 30 个元素。但是到期/驱逐并不像预期的那样。一些非常旧的元素仍然保留,而最近 30 分钟内的一些元素却被意外驱逐。我在这里错过了什么吗?

我已经阅读了 ehcache 中的过期/驱逐相关文档,但没有找到任何线索。希望有人可以提供帮助:)

顺便说一句,ehcache 版本是 2.6.6

4

2 回答 2

1

Ehcache 驱逐策略总是有一定程度的启发式。例如,驱逐策略不适用于缓存的整个人口,这对于大型缓存来说成本太高,而是适用于样本。

这就是为什么与您的要求相比,您遇到的结果不准确。

现在考虑到您想要保留的元素数量有限,aLinkedHashMap听起来是个不错的选择,尽管它对于多线程访问并不安全。

于 2017-09-08T07:21:28.697 回答
0

感谢@Louis 的回答和建议。

在 ehcache 文档中,我了解到这memoryStoreEvictionPolicy仅适用于内存存储,而在我的情况下使用磁盘存储。并且磁盘存储的驱逐策略默认是 LFU 并且不可配置

在 Ehcache 中,MemoryStore 的大小可能会受到限制(有关更多信息,请参阅如何调整缓存大小)。当商店装满时,元素被驱逐。Ehcache 中的驱逐算法决定了哪些元素被驱逐。默认为 LRU。

... DiskStore 驱逐算法不可配置。它使用 LFU。

因此,为了达到我的预期,我改为仅使用内存存储,因为当前磁盘存储的持久策略不可重新启动(localTempswap),这相当于使用内存存储。最终配置如下:

<cache name="myCache"
       eternal="false"
       maxEntriesLocalHeap="30"
       memoryStoreEvictionPolicy="FIFO">
</cache>
于 2017-09-11T02:30:50.840 回答