Redis连接数问题

1. 前言

一般情况 Redis 连接数问题并不常见,但是当你业务服务增加、对 Redis 的依赖持续增强的过程中,可能会遇到很多 Redis 的问题,这个时候,Redis 连接数可能就成了一个常见的问题。

简单定义:因各种原因,程序对Redis的连接数激增,超过Redis服务器能够承受的上限,从而程序无法正常访问Redis进而引发功能异常的问题。

Redis连接数问题并不常见,但现在系统对 Redis 依赖较强,并且也是解决各系统性能的利器,连接数打爆造成的Redis暂时不可用会影响正常功能,至少系统性能急剧下降,影响较大。

在本章节,希望能够带大家了解Redis连接数问题的现象和解法。

2. 背景知识

Redis原生支持长短连接,但与我们使用数据库类似,大多数Redis客户端/中间件都使用了连接池来管理对Redis服务器的连接,从而达到连接复用、提高IO效率的效果(连接池的概念与作用不再赘述)。

无论是Jedis还是Lettuce,都默认支持了连接池的配置,池中连接都是长连接。

通常我们使用Redis可能有几种场景:

1)用作缓存,若丢失,程序可以自动或手动重建,不影响业务正确性,但极有可能影响性能;

2)用作存储,若丢失即是业务数据的丢失,较难恢复,一般为不重要的数据,业务上应有预案;

3)用作分布式锁,若丢失则可能造成数据一致性问题;

4)用作阻塞队列,若丢失则可能造成业务数据的丢失,需要有相应的校验与补偿措施。

提倡使用1、3,不提倡使用2、4。

特别是4阻塞队列,虽不禁止,但对Redis连接占用极为严重,应作为最后之举,之前应该寻求使用其他消息队列中间件、内存处理等方案。

3. 问题处理

3.1 如何感知连接数过多

1)使用INFO命令:Redis提供了 INFO 命令来获取Redis服务器的各种信息和统计。其中,connected_clients字段表示当前已连接的客户端数量。

perl 复制代码
redis-cli info | grep connected_clients

2)使用CLIENT LIST命令:这个命令可以列出所有连接到Redis服务器的客户端信息。

复制代码
redis-cli client list

3)使用CONFIG GET maxclients命令:可以获取Redis服务器允许的最大客户端连接数。

arduino 复制代码
redis-cli config get maxclients

4)监控工具:搭建监控工具,通过图像走势更能直观的展现连接数使用情况。如Prometheus、Grafana、Redis exporter等,来实时监控Redis的连接数,大致流程是:

  • 在Redis服务端部署 如Prometheus,用来抓取数据 redis 服务端数据,还是主要通过 INFO 等指令抓取
  • 配置 Prometheus 从 Redis exporter 抓取数据
  • 配置 Grafana 的数据源 Prometheus,用来展示数据

如果你发现Redis的连接数过多,可能需要检查你的应用是否正确地关闭了不再使用的连接,或者是否有必要增加Redis服务器的最大连接数。

3.2 常见原因

1)生产容量规划不合理,较多数量的应用机器但没有申请匹配容量的Redis服务器;

2)正常发布时,旧节点摘流后一段时间内,其连接池尚未完全断开,而同时新的节点又启动开始连接,使得Redis服务器面对了成倍的连接请求;

3)碰到某种连接异常时,程序反复重试,连接激增;

4)过度使用阻塞队列;

5)使用第三方工具连上Redis,工具本身设计不完善(例如scan所有key)引起生产问题。

3.3 如何止损

问题发生时首先可以考虑采取如下措施进行止损:

1)若判断为上述第1、2种原因,首先考虑应用缩容

2)若判断为上述第3、4种原因,首先考虑重启应用(且避免进入原因2,参照下方解决方案2)

3)若判断为上述第5种原因,立即停止工具的使用

4)与此同时,服务器端请运维帮忙清理连接、Redis扩容、切从等

3.4 长效解决方案

1)新功能上线、新活动应对时,合理规划生产容量,一定数量的应用机器应该匹配相应容量的Redis服务器

2)正常发布时,旧节点摘流、新节点启动两者的时间间隔需要适当控制,不宜太快,以免依赖资源打满

3)应用代码中谨慎重试

4)慎重将Redis用作阻塞队列,应作为最后之举,之前应该寻求使用其他消息队列中间件、内存处理等方案

5)禁止使用第三方工具连上Redis

相关推荐
GIS数据转换器25 分钟前
无人机车载巡检系统
大数据·数据库·人工智能·数据挖掘·数据分析·无人机
骄马之死7 小时前
SpringMVC + SpringBoot 核心知识点总结
java·spring boot·后端
逸模8 小时前
告别熬夜手工整理台账,逸模智能归集实现项目数据自动化存档
大数据·运维·人工智能·笔记·其他·信息可视化·自动化
sbjdhjd8 小时前
Redis 主从复制、哨兵高可用与 Cluster 集群部署实验手册
运维·前端·redis·云原生·开源·bootstrap·html
GoGeekBaird8 小时前
Anthropic技能"(Skills)的经验分享
后端
王码码20359 小时前
多台服务器怎么统一看状态?Beszel 轻量监控,搭起来不费事
运维·服务器·后端·安全·阿里云·接口·web
郑洁文9 小时前
基于Spring Boot的流浪动物救助网站
java·spring boot·后端·毕设·流浪动物救助
Trouvaille ~9 小时前
【Redis篇】Redis 哨兵(Sentinel):高可用自动故障转移
数据库·redis·缓存·中间件·sentinel·高可用·哨兵
audyxiao00110 小时前
ICLR 2026论文分享 | WorldGym:用世界模型打造机器人策略评估新范式
大数据·人工智能·大模型·智能体·世界模型
giaz14n9X10 小时前
Redis 分布式锁进阶第五十七篇
数据库·redis·分布式