简介
这是关于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);
}
答案 0 :(得分:5)
在进入答案之前,我想在逐出和过期之间澄清。
<强>逐出强>
驱逐是指从内存容器中删除条目,因为它超出了配置的最大大小(max-entries)。 Eviction只能在配置时启用,并且不会在运行时控制,到期时间可以是,请参阅here。请注意,如果您已经配置了一个条目,则驱逐永远不会从商店中删除条目,因此如果您不想要,则不会因为太多而丢失条目。
Infinispan 7及更早版本已经找到了Eviction的监听器,所引发的事件将be this one。
<强>过期强>
到期定义在一段不活动或设定的持续时间后删除的条目。这可以通过配置进行配置,也可以像在示例中一样使用API覆盖配置的值。
现在回答您的问题,Infinispan 8添加了Infinispan Expiration事件。详细内容更为here。请注意,一个重要的部分是,对于即将到期的键,锁定到期事件(除非您的侦听器被定义为异步)。这对于保证正确的订购很重要。
此外,您应该记住,到期事件不能保证在条目到期时准确触发。而是仅在访问所述过期条目时或者如果到期收割者线程找到过期条目时才触发该事件。到期收割机默认每分钟运行一次,您可以通过更改到期间隔配置设置来禁用此功能或更改时间。