本地环境redis或者jedis频繁断开连接,timeout

问题,Redis连接超时

记录些问题,这是之前碰见的bug,但是具有参考性,百度无法搜到。故此记录。

Redis 配置如下:

upload successful

redis,刚起动正常,但是不久之后,就直接报错,断开链接,报错如下。有时甚至无法启动。一开始以为是mac的兼容的问题,导致redis启动存在问题,但是在redis的仓库github上没有相关的关于redis兼容的issue推测是其他原因导致的,报错内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
Caused by: org.springframework.data.redis.RedisConnectionFailureException: Cannot get Jedis connection
at org.springframework.data.redis.connection.jedis.JedisConnectionFactory.fetchJedisConnector(JedisConnectionFactory.java:271)
at org.springframework.data.redis.connection.jedis.JedisConnectionFactory.getConnection(JedisConnectionFactory.java:454)
at org.springframework.data.redis.core.RedisConnectionUtils.fetchConnection(RedisConnectionUtils.java:193)
at org.springframework.data.redis.core.RedisConnectionUtils.doGetConnection(RedisConnectionUtils.java:144)
at org.springframework.data.redis.core.RedisConnectionUtils.getConnection(RedisConnectionUtils.java:105)
at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:393)
at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:373)
at org.springframework.data.redis.core.RedisTemplate.doWithKeys(RedisTemplate.java:785)
at org.springframework.data.redis.core.RedisTemplate.delete(RedisTemplate.java:588)
at cn.minfengyu.utils.RedisUtil.delete(RedisUtil.java:68)
at cn.minfengyu.system.config.AppStartupRunner.putRight(AppStartupRunner.java:38)
at cn.minfengyu.system.config.AppStartupRunner.run(AppStartupRunner.java:27)
at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:760)
... 5 common frames omitted
Caused by: redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketTimeoutException: Read timed out
at redis.clients.jedis.util.RedisInputStream.ensureFill(RedisInputStream.java:208)
at redis.clients.jedis.util.RedisInputStream.readByte(RedisInputStream.java:46)
at redis.clients.jedis.Protocol.process(Protocol.java:126)
at redis.clients.jedis.Protocol.read(Protocol.java:192)
at redis.clients.jedis.Connection.readProtocolWithCheckingBroken(Connection.java:316)
at redis.clients.jedis.Connection.getStatusCodeReply(Connection.java:243)
at redis.clients.jedis.Connection.auth(Connection.java:372)
at redis.clients.jedis.Connection.initializeFromClientConfig(Connection.java:345)
at redis.clients.jedis.Connection.<init>(Connection.java:53)
at redis.clients.jedis.Jedis.<init>(Jedis.java:214)
at redis.clients.jedis.JedisFactory.makeObject(JedisFactory.java:181)
at org.apache.commons.pool2.impl.GenericObjectPool.create(GenericObjectPool.java:571)
at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:298)
at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:223)
at redis.clients.jedis.util.Pool.getResource(Pool.java:34)
at redis.clients.jedis.JedisPool.getResource(JedisPool.java:373)
at redis.clients.jedis.JedisPool.getResource(JedisPool.java:17)
at org.springframework.data.redis.connection.jedis.JedisConnectionFactory.fetchJedisConnector(JedisConnectionFactory.java:262)
... 17 common frames omitted
Caused by: java.net.SocketTimeoutException: Read timed out
at java.base/sun.nio.ch.NioSocketImpl.timedRead(NioSocketImpl.java:283)
at java.base/sun.nio.ch.NioSocketImpl.implRead(NioSocketImpl.java:309)
at java.base/sun.nio.ch.NioSocketImpl.read(NioSocketImpl.java:350)
at java.base/sun.nio.ch.NioSocketImpl$1.read(NioSocketImpl.java:803)
at java.base/java.net.Socket$SocketInputStream.read(Socket.java:966)
at java.base/java.io.InputStream.read(InputStream.java:218)
at redis.clients.jedis.util.RedisInputStream.ensureFill(RedisInputStream.java:202)
... 34 common frames omitted

解决办法:

查了许久,发现是Redis连接用的是localhost域名,使用的是域名解析,而我开起了clash For windows客户端,导致域名解析匹配规则交给远端DNS服务器去解析了,远端DNS无法解析localhost域名导致连接失败的:

upload successful);

1. 修改localhost=》 127.0.0.1

upload successful

2. 关闭Clash for windows 客户端

3. 添加clash规则直接将localhost解析为127.0.01.