当前位置: 首页 > 知识库问答 >
问题:

使用带有RedisTemplate的Lettuce引发异常

尤钱明
2023-03-14

我试图弄清楚为什么Lettuce会给我带来这么多问题,而我正在运行我的性能测试,将它与Jedis进行比较。

我使用spring-data-redis1.8.11.release,并为通过Redistemplate访问redis的接口创建了自定义代理bean。Redis运行在AWS中,我使用AWS提供的集群配置endpoint作为节点,它有3个主节点和3个从节点。在性能测试过程中没有发生任何特殊情况。我只是调用一个使用Redistemplate从redis读取值的服务。

当使用JedisConnectionFactory时,测试总是无例外地通过,但是当我切换到LettuceConnnectionFactory时,我无法完成任何测试,因为通道初始化总是超时。我将超时增加到30s,并调整了关机计时器,就像我以前得到线程中断异常一样。然而,即使是30s,它仍然会超时。我试过使用共享本机连接和不使用多个不同的超时值,它们都导致了相同的问题。

连接工厂bean的代码

@Bean
public RedisConnectionFactory lettuceConnectionFactory() {
    RedisClusterConfiguration clusterConfig = new RedisClusterConfiguration(Arrays.asList(cacheProps.nodes));
    clusterConfig.setMaxRedirects(6);
    LettuceConnectionFactory factory = new LettuceConnectionFactory(clusterConfig);
    factory.setTimeout(30000);
    factory.setShutdownTimeout(20000);
    return factory;
}

我尝试调整ClientResources的线程计数,但仍然会继续出现超时错误:

ClientResources res = DefaultClientResources.builder()
            .ioThreadPoolSize(10)
            .computationThreadPoolSize(10)
            .build();
BoundHashOperations<Object, Object, Object> hashOps = redisTemplate.boundHashOps(request.getHashKey());
String data = (String) hashOps.get(request.getSubKey());
long timeout = request.getTtl();
try {
    if (timeout != 0) {
        hashOps.expire(timeout, request.getTimeUnit());
    }
    return mapper.readValue(data, request.getType());
} catch (Exception e) {
    logger.error("Exception for hash value read.", e);
}

测试时出现异常的根本原因:

Caused by: io.netty.channel.ConnectTimeoutException: connection timed out: /x.x.x.x:6379
at io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe$1.run(AbstractNioChannel.java:216)
at io.netty.util.concurrent.PromiseTask$RunnableAdapter.call(PromiseTask.java:38)
at io.netty.util.concurrent.ScheduledFutureTask.run(ScheduledFutureTask.java:120)
at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:408)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:402)
at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:140)
at io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:144)

我错过了什么?从我读到的所有东西来看,每个人似乎都更喜欢生菜,但从我的测试中我看不出为什么。

共有1个答案

秦才良
2023-03-14

尝试连接池和管道

  private GenericObjectPoolConfig getPoolConfig() {
    GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
    //All below should use the propertysources;
    poolConfig.setMaxTotal(20);
    poolConfig.setMaxIdle(20);
    poolConfig.setMinIdle(0);
    return poolConfig;
  }

  @Bean
  @Primary
  public RedisConnectionFactory redisConnectionFactory() {
    DefaultLettucePool lettucePool = new DefaultLettucePool(redisHost, Integer.valueOf(redisPort).intValue(), getPoolConfig());
    lettucePool.setPassword(redisPass);
    lettucePool.afterPropertiesSet();
    LettuceConnectionFactory clientConfig = new LettuceConnectionFactory(lettucePool);
    clientConfig.afterPropertiesSet();
    return clientConfig;
  }

  @Bean
  public RedisTemplate<?, ?> redisTemplate(RedisConnectionFactory connectionFactory) {
    RedisTemplate<byte[], byte[]> template = new RedisTemplate<>();
    template.setConnectionFactory(connectionFactory);
    return template;
  }
 类似资料:
  • 我在实现Runnable的类的run()中调用的方法被设计为引发异常。 但是Java编译器不允许我这样做,建议我用try/catch来围绕它。 问题是,通过使用try/catch将其包围,我使特定的run()变得无用。我确实想抛出该异常。 如果我为run()本身指定了throws,编译器会抱怨异常与Runnable中的throws子句不兼容。run()。 通常情况下,我完全可以不让run()抛出异

  • 我正在使用Spring In Action 3 Action学习Spring MVC,我已经实现了显示用户注册表的基本程序,一旦我们提交表单,它将使用进行验证。 这是我的Spring控制器: 这是我的Spitter类文件: 这是我的编辑。显示给用户注册的jsp文件: 要加载表单,我将访问URL为:,一旦表单被加载,我只需提交表单而无需输入任何详细信息,以便我可以检查我的表单是否得到验证。但是我得到

  • 我做了一些测试,看看如何将combobox绑定到一些bean属性,但我得到了一个异常:“ConversionException:无法将值转换为字符串在..........”我的示例在使用组合框的indexedContainer时工作正常,但是在使用BeanItem容器时遇到了一些问题。我所拥有的:1。TestCountry,BeanItemContainer的简单java bean(为了简单起见,

  • 当我使用incrBy方法时,没有异常,只有错误只有get方法 这里是stacktrace--

  • 当方法运行时,我希望抛出一个异常(在测试时)。我能做的事情很少: 存根(mock.someMethod(“某些参数”)).ToThrow(new RuntimeException()); 当(mock.someMethod(“某些参数”)).thenThrow(new RuntimeException()) 放弃..... 通常我会创建一个spy对象来调用spied方法。使用stubbing我可以