【发布时间】:2018-04-29 03:46:41
【问题描述】:
我有以下用例,无论更新多少次,我都需要从IMap 中逐出一个条目。我的键是一个字符串,我的值是一个 Java 对象。
例如,如果在 5 月 12 日添加条目,则需要在 14 天(即 5 月 26 日)后将其逐出,无论更新多少次。
Hazelcast 在其配置中有一个名为 time-to-live-seconds 的标签,您可以在其中配置条目可以在地图中停留的时间。
因此来自 Hazelcast 文档,
"每个条目在地图上停留的最长时间(以秒为单位)。如果不为 0,则自动驱逐早于该时间且未在此时间更新的条目。有效值为 0 和 Integer.MAX 之间的整数VALUE。其默认值为 0,表示无限。如果不为 0,则无论设置的 eviction-policy 为何,条目都会被驱逐。"
因此,根据上述情况,如果您考虑上面的示例,最初在 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
【问题讨论】:
-
没有开箱即用的能力来更新条目而不影响其 TTL。您正在做的似乎是实现用例的唯一方法
标签: java hazelcast hazelcast-imap