2013-02-11 33 views
26

According to this thread, Jedis è la cosa migliore da usare se voglio usare Redis da Java.Esiste un'alternativa Java incorporabile a Redis?

Tuttavia, mi chiedevo se ci sono librerie/pacchetti che forniscono operazioni di set efficiente in modo simile a quelli che già esistono in Redis, ma possono essere direttamente incorporati in un'applicazione Java senza la necessità di configurare server separati. (Ad esempio, utilizzando Jetty per il server Web).

Per essere più precisi, vorrei essere in grado di effettuare le seguenti operazioni in modo efficiente:

  1. ci sono un ampio insieme di utenti M (M non è noto in anticipo).
  2. C'è un ampio set di N elementi.
  3. Vogliamo che gli utenti esaminino gli articoli, un utente/elemento alla volta, che produce un risultato memorizzato (in un normale database)
  4. Ogni volta che arriva un utente, vogliamo assegnare a quell'utente l'elemento con il numero minimo di risultati esistenti che l'utente non ha già visto prima. Ciò produce un'assegnazione approssimativa del round-robin degli articoli a tutti gli utenti in arrivo, quando ci interessa solo ottenere tutti gli articoli guardati all'incirca allo stesso numero di volte.

Quanto sopra avviene in modo parallelo. Quando M e N sono grandi, Redis realizza quanto sopra in modo molto più efficiente rispetto alle query SQL. C'è un modo per farlo usando una libreria Java incorporabile che è un po 'più leggera rispetto all'avvio di un server Redis?

Riconosco che è possibile scrivere una pila di codice utilizzando le librerie di concurrency di Java che approssimativamente approssimativamente questo (e in qualche misura, l'ho fatto), ma non è esattamente quello che sto cercando qui.

risposta

11

Dai un'occhiata allo project voldemort. È un archivio di valori-chiave distribuiti creato da Linked-In e supporta la capacità di essere incorporato.

Nella guida di avvio rapido è un piccolo esempio di esecuzione del server incorporato rispetto a stand-alone.

VoldemortConfig config = VoldemortConfig.loadFromEnvironmentVariable(); 
VoldemortServer server = new VoldemortServer(config); 
server.start(); 

Non so molto di Redis, quindi non posso confrontarli con funzionalità. Nel progetto abbiamo usato Voldemort, abbiamo usato il suo backing back store con ottimi risultati. Ci ha permesso di "precompilare" un database bi-giornaliero nel nostro data center di elaborazione e "spedirlo" a centri dati all'avanguardia. In questo modo, ogni data center del bordo aveva una copia locale del set di dati.

EDIT: dopo aver riletto la tua domanda, ho voluto aggiungere Gauva's Table - Questo datastructure tabella può anche essere qualcosa che il tuo cercando ed è simlar a quello che si ottiene con molte basi di dati senza-SQL.

+0

sembra molto interessante ... così posso eseguire un'istanza a un nodo solo per le ricerche locali e roba? Controllerò. –

+0

@AndrewMao Sì, supporta un singolo nodo. E ho aggiunto anche un collegamento alla struttura dati della tabella di Gauva. buona fortuna e buona caccia :-) – eSniff

-5

La libreria Guava di Google fornisce versioni amichevoli degli stessi (e più) set di operatori forniti da redis.

https://code.google.com/p/guava-libraries/wiki/CollectionUtilitiesExplained

esempio

 
    Guava      Redis 
    Sets.intersection(a,b) sinter a b 
    a.count()     scard a 
    Sets.difference(a,b)  sdiff a b 
    Sets.union(a,b)   sunion a b 

multinsiemi sono un proxy ragionevolmente semplice per Redis-set ordinati pure.

+1

Questo sicuramente non risponde alla domanda. Mentre Guava è una libreria generale estremamente utile, non fornisce un archivio di valori-chiave. I risultati di questi metodi devono ancora essere mantenuti in qualche modo. – gyorgyabraham

+2

@gyabraham in realtà, in molti casi d'uso, Redis non sta conservando i dati, altri database lo stanno facendo. È usato solo come un modo veloce per calcolare le query che sarebbe quasi impossibile utilizzare il database. In ogni caso, Guava non può davvero sostituire le funzionalità di Redis. –

+1

Jedis è solo un'API Java per Redis. Il database deve ancora essere avviato esplicitamente al di fuori del processo Java. –

4

Hazelcast fornisce una serie di implementazioni di strutture dati distribuite che possono essere utilizzate come alternativa Java ai servizi di Redis. È quindi possibile spedire un singolo "jar" con tutte le dipendenze necessarie per eseguire l'applicazione. Potrebbe essere necessario regolare le primitive leggermente diverse rispetto a Redis nella propria applicazione.

Le soluzioni commerciali in questo spazio includono Teracotta's Enterprise Ehcache e Oracle Coherence.

0

Dai un'occhiata a lmdb (Lightning Memory Database), perché avevo esattamente bisogno della stessa cosa. Dispongo un'applicazione dropwizard in un contenitore e l'aggiunta di redis o di un'altra dipendenza esterna è dolorosa. Questo sembra funzionare bene, ha una buona attività. fyi, però, non l'ho ancora usato in produzione.

https://github.com/lmdbjava/lmdbjava

Problemi correlati