gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 11:18:37 29 4
gpt4 key购买 nike

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

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

Hazelcast 在其配置中有一个称为生存时间秒的标签,您可以在其中配置条目可以在 map 中停留的时间。

来自 Hazelcast 文档,

“每个条目在 map 上停留的最长时间(以秒为单位)。如果不为 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

最佳答案

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

我有几种替代方法:

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

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

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

关于java - Hazelcast - 在固定时间段后从 IMap 中逐出条目,无论更新了多少次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50083192/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com