2012-07-05 31 views
5

Redis sunucusuyla iletişim kurmak için Jedis (java istemcisi) kullanıyorum. Üç farklı düğümde çalışan 3 Redis örneğim var. 3 Redis örneğinden bazı kayıtları almak (okumak) istiyorum. Bunları paralel olarak "alır" (okuma) yapmak ve daha sonra alınan veriler üzerinde işlem yapmak ve son bir çıktı oluşturmak istiyorum.Jedis, asenkron işlemleri destekliyor mu

Bunu java'da yapmanın en iyi yolu nedir? Yollardan biri, her birinde (eşzamanlı olarak) 3 konu ve isssue "get" (okuma) oluşturmaktır. 3 komutun tamamlanmasını ve ardından sonucu birleştirmesini bekleyin.

Jedis, bir geri arama özelliği ile 3 "alır" (bu konuyla ilgili herhangi bir komut) eşzamansız olarak yayınlamak için bir mekanizmaya sahip midir?


3 farklı Redis örneğim var. Yani bu Redis örnekleri ile paralel olarak etkileşimde bulunmak için "ShardedJedisPipeline" (jedis/tests/ShardedJedisPipelineTest.java) kullanılmasını önerir misiniz?

Normal Jedis Pipeline (jedis/tests/PipeliningTest.java), tek bir Redis örneğine birden çok komut gönderir, böylece Redis sunucusunda birbiri ardına çalıştırılır (ve sonunda tüm yanıtlar).

"ShardedJedisPipeline" kullanmam gerektiğini varsayalım. Ancak bunun iki sınırlaması vardır: 1. Lua komutunu yani "eval" i 3 paralelde paralel olarak yürütmek istiyorum. 2. Verileri dağıtmak için (Jedis tarafından kullanılan bazı karma algoritmalar), veriyi veya kendi başına (algoritmasını kullanarak) okuma verilerini örneklerden istemiyorum. Verileri dağıtmak için farklı bir stratejimiz var. Bu yüzden, belirtmek istediğim bir kayıt, hangi redis örneğinin ve buna göre okunması gereken bir yerde saklanmalıdır. keyTags bu mekanizmayı sağladığından, ancak bunu "eval" ile nasıl kullanacağınızdan emin değil gibi görünüyor.

+0

redis.clients.jedis.Pipeline? –

cevap

2

Belirtildiği gibi boru hattını kullanabilirsiniz. AsyncJedis bir çalışmadır ve bir sonraki Jedis sürümü ile piyasaya sürülecektir. Bu, netty tabanlı olacak ve vert.x

+0

3 farklı Redis örneğim var. Yani bu Redis örnekleri ile paralel olarak etkileşimde bulunmak için "ShardedJedisPipeline" (jedis/tests/ShardedJedisPipelineTest.java) kullanılmasını önerir misiniz? Normal Jedis Pipeline (jedis/tests/PipeliningTest.java), tek bir Redis örneğine birden çok komut gönderir, böylece Redis sunucusunda birbiri ardına çalıştırılır (ve sonunda tüm yanıtlar). – sunillp

+1

Yani "ShardedJedisPipeline" kullanmam gerektiğini varsayalım. Ancak bunun iki kısıtlaması vardır: 1. Lua betiğini yani "eval" i 3 Redis örneğinde paralel olarak yürütmek istiyorum. 2. Veriyi dağıtmak (kendi algoritmasını kullanarak) ve veriyi örneklerden okumak için sharding (Jedis tarafından kullanılan bazı karma algoritmalar) istemiyorum. Verileri dağıtmak için farklı bir stratejimiz var. Bu yüzden, belirtmek istediğim bir kayıt, hangi redis örneğinin ve buna göre okunması gereken bir yerde saklanmalıdır. keyTags bu mekanizmayı sağladığından, ancak bunu "eval" ile nasıl kullanacağınızdan emin değil gibi görünüyor. – sunillp

0

ile uyumlu olacak, o zamana kadar üç Jedis örneğiyle bir ExecutorService ile kendiniz yuvarlayabilir, daha sonra iade edilen gelecekleri bekleyebilirsiniz.

0

Bildiğim kadarıyla Feb 2015 olarak, Jedi'ler görünüşe istediğiniz kadar tek Redis örneği üzerinde zaman uyumsuz işlemi desteklemiyor: https://github.com/xetorthio/jedis/issues/241

Ben 3 parçacığı ile devam edin ve Vadeli İşlem ve Executor devam edilir senin durumda yapacağı şeyi Yukarıda @Xorlev olarak önerilen hizmet.