报错信息
ERRORorg.springframework.dao.QueryTimeoutException: Rediscommandtimedout; nestedexceptionisio.lettuce.core.RedisCommandTimeoutException: Commandtimedoutafter500millisecond(s) atorg.springframework.data.redis.connection.lettuce.LettuceExceptionConverter.convert(LettuceExceptionConverter.java:70) atorg.springframework.data.redis.connection.lettuce.LettuceExceptionConverter.convert(LettuceExceptionConverter.java:41) atorg.springframework.data.redis.PassThroughExceptionTranslationStrategy.translate(PassThroughExceptionTranslationStrategy.java:44) atorg.springframework.data.redis.FallbackExceptionTranslationStrategy.translate(FallbackExceptionTranslationStrategy.java:42) atorg.springframework.data.redis.connection.lettuce.LettuceConnection.convertLettuceAccessException(LettuceConnection.java:268) atorg.springframework.data.redis.connection.lettuce.LettuceListCommands.convertLettuceAccessException(LettuceListCommands.java:490) atorg.springframework.data.redis.connection.lettuce.LettuceListCommands.lLen(LettuceListCommands.java:159) atorg.springframework.data.redis.connection.DefaultedRedisConnection.lLen(DefaultedRedisConnection.java:465) atsun.reflect.NativeMethodAccessorImpl.invoke0(NativeMethod) atsun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) atsun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) atjava.lang.reflect.Method.invoke(Method.java:498) ****Causedby: io.lettuce.core.RedisCommandTimeoutException: Commandtimedoutafter500millisecond(s) atio.lettuce.core.ExceptionFactory.createTimeoutException(ExceptionFactory.java:51) atio.lettuce.core.LettuceFutures.awaitOrCancel(LettuceFutures.java:114) atio.lettuce.core.FutureSyncInvocationHandler.handleInvocation(FutureSyncInvocationHandler.java:69) atio.lettuce.core.internal.AbstractInvocationHandler.invoke(AbstractInvocationHandler.java:80) atcom.sun.proxy.$Proxy196.llen(UnknownSource) atorg.springframework.data.redis.connection.lettuce.LettuceListCommands.lLen(LettuceListCommands.java:157) ... 134more
原因分析
- 这个情况是我在将SpringBoot从1.X升级到2.X的时候产生的问题,所以大致可以猜到是版本问题。
解决办法
设置超时时间(不推荐)
redis: port: 6379jedis: pool: max-active: 50max-wait: 5000max-idle: 50min-idle: 0timeout: 500host: 47.100.21.110
这种方法无效,解决不了这个问题,我从0改到500还是报错。但是网上绝大多数都是这种方式,实际上我刚更改过来的时候有效过一阵,之后就又不行了。
- 更改依赖(亲测有效)
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>
在SpringBoot 1.X版本的jar包依赖中,点击进去依赖项如下:
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-redis</artifactId></dependency><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId></dependency></dependencies>
升级到SpringBoot 2.X版本之后依赖如下:
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId><version>2.1.2.RELEASE</version><scope>compile</scope></dependency><dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-redis</artifactId><version>2.1.4.RELEASE</version><scope>compile</scope><exclusions><exclusion><artifactId>jcl-over-slf4j</artifactId><groupId>org.slf4j</groupId></exclusion></exclusions></dependency><dependency><groupId>io.lettuce</groupId><artifactId>lettuce-core</artifactId><version>5.1.3.RELEASE</version><scope>compile</scope></dependency></dependencies>
可以看到变化是从jedis依赖变成了lettuce-core依赖,而上面的报错io.lettuce.core.RedisCommandTimeoutException
也是lettuce-core的异常,所以我的解决方式是先将依赖换回jedis:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId><exclusions><exclusion><groupId>io.lettuce</groupId><artifactId>lettuce-core</artifactId></exclusion></exclusions></dependency><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId></dependency>
如上,配置文件不变,Redis连接成功,不再报错。