美文网首页
redis网络波动,Jedis/Lettuce是阻塞还是失败?

redis网络波动,Jedis/Lettuce是阻塞还是失败?

作者: 小胖学编程 | 来源:发表于2021-08-02 11:06 被阅读0次

    当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. 测试流程

    1. 启动服务,调用访问Redis的http;
    2. kill掉Redis服务端,调用访问Redis的http;
    3. 恢复Redis服务端,调用访问Redis的http;
    服务端模拟操作.png
    • Redis服务端挂掉后,Jedis请求立即失败
    jedis客户端的请求.png
    • Redis服务端挂掉后,Lettuce请求会被阻塞


      image.png
    image.png

    3. 最终结论

    无论是Jedis客户端还是Lettuce客户端,当Redis服务器恢复后,均无需重启项目,项目的Redis访问请求即可恢复。

    但是:Jedis客户端的请求会立刻失败;Lettuce的请求会被阻塞,由定时发起reconnect操作。

    相关文章

      网友评论

          本文标题:redis网络波动,Jedis/Lettuce是阻塞还是失败?

          本文链接:https://www.haomeiwen.com/subject/uaidvltx.html