2016-06-25 18 views
0

Sind die lokalen Schlüssel für eine IMap sortiert? Oder, gibt es trotzdem, kann ich die unterstützende Datenstruktur zum Sortieren sortieren?Hazelcast IMap localkeyset sorting

Ich speichere temporäre Schlüssel in der IMap und suche von Zeit zu Zeit nach dem ältesten lokalen Schlüssel. Ab sofort mache ich ein neues TreeSet (imap.localKeyset()), habe mich jedoch gefragt, ob ich die lokale Backing-Datenstruktur trotzdem selbst sortieren könnte.

Danke, Sutanu

Antwort

0

Nein, der localKeySet nicht sortiert und ist nur eine ganz normale Set. Wenn Sie die Reihenfolge beibehalten möchten, würde ich lieber Queue anstelle von TreeMap verwenden (außer Sie möchten es basierend auf einem anderen Parameter anstelle von TimeStamp of addition sortieren) und implementieren Sie einen localEntryListener, um diese Warteschlange zu steuern.
Eine weitere Option ist die Verwendung von 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

Danke für Ihre Antwort. Ich hatte anfangs ein ähnliches Design, aber mit einem TreeSet (Tippfehler in der Frage, jetzt korrigiert), da ich die Sortierung brauche. Ich denke jedoch über Optimierungsmöglichkeiten nach, wenn ich mit der bereits vorhandenen Datenstruktur arbeiten könnte. Die lokalen Karten sind vermutlich ConcurrentHashMaps, und ich hatte erwartet, dass Hazelcast eine Art Erweiterungsmechanismus bereitstellen würde, mit dem ich eine benutzerdefinierte Map "einstecken" könnte. –

+0

Ich glaube nicht, dass Hazelcast es Ihnen ermöglicht, die benutzerdefinierte Map/Keyset-Implementierung zu plugintieren. Außerdem gibt Hazelcast nur eine Kopie der keySet/Werte zurück, nicht die tatsächlichen Referenzen. –