相关文章推荐
豪气的双杠  ·  Disabling ARR’s ...·  1 年前    · 
org.springframework.data.redis.RedisSystemException: Redis exception; nested exception is io.lettuce.core.RedisException: java.io.IOException: 远程主机强迫关闭了一个现有的连接。
	at org.springframework.data.redis.connection.lettuce.LettuceExceptionConverter.convert(LettuceExceptionConverter.java:74) ~[spring-data-redis-2.1.6.RELEASE.jar:2.1.6.RELEASE]
	at java.lang.Thread.run(Thread.java:748) ~[na:1.8.0_211]
Caused by: io.lettuce.core.RedisException: java.io.IOException: 远程主机强迫关闭了一个现有的连接。
	at io.lettuce.core.LettuceFutures.awaitOrCancel(LettuceFutures.java:129) ~[lettuce-core-5.1.6.RELEASE.jar:na]
	at io.lettuce.core.FutureSyncInvocationHandler.handleInvocation(FutureSyncInvocationHandler.java:69) ~[lettuce-core-5.1.6.RELEASE.jar:na]
	at io.lettuce.core.internal.AbstractInvocationHandler.invoke(AbstractInvocationHandler.java:80) ~[lettuce-core-5.1.6.RELEASE.jar:na]
	at com.sun.proxy.$Proxy144.hset(Unknown Source) ~[na:na]
	at org.springframework.data.redis.connection.lettuce.LettuceHashCommands.hSet(LettuceHashCommands.java:69) ~[spring-data-redis-2.1.6.RELEASE.jar:2.1.6.RELEASE]
	... 100 common frames omitted
Caused by: java.io.IOException: 远程主机强迫关闭了一个现有的连接。
	at sun.nio.ch.SocketDispatcher.read0(Native Method) ~[na:1.8.0_211]
	at sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:43) ~[na:1.8.0_211]
	at sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:223) ~[na:1.8.0_211]
	at sun.nio.ch.IOUtil.read(IOUtil.java:192) ~[na:1.8.0_211]
	at sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:380) ~[na:1.8.0_211]
	at io.netty.buffer.PooledUnsafeDirectByteBuf.setBytes(PooledUnsafeDirectByteBuf.java:288) ~[netty-buffer-4.1.34.Final.jar:4.1.34.Final]
	at io.netty.buffer.AbstractByteBuf.writeBytes(AbstractByteBuf.java:1125) ~[netty-buffer-4.1.34.Final.jar:4.1.34.Final]
	at io.netty.channel.socket.nio.NioSocketChannel.doReadBytes(NioSocketChannel.java:347) ~[netty-transport-4.1.34.Final.jar:4.1.34.Final]
	at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:148) ~[netty-transport-4.1.34.Final.jar:4.1.34.Final]
	at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:677) ~[netty-transport-4.1.34.Final.jar:4.1.34.Final]
	at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:612) ~[netty-transport-4.1.34.Final.jar:4.1.34.Final]
	at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:529) ~[netty-transport-4.1.34.Final.jar:4.1.34.Final]
	at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:491) ~[netty-transport-4.1.34.Final.jar:4.1.34.Final]
	at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:905) ~[netty-common-4.1.34.Final.jar:4.1.34.Final]
	at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) ~[netty-common-4.1.34.Final.jar:4.1.34.Final]
	... 1 common frames omitted

1.修改项目中的配置

# 关闭超时时间
spring.redis.lettuce.shutdown-timeout=100

2.修改redis.conf中,tcp-keepalive配置,就是一次连接tcp的存活时间

