有没有办法配置ehcache只按时间顺序缓存一些元素?

时间:2017-09-07 08:14:51

标签: caching ehcache evict

我当前的配置如下,我打算只缓存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

2 个答案:

答案 0 :(得分:1)

Ehcache驱逐策略总是有一定程度的启发式。例如,驱逐策略不适用于缓存的整个群体,对于大型缓存而言,这样做成本太高,而是在样本上。

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

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

答案 1 :(得分:0)

感谢@Louis的回答和建议。

在ehcache doc中,我学到了memoryStoreEvictionPolicy is only for memory store,而在我的情况下,我使用了磁盘存储。此外,磁盘存储的驱逐策略默认为LFU,不可配置

  

在Ehcache中,MemoryStore的大小可能有限(请参阅如何调整大小   缓存更多信息)。当商店满员时,元素就是   驱逐。 Ehcache中的逐出算法确定了哪些元素   被驱逐出境。默认值为LRU。

     

...   DiskStore逐出算法是不可配置的。它使用LFU。

为了实现我所期望的,我改为仅使用内存存储,因为磁盘存储的当前持久策略不可重启(localTempswap),这与使用内存存储相当。最终配置为:

<cache name="myCache"
       eternal="false"
       maxEntriesLocalHeap="30"
       memoryStoreEvictionPolicy="FIFO">
</cache>