问题是这样的 ,任何时间只要连接上了, 就能正常的连接,但是呢,空闲下来隔十来分钟后再连接就会出现超时的现象了。。这个说到连接池的问题了,分析是这样的
假设服务端没有问题,配置没有问题。那就是SpringBoot的Redis的Lettuce出了问题, 没有空闲连接,当连接上来之后,一切正常,隔一段时间没有连接的时候,就会Spring就瘵连接池关了连接切断了,然后页面再一次请求连接的时候,客户端再重新请求连接到服务器。所以才会出现 这样的问题。才会出现 连接超时,
之后呢,再一次请求连接,超时之后过十几秒之后,又能重新连接上了,只要一直不间断 的连接是没有问题的,问题是一停下来没有连接的时候过十多分钟连接才会出现这个连接超时的现象,
不知道大神会有没有出现 这样的问题呢,我现在郁闷死了,我所有的连接都是基于Redis的。。所以当这个用不了的时候基本上服务启动不了了。。
这个问题困扰了好几天了,找了几百个博客说超时的的现象是那个timeout: 1000ms这个的问题,其实我测试过就算我这里超时时间加大到一万秒也是这样超时的,。原因不是刚刚开始的时候连接不上,而是空闲下来隔一段时间后,Spring回收了或是关闭了Lettuce的连接池引起的。。。
希望有大神站出来的指导一下,谢谢!~
使用环境说明:java11版本,springBoot2.11, 我是redis直接安装到服务器上了,服务器版本是CentOS7,Redis是5.04版本。连接使用的时候是本地开发连接测试的。
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<spring-cloud.version>Greenwich.RC2</spring-cloud.version>
开发环境IDEA2018.2,
贴出配置
redis:
host: 服务器地址
password: 密码
database: 0
port: 端口
lettuce:
pool:
max-active: 20
max-wait: -1ms
max-idle: 10
min-idle: 2
timeout: 1000ms
pom
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.6.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
配置类
@Configuration
@AutoConfigureAfter(RedisAutoConfiguration.class)
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory lettuce) {
//设置序列化
Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
// 配置redisTemplate
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(lettuce);
RedisSerializer<String> stringSerializer = new StringRedisSerializer();
// key序列化
redisTemplate.setKeySerializer(stringSerializer);
// value序列化
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
// Hash key序列化
redisTemplate.setHashKeySerializer(stringSerializer);
// Hash value序列化
redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
}