当Redis服务端网络波动或者挂掉重启后,Redis的客户端需要重启项目吗?大家肯定都说:肯定不需要重启呀,那么Redis的两种客户端:Jedis和Lettuce针对Redis网络波动或者挂掉重启,有什么失败策略呢?
1. 环境信息
Redis服务器环境:单点配置
Redis客户端环境:Jedis/Lettuce配置
配置信息如下:
@Bean
@Primary
public StringRedisTemplate stringRedisTemplate(@Qualifier("jedisConnectionFactory") RedisConnectionFactory connectionFactory) {
StringRedisTemplate stringRedisTemplate = new StringRedisTemplate();
stringRedisTemplate.setConnectionFactory(connectionFactory);
return stringRedisTemplate;
}
Jedis连接工厂的配置:
@Bean("connectionFactory")
public LettuceConnectionFactory redisConnectionFactory() throws UnknownHostException {
RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration();
redisStandaloneConfiguration.setHostName("localhost");
redisStandaloneConfiguration.setPort(6379);
LettuceClientConfiguration.LettuceClientConfigurationBuilder lettuceClientConfigurationBuilder = LettuceClientConfiguration.builder();
LettuceConnectionFactory factory = new LettuceConnectionFactory(redisStandaloneConfiguration,
lettuceClientConfigurationBuilder.build());
return factory;
}
lettuce连接工厂的配置:
@Bean("connectionFactory")
public JedisConnectionFactory redisConnectionFactory() {
RedisStandaloneConfiguration configuration = new RedisStandaloneConfiguration();
configuration.setHostName("localhost");
configuration.setPort(6379);
configuration.setDatabase(0);
JedisClientConfiguration.JedisPoolingClientConfigurationBuilder builder = (JedisClientConfiguration.JedisPoolingClientConfigurationBuilder) JedisClientConfiguration.builder();
return new JedisConnectionFactory(configuration, builder.build());
}
2. 测试流程
- 启动服务,调用访问Redis的http;
- kill掉Redis服务端,调用访问Redis的http;
- 恢复Redis服务端,调用访问Redis的http;
- Redis服务端挂掉后,Jedis请求立即失败
-
Redis服务端挂掉后,Lettuce请求会被阻塞
image.png
3. 最终结论
无论是Jedis客户端还是Lettuce客户端,当Redis服务器恢复后,均无需重启项目,项目的Redis访问请求即可恢复。
但是:Jedis客户端的请求会立刻失败;Lettuce的请求会被阻塞,由定时发起reconnect操作。
网友评论