jedis pipline默认执行一次多少个命令?

时间:2019-02-17 13:21:51

标签: java redis jedis

我正在使用jedis管道将一批数据插入redis。现在我面临一个困惑的问题。我想批处理一个特定的大小,然后调用sync(),但似乎管道将大约每200条记录自动调用一次sync。这是我的代码,有人可以告诉我是否有与此相关的配置吗?

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 :(得分:0)

管道不等待您的确认将批次发送到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();
}

谁得到回复立即

然后您调用同步,其中:

  

通过读取所有响应来同步管道。此操作关闭管道。为了从流水线命令中获取返回值,请捕获所执行命令的不同Response <?>。

换句话说,它处理您的管道实例。

总结起来,如果您希望仅在调用sync时发送“批量”,则不应使用“ pipelined”。这不是它的工作原理。