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