【问题标题】:Do Something when putifabsent time expired [infinispan]当putifabsent时间到期时做点什么[infinispan]
【发布时间】:2016-02-02 09:15:03
【问题描述】:

简介

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

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

基本行为

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

在我的删除方法中,我在删除之前运行了一些自定义代码。 但是当我不调用 remove 方法时,由于提供的寿命到期,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);
}

【问题讨论】:

  • Infinispan 似乎实现了一些侦听器类型的功能,可以在删除事件发生时通知您的方法 - 请参阅 docs.jboss.org/infinispan/6.0/apidocs/org/infinispan/…
  • 实际上 - 听起来比这更复杂。请参阅infinispan.org/docs/6.0.x/faqs/… - 您无法保证它在超时后过期
  • 由于驱逐只能保证在驱逐超时过去之后的某个时间发生,因此决定不提供回调比在稍后提供回调更令人惊讶。我只是想澄清一下。我并不关心实际的删除时间。我想要的是当它发生时的通知。天气它准时或之后发生。你觉得有可能吗。驱逐侦听器是否可以完成工作@disco

标签: java caching jboss infinispan


【解决方案1】:

在回答之前,我想澄清驱逐和到期之间的关系。

驱逐

驱逐是当一个条目从内存容器中删除时,因为它超出了配置的最大大小(max-entries)。 Eviction 只能在配置时启用,在运行时不控制 Expiration 可以是什么,请参阅here。请注意,如果您配置了条目,驱逐永远不会从商店中删除条目,因此您不会因为不想删除条目而丢失条目。

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

有效期

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-07
    • 2013-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-28
    • 2023-01-11
    相关资源
    最近更新 更多