【问题标题】:Redis pipeline usageRedis 管道使用
【发布时间】:2020-08-27 23:43:28
【问题描述】:

我正在尝试了解管道的工作原理,并想尝试不同的东西。我注意到如果密钥没有过期密钥,则没有设置过期密钥的方法,所以我用 Jedis 做了一个例子。

示例

Map<String, Response> responses = new HashMap<>();

long start = System.currentTimeMillis();
try (Jedis resource = redisManager.getResource()) {

    Pipeline pipeline = resource.pipelined();

    responses.put("time", pipeline.ttl(args[1]));

    pipeline.sync();

    pipeline.multi();

    if (responses.get("time").get().equals(-1L)) {
        pipeline.expire(args[1], 15);
    }

    pipeline.exec();

}

我想知道我应该这样使用还是您对此有任何想法?我找不到任何解决方案。

【问题讨论】:

    标签: java redis pipeline jedis ttl


    【解决方案1】:

    如果您在将每个命令发送到管道后同步并获得结果,那么在没有流水线的情况下发送命令并没有太大区别。流水线的好处在于发送许多命令而不等待它们的响应,然后一次读取所有响应(从而消除了等待响应所花费的大量时间。更多信息:https://redis.io/topics/pipelining)。

    所以你上面的一个更“管道-y”的实现看起来像这样(请原谅任何关于确切管道方法名称的错误,我主要使用 Spring Data 而不是直接的 Jedis):

    List<String> keysToCheckForTtl = ...
    Map<String, Response> responses = new HashMap<>();
    
    for (String key : keysToCheckForTtl) {
      responses.put(key, pipeline.ttl(key));
    }
    
    pipeline.sync(); // get the responses back for all TTL commands
    
    for (String key : keysToCheckForTtl) {
      if (responses.get(key).get().equals(-1L)) {
            pipeline.expire(key, 15);
      }
    }
    
    pipeline.exec(); // finalize all expire commands
    

    如您所见,这适用于要检查和过期的密钥列表。如果只需要检查单个密钥并使其过期,则不需要管道。

    【讨论】:

    • 我会检查很多键,然后将 TTL 添加到多键。我应该像上面的例子那样使用吗?
    • 我认为这样的事情(做所有的 TTLs,得到响应,做所有的过期)对你有用。它允许您通过尽可能多地批处理命令来利用管道的性质。由于您需要在过期之前做出响应,因此我认为无法通过删除中间的一个同步来改善这一点。
    • 正如我所提到的,这是解决它的唯一方法。希望redis快点加入这个功能。
    猜你喜欢
    • 2020-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-02
    • 2015-12-26
    • 2012-09-14
    • 2017-11-01
    • 2012-05-21
    相关资源
    最近更新 更多