解决redis lettuce连接池经常出现连接拒绝(Connection refused)问题

一.软件环境

windows10、11系统、springboot2.x、redis 6 7

linux(centos)系统没有出现这问题,如果你是linux系统碰到的,本文也有一定大参考价值。

根本思路就是:tcp/ip连接的保活(keepalive)。

二.问题描述

在springboot项目中使用了lettuce作为redis的连接池,在本地开发环境windows系统中,隔5分钟不操作,再次需要访问redis时,从连接池获取一个连接去操作redis就会出现连接拒绝,一般直到取完max-idle(最大空闲连接数)所有连接都是连接拒绝,直到开始创建新的连接,才能连接上redis。

三.问题分析

测试环境(linux)连的是同一个redis服务,却没有出现这样的问题。

之前也试着从连接池配置去解决问题,然并卵。。。

复制代码
    lettuce:
      pool:
        # 连接池最大连接数(使用负值表示没有限制)
        max-active: 8
        # 连接池最大阻塞等待时间(使用负值表示没有限制)
        max-wait: 1
        # 连接池中的最大空闲连接
        max-idle: 8
        # 连接池中的最小空闲连接
        min-idle: 0
      cluster:
        refresh:
          adaptive: true
          #20秒自动刷新一次
          period: 20

也试过网上说的各种方法都没有效果。

后面想着,既然在linux系统中运行没问题,windows系统有问题,在其它条件相同的情况下,那就只有操作系统的差异了。

那就可能是两个系统维护tcp/ip的方式的不同了,因为连接池中的连接,本质上就是一个个tcp/ip连接,要想让连接保活,服务端和客户端,至少得有一方去做保活(keepalive)操作。

为什么是隔5分钟不操作,就必然出现redis连接拒绝呢?于是在redis配置文件中搜索"keepalive"发现tcp-keepalive配置,默认300s,这不正好5分钟吗?该配置是服务端每隔300秒检查一下客户端连接,如果可以连通,则让连接保活,如果连不通了,则将连接销毁。

那么导致redis服务端做保活操作后,redis连接就不可用了,应该就是windows系统在这5分钟内,将tcp/ip连接给干掉了,导致redis服务端连接不到就把连接干掉了,而lettuce并不知道连接已经断开了,当有请求需要连接redis时,就从lettuce中拿一个已经被服务端断开连接去操作redis,于是就得到了连接拒绝的响应。

四.解决方案

方案 1:减少redis服务端配置文档的tcp-keepalive的间隔时间,将上图中的设置改为60后,重启服务,经过测试就没有连接拒绝的问题了。

方案2:增加windows系统的tcp/ip连接的存活时间,但是这个修改过几个配置,好像没有效,也有说法是防火墙、杀毒软件的防护策略等管理着tcp/ip的存活时间。如不可用,建议直接使用方案1。

下面的设置没有效果。

复制代码
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters" -Name "KeepAliveTime" -Value 180000

Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters" -Name "KeepAliveInterval" -Value 1000

Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters" -Name "KeepAliveProbes" -Value 10
相关推荐
Elastic 中国社区官方博客3 小时前
Elasticsearch:使用 Agent Builder 的 A2A 实现 - 开发者的圣诞颂歌
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
2301_816660213 小时前
PHP怎么处理Eloquent Attribute Inference属性推断_Laravel从数据自动推导类型【操作】
jvm·数据库·python
qq_372154234 小时前
Go 中自定义类型与基础类型的显式转换规则详解
jvm·数据库·python
_下雨天.5 小时前
NoSQL之Redis配置与优化
数据库·redis·nosql
LiAo_1996_Y5 小时前
CSS如何实现文字渐变效果_通过background-clip实现艺术字
jvm·数据库·python
2401_887724505 小时前
CSS如何让表单在手机端友好展示_利用Flexbox实现堆叠排版
jvm·数据库·python
数据库小组5 小时前
MySQL 删库后怎么恢复?binlog2sql 之外,NineData 还能做什么
数据库·sql·mysql·安全·数据·ninedata·删库
zhangchaoxies5 小时前
Layui轮播图(carousel)怎么设置自动播放间隔
jvm·数据库·python
切糕师学AI6 小时前
HBase:一文搞懂分布式宽列数据库(原理 + 架构 + 实战)
数据库·分布式·nosql·hbase·分布式宽列数据库·wide column db
competes6 小时前
慈善基金投资底层逻辑应用 顶层代码低代码配置平台开发结构方式数据存储模块
java·开发语言·数据库·windows·sql