Hazelcast - 在一段固定的时间后从 IMap 中逐出一个条目,无论它更新了多少次

Hazelcast - Evicting an entry from a IMap after a fixed period of time, no matter how many times it is updated

我有以下用例,我需要从 IMap 中逐出一个条目,无论它更新了多少次。我的键是一个字符串,我的值是一个 Java 对象。

比如5月12日新增条目,14天后,即5月26日,无论更新多少次,都需要驱逐。

Hazelcast 在其配置中有一个名为 time-to-live-seconds 的标签,您可以在其中配置条目可以在地图中停留多长时间。

所以从 Hazelcast 文档中,

"Maximum time in seconds for each entry to stay on the map. If it is not 0, entries that are older than this time and not updated for this time are evicted automatically. Valid values are integers between 0 and Integer.MAX VALUE. Its default value is 0, which means infinite. If it is not 0, entries are evicted regardless of the set eviction-policy."

因此,对于上面的内容,如果您考虑上面的示例,最初在 5 月 12 日添加然后在 5 月 24 日更新的条目将在 5 月 24 日之后的 14 天被删除,而不是在 5 月 26 日。

因此,为了解决上述问题,我使用了以下方法。当我必须更新条目时,我首先从地图获取 EntryView,然后使用它获取到期时间。然后获取当前时间并取过期时间与当前时间的差值,然后更新值,生存时间为过期时间与当前时间的差值。

    Employee employee= IMap.get("A12");
    employee.setDescr("loasfdeff");
    EntryView<String,Employee> entryView=iMap.getEntryView("A12");
    Long expirationTime=entryView.getExpirationTime();
    Long currentTime=System.currentTimeMillis();
    Long difference=expirationTime-currentTime;      
    iMap.set("A12",employee, difference, TimeUnit.MILLISECONDS);

我已经测试了上述方法,并且有效。虽然,我想探索其他替代方案,看看是否有任何 hazelcast 开箱即用的东西,以帮助我解决我的用例。

非常感谢任何帮助!

编辑-

GITHUB 问题- https://github.com/hazelcast/hazelcast/issues/13012

您对 TTL 的运作方式是正确的。条目的简单更新本质上与添加新条目相同,因此系统无法解释其意图。然而,这将是一个很好的改进:添加一个开关来保留到期日期时间。

我有几个替代方法:

1) 考虑向值对象添加一个时间戳字段,并将其设置为原始对象put 上的当前时间。一旦存在,您就可以每隔一段时间向 运行 编写一个执行程序服务,并根据您想要的整体 TTL 使对象无效。您也可以为该字段编制索引以提高其性能。

2) 您可以通过扩展 MapCustomEvictionPolicy class 并将其应用于您的地图来编写自定义逐出策略。您很可能仍需要在值中添加时间戳(如果您想将其设为自定义对象,则为键)。然后,您将对您希望它如何工作一无所知。

我将同时为此创建一个产品增强请求。可能会在下一个版本中获得它,因为它似乎不太难添加。