首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在RedisTemplate中使用Lettuce会抛出异常

在RedisTemplate中使用Lettuce会抛出异常
EN

Stack Overflow用户
提问于 2018-06-15 00:18:14
回答 1查看 2K关注 0票数 0

我正在尝试弄清楚为什么在我运行性能测试时,把它与Jedis进行比较的时候,Lettuce给我带来了这么多问题。

我使用了spring-data-redis 1.8.11.RELEASE,并为通过RedisTemplate访问redis的接口创建了定制的代理bean。Redis在AWS中运行,我使用AWS提供的集群配置端点作为具有3个主节点和3个从节点的节点。在性能测试期间没有发生任何特殊的事情。我只是简单地调用了一个使用RedisTemplate从redis读取值的服务。

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

连接工厂bean的代码:

代码语言:javascript
复制
@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的线程数,但仍然收到超时错误:

代码语言:javascript
复制
ClientResources res = DefaultClientResources.builder()
            .ioThreadPoolSize(10)
            .computationThreadPoolSize(10)
            .build();

访问Redis的代码只需通过RedisTemplate:

代码语言:javascript
复制
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);
}

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

代码语言:javascript
复制
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)

这里我漏掉了什么?从我所读到的一切来看,似乎每个人都更喜欢生菜,但从我的测试中,我看不出原因。

EN

回答 1

Stack Overflow用户

发布于 2018-06-26 12:04:26

尝试使用连接池和管道

代码语言:javascript
复制
  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;
  }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50861913

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档