【问题标题】:How many commands does jedis pipline exec one time by default?redis pipeline exec 默认一次执行多少条命令?
【发布时间】:2019-02-18 16:53:58
【问题描述】:

我正在使用 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()

【问题讨论】:

    标签: java redis jedis


    【解决方案1】:

    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();
    }
    

    马上得到回复。

    然后你调用 sync 其中:

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

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

    总而言之,如果您希望它仅在调用同步时发送批处理,则不应使用“流水线”。这不是它的工作方式。

    【讨论】:

    • 很好的解释。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2017-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-18
    • 2012-08-31
    • 2016-11-10
    相关资源
    最近更新 更多