2016-06-25 46 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的副本,而不是实际的引用。 –