1、发现问题
我用的是springboot构建的项目,网关中连接redis存放每次请求的参数,以此达到不能重复请求的目的。
发现经常控制台报远程主机关闭一个连接的错误,每次报这样的错误,我就必须重启项目才行。非常麻烦,之前没有时间深究,现在今天痛下决心向百度请教一下。
2、定位问题
查询redis相关命令
客户端远程连接redis redis-cli.exe -h IP -p 6379 -a 密码
查看连接数 info clients 发现两千多连接,肯定不正常,因为是测试环境。
查看超时时间 config get timeout 为0 为0代表无限制 一直连接
设置超时时间 config set timeout 100 设置为100s
过几分钟后 再次查看 会发现变的很少了
3、问题本质
Redis的客户端超时机制
在业务场景中,一般会由Redis客户端进行连接资源管理,例如分配连接、监控连接状态、回收连接池资源等。默认设置下,Redis不会主动断开连接,即使这个客户端已经空闲了很长时间。但在业务核心应用中,建议配置timeout参数以使Redis具有主动回收资源的能力。否则,如果客户端出现异常,连接池资源得不到及时回收,可能因空闲连接占满连接池导致服务崩溃。核心应用出现这样的问题可能引发整个业务的混乱,后果严重。
timeout参数值的单位为秒(s),取值范围为0-100000。默认值为0,表示无限制。在实际运行中,为了提高性能,Redis不一定会精确地按照timeout的值规定的时间来断开符合条件的空闲连接,例如设置timeout为10s,但空闲连接可能在12s后,服务器中新增很多连接时才会被断开。如需降低这个延迟,可适当增大hz参数的值,提高负责断开超时连接的Redis定时任务的运行频率。