有没有办法配置 ehcache 只按时间顺序缓存一些元素?
Is there a way to configure ehcache to only cache some numbers of elements in time order?
我目前的配置如下,我打算只缓存最多 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 个元素。
但是 expiring/eviction 并不像预期的那样。一些非常旧的元素仍然保留,而最近 30 分钟内的一些元素被意外驱逐。我在这里遗漏了什么吗?
我已经通读了ehcache中的expiring/eviction相关文档,但没有找到任何线索。希望有人能帮忙:)
顺便说一句,ehcache 版本是 2.6.6
Ehcache 逐出策略总是有一定程度的启发式。例如,驱逐政策并不适用于缓存的整个群体,这对于大型缓存来说成本太高,而是适用于样本。
这就是为什么您遇到的结果与您的要求不准确的原因。
鉴于您要保留的元素数量有限,LinkedHashMap
听起来是个不错的选择,尽管它对于多线程访问并不安全。
感谢@Louis 的回答和建议。
在 ehcache 文档中,我了解到 memoryStoreEvictionPolicy
is only for memory store,而在我的例子中使用的是磁盘存储。此外,磁盘存储的逐出策略默认为 LFU 且 不可配置。
In Ehcache, the MemoryStore may be limited in size (see How to Size
Caches for more information). When the store gets full, elements are
evicted. The eviction algorithms in Ehcache determine which elements
are evicted. The default is LRU.
...
The DiskStore eviction algorithm is not configurable. It uses LFU.
因此,为了达到我的预期,我更改为仅使用内存存储,因为当前磁盘存储的持久化策略不可重启(localTempswap),这等同于使用内存存储。最终配置如下:
<cache name="myCache"
eternal="false"
maxEntriesLocalHeap="30"
memoryStoreEvictionPolicy="FIFO">
</cache>
我目前的配置如下,我打算只缓存最多 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 个元素。 但是 expiring/eviction 并不像预期的那样。一些非常旧的元素仍然保留,而最近 30 分钟内的一些元素被意外驱逐。我在这里遗漏了什么吗?
我已经通读了ehcache中的expiring/eviction相关文档,但没有找到任何线索。希望有人能帮忙:)
顺便说一句,ehcache 版本是 2.6.6
Ehcache 逐出策略总是有一定程度的启发式。例如,驱逐政策并不适用于缓存的整个群体,这对于大型缓存来说成本太高,而是适用于样本。
这就是为什么您遇到的结果与您的要求不准确的原因。
鉴于您要保留的元素数量有限,LinkedHashMap
听起来是个不错的选择,尽管它对于多线程访问并不安全。
感谢@Louis 的回答和建议。
在 ehcache 文档中,我了解到 memoryStoreEvictionPolicy
is only for memory store,而在我的例子中使用的是磁盘存储。此外,磁盘存储的逐出策略默认为 LFU 且 不可配置。
In Ehcache, the MemoryStore may be limited in size (see How to Size Caches for more information). When the store gets full, elements are evicted. The eviction algorithms in Ehcache determine which elements are evicted. The default is LRU.
... The DiskStore eviction algorithm is not configurable. It uses LFU.
因此,为了达到我的预期,我更改为仅使用内存存储,因为当前磁盘存储的持久化策略不可重启(localTempswap),这等同于使用内存存储。最终配置如下:
<cache name="myCache"
eternal="false"
maxEntriesLocalHeap="30"
memoryStoreEvictionPolicy="FIFO">
</cache>