guava-retrying模块实现redis连接重试
guava-retrying是一个优秀的连接重试工具,最近项目也在多处使用这个工具做相应模块的连接,其中关于redis的连接重试比较有意思。这里分享下。
原代码:
Jedis jedis = jedisPool.getResource();
return jedis;
使用guava-retrying优化后的代码
final Jedis[] jedis= {null};
//创建重试对象
Retryer<Boolean> retryer = RetryerBuilder.<Boolean>newBuilder()
.retryIfException()
//每次重试等待时间1s
.withWaitStrategy(WaitStrategies.fixedWait(1000, TimeUnit.MILLISECONDS))
//重试次数10
.withStopStrategy(StopStrategies.stopAfterAttempt(10))
.build();
try {
retryer.call(() -> {
jedis[0] = jedisPool.getResource();
String value = jedis[0].ping();
return StringUtils.isNotBlank(value);
});
} catch (Exception e) {
LOGGER.error("多次获取Redis连接失败!");
}
return jedis[0];
分析:
之前已经使用guava-retrying实现对HBase和OpenTSDB的重试,现在优化中尝试对Redis能进行重试连接,但在实现中遇到了两个问题
1是无法用简单的true和false判断jedis连接是否正常。
2是该方法重试后需要返回整个jedis对象。
第一个问题在于jedis的很多方法无法返回true和false,需要添加逻辑。最后选择了想到了ping,可以根据返回是否为null判断连接是否成功。
第二个问题在于retryer.call和整个方法的返回不一致,后面改写了lambda表达式完成了该方法的实现。
guava-retrying参考资料:https://blog.csdn.net/dxh0823/article/details/80850367