我有一个IMap
in hazelcast (key, value)
,当时没有ttl
设置imap.put()
。现在触发事件后,我想ttl
在IMap
. 因为,在这个事件发生时,我不想打电话给value = imap.get(key)
then imap.put(key, value, 10, TimeUnit.SECONDS)
。那么如何将 ttl 设置为该特定键?
2 回答
除了使用方法之外,没有直接的方法可以做到这一点IMap
。但是,我想知道避免以下调用的原因。
value = imap.get(key);
imap.put(key, value, 10, TimeUnit.SECONDS)
如果您仍想获得结果,您可以采用以下方法之一。
打电话
imap.set(key, value, 10, TimeUnit.SECONDS)
,如果你已经对你有价值。imap.set()
比imap.put()
不返回旧值更有效。如果您可以容纳使用更多
IMap
:使用额外的地图ttlMap<key, Boolean>
。每当您需要在实际imap
中设置条目的 ttl 值时,请在ttlMap.set(key, true, 10, TimeUnit.SECONDS);
. 现在,添加一个MapListener
tottlMap
usingaddEntryListener()
方法。当一个条目ttlMap
被驱逐时,entryEvicted(EntryEvent<String, String> arg0)
方法将被调用。将您的条目从imap
该方法中的实际内容中逐出。如果您准备好动手,您可以修改源代码,使该
process()
方法的EntryProcessor
方法将接收一个自定义Map.Entry
的新方法来设置键的 ttlValue。
希望这可以帮助。
从 3.11 版开始,HazelcastIMap
的setTtl(K key,long ttl, TimeUnit timeunit)
方法正是这样做的:
用新的 TTL 值更新 key 指定的条目的 TTL(生存时间)值。新的 TTL 值从调用此操作时开始有效,而不是从创建条目时开始。如果条目不存在或已过期,则此调用无效。