[英]Using Lettuce with RedisTemplate throws exceptions
我試圖找出為什么生菜在與傑迪斯進行性能測試時給我這么多問題。
我正在使用spring-data-redis 1.8.11.RELEASE,並為接口創建自定義代理bean,以通過RedisTemplate訪問redis。 Redis在AWS中運行,我使用AWS提供的集群配置端點作為具有3個主節點和3個從節點的節點。 性能測試期間沒有什么特別的事情發生。 我只是調用一個使用RedisTemplate從Redis讀取值的服務。
使用JedisConnectionFactory時,測試始終無例外地通過,但是當我切換到LettuceConnnectionFactory時,由於通道初始化總是超時,因此我無法完成任何測試。 與收到線程中斷異常之前一樣,我將超時時間增加到30s並調整了關閉計時器。 但是,即使30秒,它仍然超時。 我嘗試使用共享的本機連接,並且沒有和許多不同的超時值,它們都導致相同的問題。
連接工廠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();
訪問Redis的代碼只是通過RedisTemplate:
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)
我在這里想念什么? 從我閱讀的所有內容來看,每個人似乎都喜歡萵苣,但是從我的測試中我看不出為什么。
嘗試使用連接池和管道
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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.