Caching 有没有办法将ehcache配置为仅按时间顺序缓存某些数量的元素?
我当前的配置如下所示,我打算只缓存最多30个元素,并在数量超过30个时逐出最旧的元素: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
<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.6ehcache逐出策略中始终包含一定程度的启发式。例如,逐出策略不会应用于缓存的整个人口,这对于大型缓存来说成本太高,而是应用于样本 这就是为什么与您的需求相比,您会遇到不精确的结果
现在,考虑到您想要保留的元素数量有限,一个
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
不是持久性的,因此不可重启。