2015-03-09 5 views
6

Es wäre toll, wenn mir jemand vorschlagen könnte, was der beste Weg wäre, um eine Liste von Java-Objekten in Redis zu speichern.Der beste Weg, um eine Liste von Java-Objekten in Redis zu speichern

Momentan konvertiere ich die Java-Objekte in JSON-Zeichenketten und speichere diese Zeichenketten in Redis, und ich habe in Redis festgelegt, all diese zu verfolgen.

Für zB: -

SET student:1 '{"name":"testOne","stream":computer science}' 
SET student:2 '{"name":"testTwo","stream":electronics}' 
SADD students 1 
SADD students 2 

Also, wann immer ich die Liste der Studenten holen will, muss ich zuerst den Satz students und dann über sie iterieren und die json Saiten an diesen Schlüssel erhalten.

Ich frage mich nur, ob es eine andere, bessere Möglichkeit gibt, das Szenario des Speicherns einer Liste von Java-Objekten in Redis zu behandeln.

(Ich verwende redis als Cache)

Antwort

6

Wenn Sie nicht brauchen, Ihre Java-Objekte in redis (Indexierung, scores ...) gespeichert abfragen, dann können Sie nur serialisiert sie zu einem bytearray mit einer Bibliothek (zum Beispiel Kryo) und speichern sie in einem String in redis . Beachten Sie, dass Sie eine ganze Sammlung von Java-Objekten in einer redis-Zeichenfolge serialisieren können. Denken Sie nur daran, welche Klasse es ist (Sammlungsart + Objekttyp), wenn Sie die Deserialisierung durchführen möchten. Sie können z. B. einen cleveren Schlüsselnamen definieren.

JSON verwendet nur mehr Speicherplatz und ist netzwerkintensiver als andere binäre Marshalling-Formate. Wenn Sie keine Abfragen oder für Menschen lesbare Daten in redis benötigen, ist es in Ordnung (und leistungsfähiger), binäre Daten zu speichern wieder auf. Wenn Sie die Jedis-Bibliothek verwenden (wie Sie sie getaggt haben), haben Sie Methoden auf Jedis, die Bytearrays als Parameter anstelle von Java-Strings verwenden, um Daten als C-String an Redis zu senden (kein Datenverlust im Prozess)).

3

Redis mehr als ein einfacher Speicher Schlüsselwert ist. Sie können Hashes strukturierte Daten in redis speichern verwenden

HMSET Schüler: 1 Namen „testone“ Strom „Informatik“ http://redis.io/commands/hmset

alle Inhalte des Hash-Anruf HGETALL Schüler zu erhalten: 1
können Sie auch Einzelwerte von Hashes mit hget erhalten
Beispiel hget Student: 1 Name

+0

Ich bin eigentlich auf der Suche nach einer Liste von Java-Objekten zu speichern und sie abrufen, wenn sie jemals benötigt werden. Außerdem wollte ich die Anzahl der Abfragen minimieren, um die Liste abzurufen, also entschied ich mich, json-Strings zu verwenden, um die Objekte zu speichern, wodurch ich MGET verwenden und alle Schlüssel auf einmal bekommen kann. Wenn ich Hashes verwende, um meine Java-Objekte zu speichern, kann ich nicht alle Elemente der Liste der Java-Objekte auf einmal abrufen. –

+0

Wenn Sie sie nicht geordnet speichern möchten, können Sie einen SET verwenden, um die Schlüssel des Hash zu speichern. Sie können ein LUA-Skript verwenden, um sie in einem Schritt abzurufen Das Problem mit Ihrem Ansatz: -Update und löschen Sie nur auf der Clientseite möglich. -> schlechte Multi-User-Unterstützung – Lugg

1

Sie können es einfach mit Redisson tun. Es ist ein Redis-basiertes Framework für Java, das viele populäre Codecs (Jackson JSON, Avro, Smile, CBOR, MsgPack, Kryo, FST, LZ4, Snappy und JDK Serialization) und Redis Verbindungsmodi wie Cluster, Sentinel, AWS Elasticache unterstützt.

Hier ist ein Beispiel, wie Objekt-Liste speichern Java:

RList<SomeObject> list = redisson.getList("anyList"); 
list.add(new SomeObject(1)); 
list.add(new SomeObject(2)); 

RList Schnittstelle implementiert auch java.util.List Schnittstelle. Ziemlich einfach, oder?