2016-06-25 45 views
0

IMap的localkeyset是否已排序?或者,無論如何,我可以代理支持數據結構進行排序嗎?Hazelcast IMap localkeyset sorting

我在IMap中存儲臨時密鑰,並不時尋找最早的本地密鑰。到目前爲止,我正在做一個新的TreeSet(imap.localKeyset()),但是,想知道是否可以讓本地支持數據結構自己排序。

感謝, Sutanu

回答

0

沒有,localKeySet不排序,只是一個普通的設置。如果你想維護順序,我寧願使用隊列而不是TreeMap(除非你想根據其他參數對它進行排序而不是添加TimeStamp),並實現一個localEntryListener來控制這個隊列。
另一種選擇是使用TreeSet。

public class HazelcastNode { 

    private static Queue localEntryQueue = new LinkedList<>(); 

    public HazelcastNode(){ 
     HazelcastInstance hz = Hazelcast.newHazelcastInstance(); 

     hz.getMap("hzMap").addLocalEntryListener(new MyLocalMapListner()); 
    } 

    public static void main(String[] args){ 

     HazelcastNode node = new HazelcastNode(); 

     //Get the Head of the queue which will be the oldest local entry 
     HazelcastNode.localEntryQueue.peek(); 
    } 

    private class MyLocalMapListner implements MapListener,EntryAddedListener, 
      EntryRemovedListener, 
      EntryUpdatedListener, 
      EntryEvictedListener, 
      EntryExpiredListener{ 

     @Override 
     public void entryAdded(EntryEvent entryEvent) { 
      HazelcastNode.localEntryQueue.add(entryEvent.getKey()); 
     } 

     @Override 
     public void entryEvicted(EntryEvent entryEvent) { 
      HazelcastNode.localEntryQueue.remove(entryEvent.getKey()); 
     } 

     @Override 
     public void entryExpired(EntryEvent entryEvent) { 
      HazelcastNode.localEntryQueue.remove(entryEvent.getKey()); 
     } 

     @Override 
     public void entryRemoved(EntryEvent entryEvent) { 
      HazelcastNode.localEntryQueue.remove(entryEvent.getKey()); 
     } 

     @Override 
     public void entryUpdated(EntryEvent entryEvent) { 
     } 
    } 
} 
+0

感謝您的回答。我最初有類似的設計,但使用TreeSet(問題中的拼寫錯誤,現在已更正),因爲我需要排序。但是,如果我可以使用已經掌握的數據結構,我正在考慮優化方法。本地地圖是ConcurrentHashMaps我想,我預計Hazelcast可能會提供某種擴展機制,通過這種機制我可以「插入」一個自定義地圖。 –

+0

我不認爲Hazelcast允許你插入自定義地圖/鍵集實現。此外,Hazelcast僅返回keySet/values的副本,而不是實際的引用。 –