2015-09-18 84 views
0

我有一個IMap在榛木(key, value)沒有ttl設置在imap.put()時。現在事件被觸發後,我想將ttl設置爲IMap中的這個特定鍵。因爲在這次活動的時候,我不想打電話value = imap.get(key),然後imap.put(key, value, 10, TimeUnit.SECONDS)。 那麼如何設置ttl到那個特定的關鍵?將ttl設置爲Imap

回答

2

除了使用IMap方法外,沒有直接的方法可以做到。但是,我想知道爲什麼要避免以下電話。

value = imap.get(key); 
imap.put(key, value, 10, TimeUnit.SECONDS) 

如果您仍想達到結果,可以使用以下其中一種方法。

  1. 致電imap.set(key, value, 10, TimeUnit.SECONDS),如果你已經對你有價值。 imap.set()imap.put()更有效,因爲它不返回舊值。

  2. 如果您可以適應再使用一個IMap:請使用其他地圖ttlMap<key, Boolean>。無論何時需要爲實際的imap中的條目設置ttl值,請在ttlMap.set(key, true, 10, TimeUnit.SECONDS);中設置條目。現在,使用addEntryListener()方法將MapListener添加到ttlMap。當來自ttlMap的條目被驅逐時,entryEvicted(EntryEvent<String, String> arg0)方法將被調用。在這種方法中,從實際的imap中退出。

  3. 如果你準備讓你的手髒了,你可以修改這樣的EntryProcessor方法process()方法將收到一個自定義Map.Entry與設置鍵的ttlValue的新方法的來源。

希望這會有所幫助。

+0

感謝您的輸入@Dinesh。我不想這樣做,因爲我必須對緩存執行兩個操作。但是,要設置ttl,我必須'value = imap.get(key)'來檢查該值是否被其他客戶端更改過。所以,我用'value = imap.get(key); imap.put(key,value,10,TimeUnit.SECONDS)'。 – Viveran

+0

@Viveran,我明白了。如果你不需要關鍵的舊值(put()的返回值),你可以使用'value = imap.get(key); imap.set(key,value,10,TimeUnit.SECONDS);'。根據你的'oldValue'的大小,它將使你的性能得到一些改進,因爲你的'OldValue'不會通過網絡從所有者節點發回到調用節點。 – Dinesh