2009-03-02 4 views
3

Ich frage mich, was kann eine effektive Möglichkeit zum Hinzufügen/Entfernen von Elementen aus einer wirklich großen Liste, wenn Ihr Speicher Memcached-Like ist? Vielleicht gibt es einen verteilten Speicher mit Java-Schnittstelle, der sich gut mit diesem Problem befasst?Wie können Sammlungen (Listen oder Sets) am besten im Schlüsselwertspeicher verwaltet werden?

Jemand kann Terracotta empfehlen. Ich weiß es, aber das ist nicht genau das, was ich brauche. ;)

+0

Können Sie weitere Einzelheiten zu Ihrem Problem angeben? Vielleicht gibt es noch eine andere Antwort. – ShabbyDoo

Antwort

2

Hazelcast 1.6 wird verteilte Implementierung MultiMap, wo ein Schlüssel mit einer Reihe von Werten zugeordnet werden können.

MultiMap<String, String> multimap = Hazelcast.getMultiMap ("mymultimap"); 
multimap.put ("1", "a"); 
multimap.put ("1", "b"); 
multimap.put ("1", "c"); 
multimap.put ("2", "x"); 
multimap.put ("2", "y"); 

Collection<String> values = multimap.get("1"); //containing a,b,c 

Hazelcast ist eine Open-Source-transaktionale, verteilt/partitioniert Umsetzung der Warteschlange, Themas, Karte, Set, Liste, Schlosses und Testamentsvollstrecker Service. Es ist super einfach damit zu arbeiten; Füge einfach hazelcast.jar in deinen Klassenpfad ein und beginne zu programmieren. Fast keine Konfiguration ist erforderlich.

Hazelcast wird unter der Apache-Lizenz veröffentlicht, und die Unterstützung für Unternehmen ist ebenfalls verfügbar. Der Code wird unter Google Code gehostet.

0

Vielleicht sollten Sie auch einen Blick auf Scalaris werfen!

0

Sie können einen Schlüssel/Wert-Speicher zum Modellieren der meisten Datenstrukturen verwenden, wenn Sie Nebenläufigkeitsprobleme ignorieren. Ihre Anforderungen sind nicht ganz klar, daher werde ich einige Annahmen zu Ihrem Anwendungsfall treffen. Hoffentlich, wenn sie falsch sind, können Sie den Ansatz verallgemeinern.

Sie können eine verknüpfte Liste trivialerweise im Speicher erstellen, indem Sie einen bekannten Knoten root (node_root) verwenden, der auf ein Werttupel von {data, prev_key, next_key} zeigt. Die Elemente prev_key und next_key sind Schlüsselnamen, die der Konvention 'node_foo' folgen sollten, wobei foo eine UUID ist (im Idealfall können Sie diese sequenziell generieren, wenn Sie nicht einen anderen Typ von UUID verwenden können). Dies bietet einen geordneten Zugriff auf Ihre Daten.

Jetzt, wenn Sie O (1) Entfernen eines Schlüssels benötigen, können Sie einen zweiten Index für die Struktur mit dem Schlüssel 'data' und dem Wert 'node_foo' für den rechten foo hinzufügen. Dann können Sie die Entfernung genau wie eine verknüpfte Liste im Speicher durchführen. Entfernen Sie den Indexknoten, wenn Sie fertig sind.

Denken Sie daran, dass die gleichzeitige Änderung dieser Liste genauso schlimm ist wie die gleichzeitige Änderung einer gemeinsam genutzten Datenstruktur. Wenn Sie etwas wie BDBs verwenden, können Sie ihre (ausgezeichnete) Transaktionsunterstützung verwenden, um dies zu vermeiden. Für etwas ohne Transaktionen oder Nebenläufigkeitssteuerung möchten Sie externe Sperren oder serialisierte Zugriffe auf einen einzelnen Thread bereitstellen.