Redis管道使用

Redis pipeline usage

我正在尝试了解管道的工作原理并且想尝试一些不同的东西。我注意到如果密钥没有,则没有设置过期密钥的方法,所以我用 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();

}

我想知道我应该这样使用还是你有什么想法吗?我找不到任何解决方案。

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

所以你上面的更多"pipeline-y"实现看起来像这样(请原谅确切管道方法名称的任何错误,我主要使用Spring数据而不是直接的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

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