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
如您所见,这适用于要检查和过期的密钥列表。如果您只需要检查然后使单个密钥过期,则不需要管道。
我正在尝试了解管道的工作原理并且想尝试一些不同的东西。我注意到如果密钥没有,则没有设置过期密钥的方法,所以我用 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
如您所见,这适用于要检查和过期的密钥列表。如果您只需要检查然后使单个密钥过期,则不需要管道。