2015-03-09 25 views
6

Sarebbe bello se qualcuno potesse suggerirmi su quale sarebbe il modo migliore per memorizzare un elenco di oggetti java in Redis.Il modo migliore per memorizzare un elenco di oggetti java in Redis

Attualmente, sto convertendo gli oggetti java in stringhe json e memorizzando quelle stringhe in Redis e ho un set in Redis per tenere traccia di tutti questi.

Per esempio: -

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

Così, quando mai io voglio andare a prendere l'elenco degli studenti, in primo luogo ho ottenere il set students e poi scorrere su di esso e ottenere le stringhe JSON in quelle chiavi.

Basta chiedersi se esiste un altro modo migliore per gestire lo scenario di archiviazione di un elenco di oggetti java su Redis.

(sto usando Redis come cache)

risposta

6

Se non avete bisogno di interrogare i tuoi oggetti Java memorizzati nella Redis (indicizzazione, i punteggi ...), allora si può solo li serializzare in un ByteArray con una libreria (per esempio Kryo) e memorizzarli in una stringa in redis . Si noti che è possibile serializzare un'intera raccolta di oggetti java in una stringa redis, basta ricordare quale classe è (tipo di raccolta + tipo di oggetto) quando si deserializza, per esempio è possibile definire un nome chiave intelligente per questo scopo.

JSON utilizzerà solo più spazio e sarà più intenso rispetto alla rete rispetto ad altri formati di marshalling binario, se non è necessario eseguire query o dati leggibili in redis, allora è corretto (e più performante) memorizzare dati binari in Redis.

Si noti che se si utilizza la libreria jedis (come lo si è taggato) si dispone di metodi su Jedis che vengono utilizzati da reflear come parametri anziché stringhe Java per inviare dati come C-String a Redis (nessuna perdita di dati nel processo).

3

Redis è più di un semplice negozio di valore chiave. È possibile utilizzare gli hash per memorizzare i dati strutturati in Redis

HMSET studente: 1 nome "testone" stream "computer science" http://redis.io/commands/hmset

per ottenere tutti i contenuti dello studente hash chiamata HGETALL: 1
è anche possibile ottenere i valori singoli di hash con HGET
ESEMPIO HGET studente: 1 nome

+0

In realtà sto cercando di memorizzare un elenco di oggetti java e recuperarli quando è necessario. Inoltre volevo ridurre al minimo il numero di query per recuperare l'elenco, quindi ho scelto di utilizzare le stringhe json per archiviare gli oggetti che mi consentono di utilizzare MGET e ottenere tutte le chiavi in ​​una volta sola. Se utilizzo gli hash per archiviare i miei oggetti java, non riesco a ottenere tutti gli elementi dell'elenco di oggetti java in un colpo solo. –

+0

Se si desidera memorizzarli non ordinati, è possibile utilizzare un SET per memorizzare le chiavi dell'hash. È possibile utilizzare uno script LUA per recuperarli in una volta Il problema con il proprio approccio: -Aggiornare ed eliminare solo possibile sul lato client. -> cattivo supporto multiutente – Lugg

1

È possibile farlo facilmente con Redisson. È un framework basato su Redis per Java che supporta molti codec popolari (Jackson JSON, Avro, Smile, CBOR, MsgPack, Kryo, FST, LZ4, Snappy e Serializzazione JDK) e modalità di connessione Redis come Cluster, Sentinel, AWS Elasticache.

Ecco un esempio di come memorizzare oggetto Java alla lista:

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

RList implementa anche java.util.List interfaccia. Abbastanza facile, vero?