Сколько команд jedis pipline выполняет по умолчанию один раз? - PullRequest
0 голосов
/ 17 февраля 2019

Я использовал конвейер jedis для вставки пакета данных в redis.теперь я сталкиваюсь с запутанной проблемой.Я хочу выполнить пакет определенного размера, а затем вызвать sync (), но кажется, что конвейер будет вызывать синхронизацию автоматически приблизительно каждые 200 записей.вот мои коды, может кто-нибудь сказать мне, если есть какие-либо конфигурации по этому поводу?

public class RedisClusterTest {
public static void main(String args[]) throws IOException, InterruptedException {
    String host = args[0];
    int port = Integer.valueOf(args[1]);
    int cnt = Integer.valueOf(args[2]);
    Jedis jedis = new Jedis(host, port);

    Pipeline pip = jedis.pipelined();
    for(int i = 0 ; i < 2000; i++) {
        pip.hset("Server", String.valueOf(i), String.valueOf(i));
        Thread.sleep(10);
    }
    // When it end loop, about 1900 records has already been insert into redis, and the last sync only made last remaining data been sync.
    pip.sync()

1 Ответ

0 голосов
/ 18 февраля 2019

Pipeline не ожидает вашего подтверждения для отправки пакета в Redis.Документация гласит:

Иногда вам нужно отправить кучу разных команд.Очень крутой способ сделать это и иметь лучшую производительность, чем наивный, - использовать конвейерную обработку.Таким образом, вы отправляете команды , не ожидая ответа , и вы фактически читаете ответы в конце, что быстрее.

Суммируя, он говорит, что используется конвейер без ожидания ответа и просто отправляется как поток.

Я взглянул на их исходный код, который подтверждает их документацию.

public Pipeline pipelined() {
  pipeline = new Pipeline();
  pipeline.setClient(client);
  return pipeline;
}

Это возвращает ваш экземпляр Pipeline.Затем вы вызываете группу HSET

public Long hset(final byte[] key, final byte[] field, final byte[] value) {
  checkIsInMultiOrPipeline();
  client.hset(key, field, value);
  return client.getIntegerReply();
}

, которая получает ответ righttaway .

Затем вы вызываете sync , который:

Синхронизировать конвейер, прочитав все ответы.Эта операция закрывает трубопровод.Чтобы получить возвращаемые значения из конвейерных команд, запишите разные ответыкоманд, которые вы выполняете.

Другими словами, он обрабатывает ваш экземпляр конвейера.

Подводя итог, вы не должны использовать «pipelined», если вы ожидаете от него отправки пакетатолько когда вы вызываете синхронизацию.Это не так, как это работает.

...