Hazelcast - 在一段固定的时间后从IMap中删除条目,无论其更新多少次

时间:2018-04-29 03:46:42

标签: java hazelcast hazelcast-imap

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

例如,如果在5月12日添加一个条目,则需要在14天(即5月26日)之后将其逐出,无论其更新多少次。

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

来自Hazelcast Documentation,

"每个条目在地图上停留的最长时间(秒)。如果不为0,则自动逐出清除此时间之前且未更新的条目。有效值是介于0和Integer.MAX VALUE之间的整数。其默认值为0,表示无限。如果不是0,则无论设置的驱逐策略如何都要逐出条目。"

所以,如上所述,如果你考虑上面的例子,最初于5月12日添加并在5月24日更新的条目将在5月24日之后14天而不是5月26日被删除。

因此,为了解决上述问题,我使用以下方法。当我必须更新条目时,我首先从Map获取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 ISSUE- https://github.com/hazelcast/hazelcast/issues/13012

1 个答案:

答案 0 :(得分:1)

你对TTL的运作方式是正确的。条目的简单更新与放置新条目基本相同,因此系统无法解释其意图。但是,这将是一个很好的增强:添加一个开关来保持到期日期时间。

我有几种替代方法:

1)考虑向值对象添加时间戳字段,并将其设置为原始对象put的当前时间。一旦存在,您可以编写执行程序服务以定期运行,并根据您想要的整体TTL使对象无效。您也可以将此字段编入索引,以使其更高效。

2)您可以通过扩展MapCustomEvictionPolicy类并将其应用于地图来编写自定义驱逐策略。您很可能仍需要在值中添加时间戳(或者如果您想要将其设置为自定义对象,则需要键)。然后,您将有一个空白的平板,以了解您希望如何工作。

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