2012-07-05 6 views
5

Sto utilizzando Jedis (client java) per comunicare con il server Redis. Ho 3 istanze di Redis in esecuzione su tre nodi diversi. Voglio "ottenere" (leggi) alcuni record da 3 istanze di Redis. Voglio emettere questi "si" (legge) in parallelo, e poi fare un po 'di elaborazione sui dati ricevuti e formare un risultato finale.Jedis supporta le operazioni asincrone

Qual è il modo migliore per farlo in java?

Uno dei modi è creare 3 thread e isssue "get" (leggi) in ognuno di essi (in modo sincrono). Attendere il completamento di tutti e 3 i comandi e quindi combinare il risultato.

Jedis dispone di un meccanismo per l'emissione di 3 "ottiene" (qualsiasi comando per tale argomento) in modo asincrono, con una funzione di richiamata?


Ho 3 diverse istanze di Redis. Quindi suggerisci di usare "ShardedJedisPipeline" (jedis/tests/ShardedJedisPipelineTest.java) per interagire con queste istanze di Redis in parallelo?

Normal Jedis Pipeline (jedis/tests/PipeliningTest.java), invia semplicemente più comandi a una singola istanza di Redis in modo che vengano eseguiti uno dopo l'altro sul server Redis (e tutte le risposte disponibili alla fine).

Quindi presumo di dover utilizzare "ShardedJedisPipeline". Ma ci sono due limitazioni a questo: 1. Voglio eseguire lo script Lua, ad esempio "eval" su 3 istanze di Redis in parallelo. 2. Non voglio sharding (un algoritmo di hash usato da Jedis) per distribuire i dati o da solo (usando il suo algoritmo) leggere i dati dalle istanze. Abbiamo una strategia diversa per la distribuzione dei dati. Quindi voglio essere in grado di specificare, un record deve essere memorizzato in quale istanza redis e di conseguenza da dove dovrebbe essere letto. keyTags sembra fornire questo meccanismo ma non è sicuro di come utilizzarlo con "eval".

+0

redis.clients.jedis.Pipeline? –

risposta

2

È possibile utilizzare la pipeline come indicato. AsyncJedis è un lavoro in corso e sarà rilasciato con la prossima versione di Jedis. Sarà basato su netty e sarà compatibile con vert.x

+0

Ho 3 diverse istanze di Redis. Quindi suggerisci di usare "ShardedJedisPipeline" (jedis/tests/ShardedJedisPipelineTest.java) per interagire con queste istanze di Redis in parallelo? Normal Jedis Pipeline (jedis/tests/PipeliningTest.java), invia semplicemente più comandi a una singola istanza di Redis in modo che vengano eseguiti uno dopo l'altro sul server Redis (e tutte le risposte disponibili alla fine). – sunillp

+1

Quindi presumo di dover utilizzare "ShardedJedisPipeline". Ma ci sono due limitazioni a questo: 1. Voglio eseguire lo script Lua e "eval" su 3 istanze di Redis in parallelo. 2. Non voglio sharding (qualche algoritmo di hash usato da Jedis) per distribuire i dati o da solo (usando il suo algoritmo) leggere i dati dalle istanze. Abbiamo una strategia diversa per la distribuzione dei dati. Quindi voglio essere in grado di specificare, un record deve essere memorizzato in quale istanza redis e di conseguenza da dove dovrebbe essere letto. keyTags sembra fornire questo meccanismo ma non è sicuro di come utilizzarlo con "eval". – sunillp

0

Fino ad allora è possibile eseguire il rollover con un ExecutorService con tre istanze di Jedis, quindi attendere i future restituiti.

0

Per quanto riguarda Feb 2015, Jedi a quanto pare non supporta il funzionamento asincrono su una singola istanza Redis di cui hai bisogno: https://github.com/xetorthio/jedis/issues/241

Quello che vorrei fare nel tuo caso è andare avanti con 3 fili e procedere con Futures ed esecutore Servizio come @Xorlev suggerito sopra.