当 putifabsent 时间到期时做点什么 [infinispan]

Do Something when putifabsent time expired [infinispan]

简介

这是关于 infinispan 缓存的,但我认为这是一个足够普遍的问题。

在我的 infinispan 缓存中,我使用 putIfAbsent 方法将项目输入到缓存中,并使用 remove 方法删除它们。 (jboss doc here)

基本行为

我可以使用 id 将项目放入缓存并从缓存中删除项目。但是如果我不显式地移除缓存项,infinispan会在指定的生命周期过去后自动移除它。

在我的移除方法中,我 运行 一些自定义代码在移除之前。 但是当我没有调用 remove 方法时,由于提供的生命周期到期,infinispan 删除了缓存条目。

在那种自动删除的情况下,我无法 运行 我的自定义代码,因为它发生在幕后。 (通过 infinispan)。那么可能的方法是什么?下面的代码将更有希望地解释这一点。

我相信我已经足够清楚了。请给我一些见识。 谢谢。

void putToCache(String id){
   myCache.putIfAbsent(id,value,LIFESPAN_DURATION,timeUnit);
}

void removeFromCache(String id){
  //MY CUSTOM CODE - WANT TO RUN THIS IN LIFE SPAN DURATION EXPIRY ALSO
   myCache.remove(id);
}

在进入答案之前,我想澄清驱逐和过期之间的区别。

驱逐

逐出是指由于条目超出配置的最大大小(最大条目)而从内存容器中删除条目。逐出只能在配置时启用,并且不受 运行 时间的控制,过期时间可以是,请参阅 here。请注意,如果您配置了一个条目,驱逐永远不会从商店中删除一个条目,因此如果您不想的话,您不会因为条目太多而丢失一个条目。

Infinispan 7 和更早版本有一个 Eviction 侦听器,正如您已经发现的那样,引发的事件将 be this one

到期

过期定义了在一段时间不活动或设置的持续时间后删除的条目。这可以通过配置进行配置,或者您可以像示例中那样使用 API 覆盖配置的值。

现在回答你的问题,Infinispan 8 添加了一个 Infinispan 过期事件。它更详细 here。请注意,一个重要的部分是到期事件将被触发,持有即将到期的密钥的锁(除非您的侦听器被定义为异步)。这对于保证正确排序很重要。

您还应该记住,过期事件不能保证在条目过期时准确触发。相反,该事件仅在访问所述过期条目或过期收割器线程找到过期条目时才会触发。过期收割器默认为每分钟 运行,您可以禁用此功能或通过更改过期间隔配置设置来更改时间。