1

这里是 Java 8。当记录被逐出缓存时,是否有任何方法可以通知Caffeine缓存框架(或任何其他 JSR-107 兼容框架)?

也许某种EvictionEventListener或什么?

public class MyEvictionListener implements EvictionEventListener<String> {
    @Override
    public void onEvictionEvent(EvictionEvent eviction, String key) {
        // Now I have access to the String "key" that was evicted and
        // some information surrounding the eviction and I can do
        // whatever I want with this information....
    }
}

咖啡因、番石榴、Hazelcast(基本上是“ JVM 缓存区”)等中是否有类似的东西?

4

1 回答 1

2

按时间驱逐还是按空间驱逐?

在 JSR107 中,您必须为前者获取事件,而不能为后者获取事件。请参阅规范“8.4. Invocation of Listeners”的第 8.4 节。

所有 JCache 实现都必须支持按时间逐出,您会通过javax.cache.event.CacheEntryExpiredListener<K, V>. 根据实现,过期可以是急切的或懒惰的,项目不会在它们的时间限制发生时消失。

JCache 允许实现以基于空间的方式扩展它。

使用 Hazelcast,您可以做到这一点

 <eviction size="50" max-size-policy="ENTRY_COUNT" eviction-policy="LRU"/>

根据可配置的空间阈值从缓存中丢弃项目。但是,由于这取决于实现,因此没有 JCache 事件。

JCache的EXPIRED事件是系统产生的,不能由用户直接触发。REMOVED事件仅适用于用户发起的操作,例如cache.remove(k). 其他两种CREATEDUPDATED在这里也无济于事。

于 2018-07-25T22:36:29.080 回答