springboot链redis出现 java.io.IOException: 远程主机强迫关闭了一个现有的连接

本文解决SpringBoot2.0使用Redis时出现的链接异常问题,详细分析了错误原因并提供了解决方案,包括检查配置、调整连接池参数及修改redis.conf设置。

使用springboot2.0链接redis时候,出现以下错误:

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

这是需要检查redis的链接配置是否正确:

spring	
	redis:
	    host: 
	    port: 6379
	    password: 
	    database: 1
	    timeout: 60s
	    ## springboot2.0之后将连接池由jedis改为lettuce
	    lettuce:
	      pool:
	        max-idle: 30
	        max-active: 8
	        max-wait: 10000
	        min-idle: 10

同时在redis的配置文件redis.conf中设置tcp-keepalive时间为60s(据说3.2.1默认为300,我设置60后上述问题不在出现)
在这里插入图片描述
完成后重启redis

[2025-10-27 01:16:58,781][nioEventLoopGroup-3-13][com.dascom.krdcz.netty.handler.ControlChannelHandler(类):264(行)] number:0047DF7350029700 控制通道发生异常 java.io.IOException: 远程主机强迫关闭一个现有连接。 at sun.nio.ch.SocketDispatcher.read0(Native Method) ~[?:1.8.0_191] at sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:43) ~[?:1.8.0_191] at sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:223) ~[?:1.8.0_191] at sun.nio.ch.IOUtil.read(IOUtil.java:192) ~[?:1.8.0_191] at sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:380) ~[?:1.8.0_191] at io.netty.buffer.PooledUnsafeDirectByteBuf.setBytes(PooledUnsafeDirectByteBuf.java:288) ~[netty-buffer-4.1.31.Final.jar!/:4.1.31.Final] at io.netty.buffer.AbstractByteBuf.writeBytes(AbstractByteBuf.java:1132) ~[netty-buffer-4.1.31.Final.jar!/:4.1.31.Final] at io.netty.channel.socket.nio.NioSocketChannel.doReadBytes(NioSocketChannel.java:347) ~[netty-transport-4.1.31.Final.jar!/:4.1.31.Final] at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:148) [netty-transport-4.1.31.Final.jar!/:4.1.31.Final] at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:648) [netty-transport-4.1.31.Final.jar!/:4.1.31.Final] at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:583) [netty-transport-4.1.31.Final.jar!/:4.1.31.Final] at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:500) [netty-transport-4.1.31.Final.jar!/:4.1.31.Final] at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:462) [netty-transport-4.1.31.Final.jar!/:4.1.31.Final] at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:897) [netty-common-4.1.31.Final.jar!/:4.1.31.Final] at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) [netty-common-4.1.31.Final.jar!/:4.1.31.Final] at java.lang.Thread.run(Thread.java:748) [?:1.8.0_191]
最新发布
10-29
### Redis `io.lettuce.core.RedisException` 导致的远程主机关闭连接错误解决方案 #### 背景分析 当应用程序通过 Lettuce 客户端访问 Redis 时,可能会遇到类似于 `io.lettuce.core.RedisException: java.io.IOException: 远程主机强迫关闭连接` 的异常。这种问题通常由网络不稳定、Redis 配置不当或客户端配置不合理引起。 --- #### 可能原因及对应解决方法 ##### 1. **SSH 或防火墙导致的连接中断** 如果服务器上的 SSH 设置未启用 TCP Keep-Alive 功能,则可能导致长时间无活动的连接被强制关闭。 - 修改 `/etc/ssh/sshd_config` 文件,增加以下参数并重启 SSH 服务: ```bash ClientAliveInterval 600 ClientAliveCountMax 10 ``` 然后执行命令以应用更改: ```bash service sshd restart ``` 上述操作可以有效减少因 SSH 断开引起的连接丢失问题[^1]。 --- ##### 2. **Lettuce 连接池配置优化** Lettuce 是异步 Redis Java 客户端,默认支持连接池管理。不合理的连接池配置可能导致资源耗尽或超时问题。 - 在 Spring Boot 中调整 Lettuce 的连接池参数如下: ```yaml spring: redis: host: *.***.***.** port: 6379 password: 123456 timeout: 50s lettuce: pool: max-idle: 30 max-active: 8 max-wait: 10000ms min-idle: 10 ``` 这些参数定义了最大空闲连接数 (`max-idle`) 和最小空闲连接数 (`min-idle`) 等,有助于提高连接复用率和稳定性[^2]。 --- ##### 3. **TCP Keep-Alive 参数调优** 某些情况下,底层网络协议可能因为缺乏保持活跃机制而断开连接。可以通过操作系统级别的 TCP Keep-Alive 参数来缓解该问题。 - Linux 下可通过以下命令查看当前设置: ```bash cat /proc/sys/net/ipv4/tcp_keepalive_time cat /proc/sys/net/ipv4/tcp_keepalive_intvl cat /proc/sys/net/ipv4/tcp_keepalive_probes ``` - 如果需要修改,可编辑 `/etc/sysctl.conf` 并添加以下内容: ```bash net.ipv4.tcp_keepalive_time = 60 net.ipv4.tcp_keepalive_intvl = 10 net.ipv4.tcp_keepalive_probes = 6 ``` 随后执行以下命令生效: ```bash sysctl -p ``` 这样能够确保在网络层面上维持稳定的连接状态[^3]。 --- ##### 4. **RDB 持久化引发的问题** 在自建 Redis 实例中,RDB 快照功能可能导致写入请求被拒绝,从而触发类似的异常。这是由于 Redis 默认会在背景保存失败的情况下暂停写操作所致。 - 打开 Redis 配置文件(通常是 `redis.conf`),找到以下选项: ```conf stop-writes-on-bgsave-error yes ``` - 将其改为 `no` 来避免此类情况的发生: ```conf stop-writes-on-bgsave-error no ``` 这一改动可以让 Redis 即使在持久化过程中出现问题也能继续处理请求[^4]。 --- ##### 5. **其他潜在因素排查** 除了以上提到的原因外,还需注意以下几个方面: - **内存不足**:检查 Redis 是否存在 OOM 错误日志; - **带宽限制**:确认是否存在流量控制策略影响通信质量; - **版本兼容性**:验证使用的 Lettuce 版本与 Redis Server 是否匹配。 --- ### 总结 针对 `io.lettuce.core.RedisException` 异常,建议按照以下顺序逐步排查: 1. 检查并优化 SSH/TCP 层面的心跳检测机制; 2. 合理配置 Lettuce 连接池参数提升性能; 3. 调整系统级 TCP Keep-Alive 时间间隔增强可靠性; 4. 对 RDB 持久化逻辑进行适当改造降低风险。 最终目标是构建更加健壮可靠的分布式缓存架构。 --- ####
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值