大厂都是怎么做Redis重试的?
1 引发暂时性故障的原因
1.1 故障触发了高可用机制
1.2 慢查询引起了请求堵塞
1.3 复杂的网络环境
2 推荐的重试准则
2.1 仅重试幂等的操作
2.2 适当的重试次数与间隔
2.3 避免重试嵌套
2.4 记录重试异常并打印失败报告
3 Jedis
3.1 添加 Jedis 的 Pom 依赖
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>5.0.0</version>
</dependency>
3.2 重试实战
① 标准架构实例或集群架构代理(Proxy)模式
PooledConnectionProvider provider = new PooledConnectionProvider(HostAndPort.from("127.0.0.1:6379"));
int maxAttempts = 5; // 最大重试次数
Duration maxTotalRetriesDuration = Duration.ofSeconds(10); // 最大的重试时间
UnifiedJedis jedis = new UnifiedJedis(provider, maxAttempts, maxTotalRetriesDuration);
try {
System.out.println("set key: " + jedis.set("key", "value"));
} catch (Exception e) {
// 表示尝试maxAttempts次或到达了最大查询时间maxTotalRetriesDuration仍旧没有访问成功。
e.printStackTrace();
}
② 集群架构直连模式
HostAndPort hostAndPort = HostAndPort.from("127.0.0.1:30001");
int connectionTimeout = 5000;
int soTimeout = 2000;
int maxAttempts = 5;
ConnectionPoolConfig config = new ConnectionPoolConfig();
JedisCluster jedisCluster = new JedisCluster(hostAndPort, connectionTimeout, soTimeout, maxAttempts, config);
try {
System.out.println("set key: " + jedisCluster.set("key", "value"));
} catch (Exception e) {
// 表示尝试maxAttempts之后仍旧没有访问成功。
e.printStackTrace();
}
4 Redisson
retryAttempts:重试次数,默认为 3。
retryInterval:重试间隔,默认为 1,500 毫秒。
Config config = new Config();
config.useSingleServer()
.setTimeout(1000)
.setRetryAttempts(3)
.setRetryInterval(1500) //ms
.setAddress("redis://127.0.0.1:6379");
RedissonClient connect = Redisson.create(config);
5 StackExchange.Redis
var conn = ConnectionMultiplexer.Connect("redis0:6380,redis1:6380,connectRetry=3");
6 Lettuce
at-most-once execution:命令最多执行 1 次,即 0 次或 1 次,如果连接断开并重新连接,命令可能会丢失。
at-least-once execution(默认):最少成功执行 1 次,即可能会在执行时进行多次尝试,保障最少成功执行 1 次。使用此策略时,如果 Tair 实例发生了主备切换,此时客户端可能累积了较多的重试命令,主备切换完成后可能会引发 Tair 实例的 CPU 使用率激增。
更多信息,请参见 Client-Options(https://github.com/lettuce-io/lettuce-core/wiki/Client-Options) 和 Command execution reliability(https://github.com/lettuce-io/lettuce-core/wiki/Command-execution-reliability)。
clientOptions.isAutoReconnect() ? Reliability.AT_LEAST_ONCE : Reliability.AT_MOST_ONCE;
https://help.aliyun.com/zh/redis/use-cases/retry-mechanisms-for-redis-clients 通过客户端程序连接 Redis 客户端程序 TLS(SSL)加密连接 Redis
END
微信扫码关注该文公众号作者
戳这里提交新闻线索和高质量文章给我们。
来源: qq
点击查看作者最近其他文章