2012-07-05 20 views
5

Estoy usando Jedis (cliente Java) para comunicarme con el servidor Redis. Tengo 3 instancias de Redis ejecutándose en tres nodos diferentes. Quiero "obtener" (leer) algunos registros de 3 instancias de Redis. Deseo emitir estos "get" (lecturas) en paralelo, y luego hacer algún procesamiento en los datos recibidos y formar un resultado final.¿Jedis admite operaciones asincrónicas

¿Cuál es la mejor manera de hacer esto en java?

Una de las maneras es crear 3 hilos y emitir "obtener" (leer) en cada uno de ellos (sincrónicamente). Espere a que se completen los 3 comandos y luego combine el resultado.

¿Tiene Jedis un mecanismo para emitir 3 "obtiene" (cualquier comando para el caso) de forma asíncrona, con una función de devolución de llamada?


Tengo 3 diferentes instancias de Redis. Entonces, ¿sugiere utilizar "ShardedJedisPipeline" (jedis/tests/ShardedJedisPipelineTest.java) para interactuar con estas instancias de Redis en paralelo?

Normal Jedis Pipeline (jedis/tests/PipeliningTest.java), simplemente envía varios comandos a la instancia individual de Redis para que se ejecuten uno después de otro en el servidor Redis (y todas las respuestas disponibles al final).

Así que supongo que tengo que usar "ShardedJedisPipeline". Pero hay dos limitaciones para esto: 1. Deseo ejecutar el script Lua, es decir, "eval" en 3 instancias de Redis en paralelo. 2. No quiero fragmentación (Algún algoritmo hash utilizado por Jedis) para distribuir datos o por sí mismo (utilizando su algoritmo) Leer datos de instancias. Tenemos una estrategia diferente para distribuir datos. Así que quiero poder especificar, se debe almacenar un registro en la instancia de redis y, por consiguiente, desde donde se debe leer. keyTags parece proporcionar este mecanismo, pero no está seguro de cómo usar esto con "eval".

+0

redis.clients.jedis.Pipeline? –

Respuesta

2

Puede utilizar la tubería como se menciona. AsyncJedis es un trabajo en progreso y se lanzará con la próxima versión de Jedis. Se basará en netty y será compatible con vert.x

+0

Tengo 3 instancias de Redis diferentes. Entonces, ¿sugiere utilizar "ShardedJedisPipeline" (jedis/tests/ShardedJedisPipelineTest.java) para interactuar con estas instancias de Redis en paralelo? Normal Jedis Pipeline (jedis/tests/PipeliningTest.java), simplemente envía varios comandos a la instancia única de Redis para que se ejecuten uno después del otro en el servidor Redis (y todas las respuestas disponibles al final). – sunillp

+1

Así que supongo que tengo que usar "ShardedJedisPipeline". Pero hay dos limitaciones a esto: 1. Quiero ejecutar el script de Lua, es decir, "eval" en 3 instancias de Redis en paralelo. 2. No quiero fragmentación (algún algoritmo hash utilizado por Jedis) para distribuir datos o por sí mismo (utilizando su algoritmo) leer datos de instancias. Tenemos una estrategia diferente para distribuir datos. Así que quiero poder especificar, se debe almacenar un registro en la instancia de redis y, por consiguiente, desde donde se debe leer. keyTags parece proporcionar este mecanismo, pero no está seguro de cómo usar esto con "eval". – sunillp

0

Hasta entonces puede realizarlo usted mismo con un ExecutorService con tres instancias de Jedis, y luego esperar los futuros que se devuelven.

0

En lo que Feb 2015, Jedis al parecer no es compatible con el funcionamiento asíncrono a través de una única instancia Redis como sea necesario: https://github.com/xetorthio/jedis/issues/241

Lo que yo haría en su caso es seguir adelante con 3 hilos y proceder con Futuros y Ejecutor Servicio como @Xorlev sugerido arriba.

Cuestiones relacionadas