【问题标题】:Hazelcast - Evicting an entry from a IMap after a fixed period of time, no matter how many times it is updatedHazelcast - 在固定时间段后从 IMap 中逐出条目,无论它更新多少次
【发布时间】: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


【解决方案1】:

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

我有几种替代方法:

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

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

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

【讨论】:

  • 好的,我会看看你建议的选项。如果你做了一个,你能在这里参考github问题吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-20
  • 1970-01-01
相关资源
最近更新 更多