2017-09-13 3 views
0

Anwendungsfall: IMap und hat 70K Einträge. Mehrheit der Operationen sind GET-Aufruf für mehrere Schlüssel. GET Anrufe (90%)> PUT Anrufe (10%). Wir verwenden EP für PUT-Aufrufe.Hazelcast IMap - Was kann der effizienteste Weg sein, um Wert für mehrere Schlüssel zu erhalten?

Problem: Was ist der effizienteste Weg, um die Daten für mehrere Schlüssel zu erhalten, die in mehreren Instanzen vorhanden sein können?

Mögliche Lösung: 1. EP mit ReadOnly, Offloadable und verwenden executeOnKeys Methode. 2. Parallele map.get (Schlüssel) für alle Schlüssel ausführen.

Gibt es einen anderen effizienten Weg, um die Daten für mehrere Schlüssel zu erhalten?

  1. Prädikats

    public class ExecuteOnSelectedKeyPredicateTest { public static void main (String [] args) { HazelcastInstance hazelcastInstance = Hazelcast.newHazelcastInstance();

     IMap<String, Integer> map = hazelcastInstance.getMap("testMap"); 
    
         map.put("testKey1", 1); 
         map.put("test", 2); 
         map.put("testKey3", 3); 
    
         // Get entries which ends with a number 
         Set<Map.Entry<String, Integer>> entries = map.entrySet(new ExecuteOnSelectedKeyPredicate("^.+?\\d$")); 
    
         System.out.println(entries); 
        } 
    
        public static class ExecuteOnSelectedKeyPredicate implements Predicate<String, Integer> { 
    
         private String keyRegex; 
         private transient Pattern pattern; 
    
         public ExecuteOnSelectedKeyPredicate(String keyRegex) { 
          this.keyRegex = keyRegex; 
         } 
    
    
         @Override 
         public boolean apply(Map.Entry<String, Integer> mapEntry) { 
          if (pattern == null) { 
           pattern = Pattern.compile(keyRegex); 
          } 
          Matcher matcher = pattern.matcher(mapEntry.getKey()); 
          return matcher.matches(); 
         } 
        } 
    } 
    

Antwort

1

mehrere Schlüssel die Anfrage bekommen hat möglicherweise mehrere Mitglieder zu gehen. executeOnKeys ist hier ziemlich optimal, da es die Partitionen berechnet, auf denen die Operationen ausgeführt werden müssen, und es sendet diese Operation nur an diese Partitionen. Offloadable stellt sicher, dass Sie die partitionThreads nicht blockieren und ReadOnly die Verarbeitung weiter optimiert.

Mehrere get Operationen generieren mehr Netzwerkverkehr, da Sie pro Schlüssel einen Vorgang haben.

+0

@tombujok - Glauben Sie, Prädikat wird besser als E.P. Implementierung? Ich habe oben den Code hinzugefügt. – Hiten

+0

@tombujok - Es gibt eine weitere Implementierung für IMap - getAll (Set ). Glauben Sie, dass es effizienter sein wird als die Implementierung des EP? – Hiten

+0

Hiten, wenn die einzige Logik, die Sie ausführen, ein Lesevorgang ist, sollte getAll ziemlich ähnlich sein. Es funktioniert genauso wie executeOnKeys in Bezug auf die Anzahl der Operationen, die gesendet werden, also sollte es keinen großen Unterschied geben. Ich erinnere mich, dass Ihr Anwendungsfall auch eine Schreiblogik hatte, also ist es vielleicht besser, die EP zu benutzen, um eine vereinheitlichte Logik zu haben. –

Verwandte Themen