2012-07-05 6 views
5

Я использую Jedis (java client) для связи с сервером Redis. У меня три экземпляра Redis, работающих на трех разных узлах. Я хочу «получить» (прочитать) некоторые записи из 3 экземпляров Redis. Я хочу выпустить эти «получает» (чтение) параллельно, а затем выполнить некоторую обработку полученных данных и сформировать окончательный вывод.Поддерживает ли Jedis асинхронные операции

Каков наилучший способ сделать это в java?

Один из способов - создать 3 потока и isssue «get» (прочитать) в каждом из них (синхронно). Дождитесь завершения всех трех команд, а затем объедините результат.

Есть ли у Jedis механизм для выдачи 3 «получает» (любая команда в этом случае) асинхронно с функцией обратного вызова?


У меня есть 3 разных экземпляра Redis. Так вы предлагаете использовать «ShardedJedisPipeline» (jedis/tests/ShardedJedisPipelineTest.java) для взаимодействия с этими экземплярами Redis параллельно?

Обычный Jedis Pipeline (jedis/tests/PipeliningTest.java) просто отправляет несколько команд одному экземпляру Redis, поэтому они выполняются один за другим на сервере Redis (и все ответы доступны в конце).

Поэтому я предполагаю, что мне нужно использовать «ShardedJedisPipeline». Но есть два ограничения на это: 1. Я хочу выполнить сценарий Lua, т. Е. «Eval» на трех экземплярах Redis параллельно. 2. Я не хочу, чтобы шрайдинг (некоторый алгоритм хеширования, используемый Джедаем) для распространения данных или сам по себе (с использованием его алгоритма) чтения данных из экземпляров. У нас есть другая стратегия распространения данных. Поэтому я хочу иметь возможность указать, запись должна быть сохранена в экземпляре redis и, соответственно, откуда он должен быть прочитан. keyTags, похоже, обеспечивает этот механизм, но не уверен, как использовать его с помощью «eval».

+0

redis.clients.jedis.Pipeline? –

ответ

2

Вы можете использовать трубопровод, как упомянуто. AsyncJedis - это работа, и она будет выпущена со следующей версией Jedis. Он будет основан на netty и будет совместим с vert.x

+0

У меня есть 3 разных экземпляра Redis. Так вы предлагаете использовать «ShardedJedisPipeline» (jedis/tests/ShardedJedisPipelineTest.java) для взаимодействия с этими экземплярами Redis параллельно? Обычный Jedis Pipeline (jedis/tests/PipeliningTest.java) просто отправляет несколько команд одиночному экземпляру Redis, поэтому они выполняются один за другим на сервере Redis (и все ответы доступны в конце). – sunillp

+1

Итак, я предполагаю, что мне нужно использовать «ShardedJedisPipeline». Но для этого есть два ограничения: 1. Я хочу выполнить сценарий Lua, т. Е. «Eval» на трех экземплярах Redis параллельно. 2. Я не хочу, чтобы sharding (некоторый алгоритм хеширования, используемый Jedis) для распространения данных или самостоятельно (используя его алгоритм), считывал данные из экземпляров. У нас есть другая стратегия распространения данных. Поэтому я хочу иметь возможность указать, запись должна быть сохранена в экземпляре redis и, соответственно, откуда он должен быть прочитан. keyTags, похоже, обеспечивает этот механизм, но не уверен, как использовать его с помощью «eval». – sunillp

0

До тех пор вы можете свернуть его самостоятельно с помощью ExecutorService с тремя экземплярами Jedis, а затем ждать возвращенных фьючерсов.

0

Насколько февраля 2015 года, Jedis по-видимому, не поддерживает асинхронной операции над одной Redis, например, как вам нужно: https://github.com/xetorthio/jedis/issues/241

Что я буду делать в вашем случае идти вперед с 3 потоками и приступить к фьючерсам и Исполнителю Сервис, предложенный выше.

Смежные вопросы