首页 > 解决方案 > Hazelcast - 在固定时间段后从 IMap 中逐出条目,无论它更新多少次

问题描述

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

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

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

因此,从 Hazelcast 文档中,

“每个条目在地图上停留的最长时间(以秒为单位)。如果它不为 0,则早于此时间且未在此时间更新的条目将被自动驱逐。有效值为 0 和 Integer.MAX VALUE 之间的整数。其默认值为 0,表示无限。如果不为 0,则无论设置的驱逐策略如何,条目都会被驱逐。

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

因此,为了解决上述问题,我使用了以下方法。当我必须更新一个条目时,我首先从 Map 中获取 EntryView,然后使用它获取到期时间。然后获取当前时间,取过期时间与当前时间的差值,然后更新值,time-to-live为过期时间与当前时间的差值。

    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

标签: javahazelcasthazelcast-imap

解决方案


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

我有几种替代方法:

1)考虑将时间戳字段添加到值对象并将其设置为原始对象放置的当前时间。一旦出现这种情况,您就可以编写一个执行程序服务以间隔运行,并根据您想要的整体 TTL 使对象无效。您也可以对该字段进行索引以提高性能。

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

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


推荐阅读