2012-07-05 35 views
5

Tôi đang sử dụng Jedis (máy khách java) để kết nối với máy chủ Redis. Tôi có 3 phiên bản Redis chạy trên ba nút khác nhau. Tôi muốn "có được" (đọc) một số hồ sơ từ 3 trường hợp Redis. Tôi muốn phát hành các "được" (đọc) song song, và sau đó làm một số xử lý trên các dữ liệu nhận được và tạo thành một đầu ra cuối cùng.Jedis có hỗ trợ hoạt động không đồng bộ

Cách tốt nhất để làm điều này trong java là gì?

Một trong những cách là tạo 3 chuỗi và phát hành "đọc" (đọc) trong mỗi thư mục (đồng bộ). Chờ cho tất cả 3 lệnh để hoàn thành và sau đó kết hợp kết quả.

Jedis có cơ chế phát hành 3 "được" (bất kỳ lệnh nào cho vấn đề đó) không đồng bộ, với tính năng gọi lại không?


Tôi có 3 phiên bản Redis khác nhau. Vì vậy, bạn có đề xuất sử dụng "ShardedJedisPipeline" (jedis/tests/ShardedJedisPipelineTest.java) để tương tác với các trường hợp Redis này song song không?

Đường ống Jedis bình thường (jedis/tests/PipeliningTest.java), chỉ gửi nhiều lệnh tới một phiên bản Redis duy nhất để chúng được thực thi sau khi trên máy chủ Redis (và tất cả các phản hồi có sẵn ở cuối).

Vì vậy, tôi giả sử tôi phải sử dụng "ShardedJedisPipeline". Nhưng có hai giới hạn cho điều này: 1. Tôi muốn thực thi kịch bản lệnh Lua tức là "eval" trên 3 phiên bản Redis song song. 2. Tôi không muốn sharding (một số thuật toán băm được sử dụng bởi Jedis) để phân phối dữ liệu hoặc ngày của riêng mình (sử dụng thuật toán của nó) đọc dữ liệu từ các cá thể. Chúng tôi có một chiến lược khác để phân phối dữ liệu. Vì vậy, tôi muốn để có thể xác định, một bản ghi nên được lưu trữ trong đó redis dụ và phù hợp từ nơi nó cần được đọc. keyTags dường như cung cấp cơ chế này nhưng không chắc chắn làm thế nào để sử dụng điều này với "eval".

+0

redis.clients.jedis.Pipeline? –

Trả lời

2

Bạn có thể sử dụng đường ống như đã đề cập. AsyncJedis là một tác phẩm đang được tiến hành và sẽ được phát hành với phiên bản tiếp theo của Jedis. Nó sẽ dựa trên netty và sẽ tương thích với vert.x

+0

Tôi có 3 phiên bản Redis khác nhau. Vì vậy, bạn có đề xuất sử dụng "ShardedJedisPipeline" (jedis/tests/ShardedJedisPipelineTest.java) để tương tác với các trường hợp Redis này song song không? Đường ống Jedis bình thường (jedis/tests/PipeliningTest.java), chỉ gửi nhiều lệnh tới một cá thể Redis duy nhất để chúng được thực thi sau khi trên máy chủ Redis (và tất cả các phản hồi có sẵn ở cuối). – sunillp

+1

Vì vậy, tôi giả sử tôi phải sử dụng "ShardedJedisPipeline". Nhưng có hai giới hạn cho điều này: 1. Tôi muốn thực thi kịch bản lệnh Lua tức là "eval" trên 3 phiên bản Redis song song. 2. Tôi không muốn sharding (một số thuật toán băm được sử dụng bởi Jedis) để phân phối dữ liệu hoặc ngày của riêng mình (sử dụng thuật toán của nó) đọc dữ liệu từ các cá thể. Chúng tôi có một chiến lược khác để phân phối dữ liệu. Vì vậy, tôi muốn để có thể xác định, một bản ghi nên được lưu trữ trong đó redis dụ và phù hợp từ nơi nó cần được đọc. keyTags dường như cung cấp cơ chế này nhưng không chắc chắn làm thế nào để sử dụng điều này với "eval". – sunillp

0

Cho đến lúc đó bạn có thể tự cuộn nó với một ExecutorService với ba phiên bản Jedis, sau đó chờ đợi tương lai được trả về.

0

Theo như tháng 2 năm 2015, Jedis dường như không hỗ trợ hoạt động Async qua một trường hợp redis duy nhất là bạn cần: https://github.com/xetorthio/jedis/issues/241

Những gì tôi sẽ làm gì trong trường hợp của bạn là đi trước với 3 chủ đề và điền đầy đủ Futures và Executor Dịch vụ dưới dạng @Xorlev được đề xuất ở trên.

Các vấn đề liên quan