tcp-keepalive 60
这里可以看到redis从3.2.1版本开始,默认设置是300秒,我们修改为60秒。 在 Linux 系统中,客户端发送的最后一个数据包与redis发送的第一个保活探测报文之间的时间间隔,单位是秒。 1.tcp-keepalive只在Linux生效,在其他系统不生效(比如 Mac),只按照其他系统内核自身的设置。 在测试环境部署的若依版本,经常会报如下的错误。而我在开发环境基本没有遇到过。 16:38:01.040 [lettuce-nioEventLoop-4-2] INFO i.l.c.p.CommandHandler - [log,217] - null Unexpected exception during request: java.io.IOException: 远程主机强迫关闭一个现有连接java.io.IOException: 远程主机强迫关闭一个现有连接。 at sun.nio org.springframework.data.redis.RedisSystemException: Redis exception; nested exception is io.lettuce.core.RedisException: java.lang.NullPointerException 文章目录半关闭状态实现方法tcp-keepalive开启 tcp-keepalive方法1 Linux系统全局开启方法2 setsockopt 设置 socket 半关闭状态 一次TCP四次挥手的过程如上图所示。设左侧为客户端,右侧为服务端,当客户端发起FIN而关闭其写通道时(对应服务端读通道),服务端进入close_wait状态,但希望推送完所有数据后再关闭整个连接。此时连接处于半关闭状态,客户端只能读,服务端只能写。 待服务端发送完所有数据并发送一个FIN后,客户端响应ACK,服务端收到ACK后知道客 最近做项目的时候,运行项目总是出现这个错误因为我是使用的是服务器来安装redis的,且我是使用Feign来调用其他微服务的,所以存在网络的延迟,所以我开始设置redis超时时间,后面测试就成功了。 最近在使用springboot(Windows下)连接redis(云服务器)开发时发现一些问题:连接成功的情况下,在一段时间未交互数据后,再次通过连接Redis传输数据回出现异常java.io.IOException: 远程主机强迫关闭一个现有连接。 于是我上网找了一些博客主要是两种: 可能是客户端连接太多了,开启timeout设置或tcp-keepalive 将配置的的tcp-keepalive设置为60(可能之前是300) 这两个设置是什么意思呢 timeout,单位是秒,如果客户端连 2、设置 redis 服务端的配置文件 redis.conf 中 tcp-keepalive 的时间为60(单位秒)(TCP连接存活时间):tcp-keepalive 60。2、如果 tcp-keepalive 存活时间大于超时时间,存活时间还没有结束(连接还没关闭)就又创建新的连接,创建的连接多了就会远程主机强迫关闭现有连接。1、设置连接空闲超过 N(秒或毫秒)后关闭,0为禁用:redis.timeout: 60s(这里设置和tcp-keepalive的值一致) 症状为:访问某个接口很慢,即时访问成功后报错,再次访问一切正常,但是每隔几分钟访问接口仍然很慢或者报错 2019-08-07 11:34:15.141 ERROR 21076 --- [nio-8080-exec-5] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for... org.springframework.context.ApplicationContextException: Unable to start web server; nested exception is org.springframework.boot.web.server.WebServerException: Unable to start embedded 以下是整个经过: 本地开发是发现隔一段时间没请求redis就会报错: 2020/07/09 10:31:35 ERROR [com.SpringLearn.common.redis.JedisUtils] - Redis exception; nested 容器云问题1:容器云sprinboot应用TCP连接释放问题:Keep-Alive 在容器云环境中,会存在容器应用TCP连接复用,因为容器的端口资源需要进行有效的释放和复用,因此容器底层实际上已经释放了这个连接。我的springboot应用中使用的是apache httpclient框架。一般完整的一次http交互,3次握手建立连接,4次握手关闭链接。 1.1持久连接 Web 客户端经常会打开到同... 使用Docker安装的redisspringboot连接redis,经常过一段时间就从redis取值失败,报这个错误Redis exception; nested exception is io.lettuce.core.RedisException: java.io.IOException: 远程主机强迫关闭一个现有连接。 1. 报错原因 spring中配置的超时时间应该大于tcp的存活时间,否则tcp连接还存活着,spring以为已经超时,又去创建,就会强制之前的连接关闭