【问题标题】:TTL value of an entry in Map is changed for every update of that entry每次更新该条目时,都会更改 Map 中条目的 TTL 值
【发布时间】:2015-10-26 17:46:12
【问题描述】:
我正在尝试使用 Hazelcast Map 并发现 Expiration time for an entry = Last Updated Time + TTL。
但我想将其设为Expiration Time for an entry = Creation Time + TTL。有人可以建议如何实现此功能吗?
此行为以前存在,为什么要更改?
【问题讨论】:
标签:
hazelcast
ttl
hazelcast-imap
【解决方案1】:
自 3.3.3 版以来,该行为确实发生了变化。显然,之前的行为是社区considered a bug。
可能性:
- 打开一个 github 问题,如果你能吸引足够的支持者,它就可以实现
- 继续使用 3.3.2(看起来不是很吸引人,但也有可能)
- 将您的地图一分为二(“不可变”和可变),只有在检查第一个中存在密钥后才能访问第二个。当你想更新值时,只在第二个中进行。这样,由于您根本没有更新第一个地图,因此条目将在创建时间后过期
ttl。
【解决方案2】:
它是一个旧线程,但也许这个解决方案可以帮助某人。我在使用 hazelcast 3.7.x 时遇到了同样的情况。这就是我所做的
-
我正在使用 IMap,它提供了使用 ttl 设置条目的方法
set(K key, V value, long ttl, TimeUnit ttlUnit)
使用此方法,您可以使用此 ttl 进行条目,它将相应地更新过期时间。
-
现在的技巧是调整 ttl 以使过期时间不会改变(或者当条目更新时 ttl 不会更新)。我做了
ttl=myImap.getEntryView(key).getExpirationTime()-new java.util.Date().getTime();
myImap.set(key,value,ttl,TimeUnit.MILLISECONDS);
它使用 hazelcast 3.7.5 进行了试验和测试。但是由于对 ttl 的这种调整,它可能会导致过期日期出现几毫秒的差异。