Caching 有没有办法将ehcache配置为仅按时间顺序缓存某些数量的元素?

Caching 有没有办法将ehcache配置为仅按时间顺序缓存某些数量的元素?,caching,ehcache,evict,Caching,Ehcache,Evict,我当前的配置如下所示,我打算只缓存最多30个元素,并在数量超过30个时逐出最旧的元素: <ehcache> <diskStore path="/path/to/store/"></diskStore> <cache name="myCache" eternal="false" maxEntriesLocalHeap="30" maxEntriesLocalDisk="30" memo

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

ehcache逐出策略中始终包含一定程度的启发式。例如,逐出策略不会应用于缓存的整个人口,这对于大型缓存来说成本太高,而是应用于样本

这就是为什么与您的需求相比,您会遇到不精确的结果


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

谢谢@Louis的回答和建议

在ehcache doc中,我了解到了这一点,而在我的例子中,使用的是磁盘存储。磁盘存储的逐出策略默认为LFU,并且不可配置

在Ehcache中,MemoryStore的大小可能会受到限制(请参见如何调整大小) 缓存以获取更多信息)。当商店满员时,元素将被删除 驱逐。Ehcache中的逐出算法确定哪些元素 他们被驱逐。默认值为LRU

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

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

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


注意:您可以使用磁盘存储中的数据重新启动,只需确保正确调用了
CacheManager.shutdown()
方法即可。因此,它是可重启的,但不是防崩溃的。@LouisJacomet,是吗?甚至使用
localTempswap
持久策略?我在ehcache文档中了解到,只有
localRestartable
策略才是可重启的,而且它只适用于企业版。@LouisJacomet我再次浏览了ehcache文档,并且能够确认持久性策略
localTempSwap
不是持久性的,因此不可重启。