Redis学习(十二)连接数不足报错及分析修复:ERR max number of clients reached.
目录
- 一、问题介绍
- 二、问题分析
- 2.1 redis-cli 登录
- 2.2 info clients 查看连接数情况
- 2.3 client list 查看具体连接情况
- 2.4 分析连接空闲时长
- 2.5 client list 根据客户端IP统计连接数
- 三、问题结论和解决
- 3.1 问题结论:
- 3.2 解决方案①:优化程序
- 3.3 解决方案②:扩大最大连接数
- 3.4 解决方案③:杀死指定连接

一、问题介绍
我们在日常的开发过程中,经常会遇到 Redis 连接数不足 的情况,报错如下所示:
Caused by: org.redisson.client.RedisException: ERR max number of clients reached. channel

Caused by: org.redisson.client.RedisException: ERR max number of clients reached. channel: [id: 0xf10fcc26, L:/192.168.30.13:64137 - R:192.168.1.163/192.168.1.163:6379] command: (SELECT), params: [1]at org.redisson.client.handler.CommandDecoder.decode(CommandDecoder.java:365)at org.redisson.client.handler.CommandDecoder.decodeCommand(CommandDecoder.java:209)at org.redisson.client.handler.CommandDecoder.decode(CommandDecoder.java:147)at org.redisson.client.handler.CommandDecoder.decode(CommandDecoder.java:117)at io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java:505)at io.netty.handler.codec.ReplayingDecoder.callDecode(ReplayingDecoder.java:366)at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:283)at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374)at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:360)at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:352)at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1421)at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374)at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:360)at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:930)at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:163)at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:697)at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:632)at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:549)at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:511)... 4 common frames omitted
二、问题分析
ERR max number of clients reached. channel
报错是因为 Redis 的连接数不足 导致的。
2.1 redis-cli 登录
我们可以先使用如下命令登录 Redis 的客户端:
-
redis-cli -h 127.0.0.1 -p 6379 -c --raw
-c
:(cluster)选项是连接 Redis Cluster 结点需要使用的。-c 选项可以防止moved
和ask
异常。--raw
:选项是反馈格式化后的结果,默认选项。相对应的是--no-raw
,即返回原始格式(二进制)。
2.2 info clients 查看连接数情况
查看 Redis 的当前连接数:
- info clients

##版本6.2.4,相对5版本新增了部分显示信息##当前redis节点的客户端连接数
connected_clients:1
##集群的连接数
cluster_connections:0
##客户端最大连接数
maxclients:10000
##当前所有输入缓冲区中队列对象个数的最大值
client_recent_max_input_buffer:24
##当前所有输出缓冲区中占用的最大容量
client_recent_max_output_buffer:0
##正在执行阻塞命令的客户端个数
blocked_clients:0
tracking_clients:0
clients_in_timeout_table:0
2.3 client list 查看具体连接情况
查看 Redis 的具体连接情况:
- client list
id=17750 addr=192.168.1.254:35864 laddr=172.17.0.3:6379 fd=9615 name= age=266661 idle=266661 flags=N db=2 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 argv-mem=0 obl=0 oll=0 omem=0 tot-mem=20504 events=r cmd=select user=default redir=-1
id=2575 addr=192.168.1.254:44133 laddr=172.17.0.3:6379 fd=1885 name= age=422195 idle=422195 flags=N db=2 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 argv-mem=0 obl=0 oll=0 omem=0 tot-mem=20504 events=r cmd=select user=default redir=-1
id=18212 addr=192.168.1.254:61386 laddr=172.17.0.3:6379 fd=9929 name= age=266308 idle=266308 flags=N db=2 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 argv-mem=0 obl=0 oll=0 omem=0 tot-mem=20504 events=r cmd=select user=default redir=-1
id=13437 addr=192.168.1.254:17625 laddr=172.17.0.3:6379 fd=6431 name= age=349287 idle=349287 flags=N db=2 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 argv-mem=0 obl=0 oll=0 omem=0 tot-mem=20504 events=r cmd=select user=default redir=-1
id=12730 addr=192.168.1.254:15535 laddr=172.17.0.3:6379 fd=6226 name= age=350448 idle=350448 flags=N db=2 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 argv-mem=0 obl=0 oll=0 omem=0 tot-mem=20504 events=r cmd=select user=default redir=-1
- 官方文档: https://redis.io/docs/latest/commands/client-list/
client list
属性说明如下:
属性 | 说明 |
---|---|
id | 客户端连接ID |
addr | 客户端连接IP和端口 |
laddr | redis数据库连接地址和端口 |
fd | socket的文件描述符 |
name | 客户端连接名 |
age | 客户端连接存活时间 |
idle | 客户端连接空闲时间,单位秒。可以用于判断连接是否有没有被及时释放 |
flags | 客户端类型标识 |
db | 当前客户正在使用的数据库索引下标 |
sub/psub | 当前客户端订阅的频道或模式数 |
multi | 当前事务中已执行命令个数 |
qbuf | 输入缓冲区总容量 |
qbuf-free | 输入缓冲区剩余容量 |
argv-mem | 下一个命令的不完整参数(已从查询缓冲区中提取) |
obl | 固定缓冲区的长度 |
oll | 动态缓冲区列表的长度 |
omem | 固定缓冲区和动态缓冲区使用的容量 |
tot-mem | 此客户端在其各个缓冲区中消耗的总内存 |
events | 文件描述符时间(r:可读;w:可写) |
cmd | 当前客户端最后一次执行的命令,不包含参数 |
user | 用户名称,默认default |
redir | 当前用户跟踪重定位的客户端ID |
2.4 分析连接空闲时长
了解了以上的属性,我们再反观刚才 client list
的执行结果,可以看到:
- 其中
idle
(客户端连接空闲时间)和age
(客户端连接存活时间)的值基本一致,说明大部分的连接是没有用到的。
2.5 client list 根据客户端IP统计连接数
命令如下:
redis-cli -h 127.0.0.1 -p 6379 -c --raw client list | awk -F ' ' '{print $2}' | awk -F : '{print $1}' | sort | uniq -c | sort -nr | head -n 10
docker 命令版:
docker exec -it redis redis-cli client list | awk -F ' ' '{print $2}' | awk -F : '{print $1}' | sort | uniq -c | sort -nr | head -n 10
执行结果:
三、问题结论和解决
3.1 问题结论:
从上面的问题分析可以看出,问题原因是大部分连接被某一个IP占用导致的,可能是Redis最小连接数配置错误,或者程序Bug导致的。
3.2 解决方案①:优化程序
可以根据客户端的IP和端口定位到客户端的具体应用进行优化,但是如果客户端应用不是在你们部门维护的就不太好推进了。
3.3 解决方案②:扩大最大连接数
- 方式一: 在
redis.conf
配置文件中进行修改,如下所示:
# 设置最大连接数为10w
maxclients 100000
- 方式二: 通过命令设置,如下所示:
config set maxclients 100000
- 方式三: 启动
redis.service
服务时,添加参数--maxclients 100000
,如下所示:
redis-server --maxclients 100000 -f /ext/redis.conf
- 验证: 使用命令查看最大连接数,如下所示:
config get maxclients
3.4 解决方案③:杀死指定连接
可以在 redis 中使用如下命令杀死指定连接:
# 方式一:通过ip:port杀死
client kill ip:port
# 方式二:通过连接ID杀死
client kill id 5299
可以使用如下命令针对指定 IP 的连接进行批量杀死,例如批量杀死192.168.1.123的 3 个连接:
redis-cli client list | grep '192.168.1.123' | awk -F ' ' '{print \$1}' | sed 's/id=//g' | head -n 3 | xargs -n 1 redis-cli client kill id
- 如果需要杀死所有连接,可以去掉
head -n 3
。
docker 命令版:
docker exec -it redis sh -c "redis-cli client list | grep '192.168.1.254' | awk -F ' ' '{print \$1}' | sed 's/id=//g' | head -n 3 | xargs -n 1 redis-cli client kill id"
- 注意1: 这里需要使用
sh -c
来包装整个命令,确保命令在一个子shell
中执行,否则会报错: the input device is not a TTY。 - 注意2: 这里需要使用
xargs -n 1
来将awk
筛选后的结果逐行执行,-n 1
用于确保逐行执行,否则会报错: (error) ERR syntax error。 - 如果需要杀死所有连接,可以去掉
head -n 3
。
整理完毕,完结撒花~🌻
参考地址:
1.Redis:13–常用功能之redis-cli redis-server等命令,https://cloud.tencent.com/developer/article/1784416
2.redis client list使用,https://blog.csdn.net/weixin_44375561/article/details/121955791
3.[问题分析]redis客户端连接数过多,大量空闲连接和readonly连接,https://segmentfault.com/a/1190000020256823
相关文章:

Redis学习(十二)连接数不足报错及分析修复:ERR max number of clients reached.
目录 一、问题介绍二、问题分析2.1 redis-cli 登录2.2 info clients 查看连接数情况2.3 client list 查看具体连接情况2.4 分析连接空闲时长2.5 client list 根据客户端IP统计连接数 三、问题结论和解决3.1 问题结论:3.2 解决方案①:优化程序3.3 解决方案…...

八股文面试题总结(包含主流的面试经典题)
Java基础 1、JDK和JRE的区别是什么** JDK是Java开发工具包,JRE是Java运行时环境,二者的区别在于 JRE是Java程序运行所必须的,它包含jvm和一些Java的基础类库 JDK是Java程序开发所必须的,它包含JRE和一些开发工具 总结一下就是…...

一分钟掌握 Java22 新特性
1. 增强的模式匹配(Pattern Matching for Switch) Java 22 扩展了模式匹配的功能,允许在 switch 语句中使用模式匹配,从而使代码更加简洁和易读。 示例代码: public class PatternMatchingSwitchDemo {public stati…...

西安凭借入驻企业展示科技“硬”实力的数字媒体产业园
在古城西安的怀抱中,一座以科技“硬”实力为核心竞争力的数字媒体产业园——西安国际数字影像产业园,正以其独特的魅力和无限的潜力,吸引着全球的目光。这里,不仅是数字创意的孵化场,更是科技创新的策源地。 西安国际数…...

【网络安全】利用XSS、OAuth配置错误实现token窃取及账户接管 (ATO)
未经许可,不得转载。 文章目录 正文正文 目标:target.com 在子域sub1.target.com上,我发现了一个XSS漏洞。由于针对该子域的漏洞悬赏较低,我希望通过此漏洞将攻击升级至app.target.com,因为该子域的悬赏更高。 分析认证机制后,我发现: sub1.target.com:使用基于Cook…...

浙江所有省级医院体检报告查询上线浙里办!
在医院完成体检后不知道什么时候出报告 体检报告出来后又要跑一次医院去拿报告 历年体检报告没保管好 往年体检报告找不到了 ………… 编辑 为解决这些问题,浙江省卫生健康委结合“两卡融合、一网通办”工作的推进,不断丰富电子健康医保卡的功能&#…...

支付宝支付Java+uniapp支付宝小程序
JS: request.post(/vip/pay, {//这是自己写的java支付接口id: this.vipInfo.id,payWay: alipay-mini}).then((res) > {let success (res2) > {//前端的支付成功回调函数this.$refs.popup.close();// 支付成功刷新当前页面setTimeout(() > {this.doGetVipI…...

Linux-磁盘优化的几个思路
优化前先看看性能指标 I/O 基准测试 fio(Flexible I/O Tester)正是最常用的文件系统和磁盘 I/O 性能基准测试工具。这类工具非常用,了解即可 应用程序优化 应用程序处于整个 I/O 栈的最上端,它可以通过系统调用,来调…...

【第三版 系统集成项目管理工程师】第15章 组织保障
持续更新。。。。。。。。。。。。。。。 【第三版】第十五章 组织保障 15.1信息和文档管理15.1.1 信息和文档1.信息系统信息-P5462.信息系统文档-P546 15.1.2 信息(文档)管理规则和方法1.信息(文档)编制规范-P5472.信息(文档)定级保护-P5483.信息(文档)配置管理-P549练习 15.…...

从编程视角看生命、爱、自由、生活的排列顺序
从编程视角看生命、爱、自由、生活的排列顺序 离开大学校园,踏入大厂成为一名算法工程师后,我常以编程思维看待生活中的事物。在思考生命、爱、自由和生活的排列顺序时,发现从编程角度分析这些概念会有独特见解。 一、生命——程序的核心代…...

Lumerical——属性编辑窗口的详解
一、几何选项卡(Geometry tab) 通过几何选项卡中的选项可以设定物件的位置和大小。 二、材料选项卡(Material tab) ① 材料(MATERIAL): 在该字段可以设置成材料数据库中包含的任何材料。数据库也有可能包含一些新材料,也可以对已经包含的材料进行编辑。如果选…...

08实战篇:972应用题(2024)思路解析
在本节中,你将学习到: 2024年972应用题的基本解题思路如何应对陌生的社会/学术热点问题,避免初见杀题目一:阐述搜索引擎的工作基本原理 关键词:搜索引擎、基本原理题型:基础概念题这是一道混在应用题中的简答题。根据《信息检索》一书中的P37内容回答即可(同时对应P45—…...

解决应用程序启动失败问题:由于找不到d3dx9_43.dll文件,如何快速有效地恢复和修复缺失的DLL组件
由于找不到d3dx9_43.dll,许多用户在启动某些游戏或者图形相关软件时遇到了棘手的问题。这个小小的DLL文件,虽然看似不起眼,却在众多基于DirectX 9技术构建的应用程序中扮演着至关重要的角色。对于游戏爱好者来说,当满心欢喜地准备…...

Ubuntu——双系统Ubuntu22.04系统安装和基础配置
文章目录 一、Ubuntu22.04双系统安装双系统安装和卸载 二、基础配置更新软件源搜狗输入法TimeShift上网 三、AI配置CondaCUDA12.6Pytorch2.3.0-cu121 四、额外配置Samba局域网文件共享系统 一、Ubuntu22.04双系统安装 双系统安装和卸载 双系统卸载安装Ubuntu双系统windows系统…...

stm32定时器中断和外部中断
一,中断系统的介绍 中断:在主程序运行过程中,出现了特定的中断触发条件(中断源),使得CPU暂停当前正在运行的程序,转而去处理中断程序,处理完成后又返回原来被暂停的位置继续运行 中…...

LeetCode 每日一题 2024/9/30-2024/10/6
记录了初步解题思路 以及本地实现代码;并不一定为最优 也希望大家能一起探讨 一起进步 目录 9/30 1845. 座位预约管理系统10/1 983. 最低票价10/2 1870. 准时到达的列车最小时速10/3 1928. 规定时间内到达终点的最小花费10/4 1227. 飞机座位分配概率10/5 2187. 完成…...

Redis篇(最佳实践)(持续更新迭代)
介绍一:键值设计 一、优雅的key结构 Redis 的 Key 虽然可以自定义,但最好遵循下面的几个最佳实践约定: 遵循基本格式:[业务名称]:[数据名]:[id]长度不超过 44 字节不包含特殊字符 例如: 我们的登录业务࿰…...

详细介绍pandas 在python中的用法
Pandas 是 Python 中非常流行的数据分析和处理库,特别适用于处理结构化数据。它构建在 NumPy 之上,提供了更高级的功能,例如数据清理、整理、筛选和统计分析。Pandas 的核心数据结构是 Series 和 DataFrame,分别用于处理一维数据和…...

八字命理测算系统开发-源码搭建
八字命理测算系统的开发是一个结合了传统命理学与现代科技的项目,旨在为用户提供基于个人出生年、月、日、时等信息的个性化命理分析和预测。以下是开发此类系统时需要考虑的关键步骤和技术要点: 一、前期准备 1.确定需求和目标用户 与客户或团队讨论&am…...

Python批量读取mat文件
一、前言 使用Python中的h5py库实现同一目录下多个mat文件的批量读取功能,获取数据、lon、lat等信息,其他变量内容可根据自己的mat格式进行更改。 二、代码 def open_matfiles(dir, start_indexNone, end_indexNone,lev_indexNone,lev_valueNone):打开…...

UE4 材质学习笔记05(凹凸偏移和视差映射/纹理压缩设置)
一.凹凸偏移和视差映射 1.偏移映射 这需要一个高度图并且它的分辨率很低,只有256*256,事实上,如果高度图的分辨率比较低并且有点模糊,效果反而会更好 然后将高度图输出到BumpOffset节点的height插槽中, 之后利用得到…...

基于贝叶斯决策的 CAD 程序设计方案
✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…...

算法: 二分查找题目练习
文章目录 二分查找二分查找在排序数组中查找元素的第一个和最后一个位置搜索插入位置x 的平方根山脉数组的峰顶索引寻找峰值寻找旋转排序数组中的最小值点名 总结模版 二分查找 二分查找 没啥可说的,轻轻松松~ class Solution {public int search(int[] nums, int target) {i…...

Qt开发技巧(十三)QList插入操作,扩展类型的使用,关于QSS的坑,Qt的延时方法,Qt编译的三种版本,环境搭建多练练,指向Qt源码的报错
继续讲一些Qt开发中的技巧操作: 1.QList插入操作 关于QList队列的处理中,我们最常用的就是调用append函数添加item,往前插入item很多人第一印象就是调用insert(0,xxx)来插入,其实QList完全提供了往前追加item的函数prepend()、pus…...

docker快速上手
一个轻量的虚拟机,让程序员不再纠结于环境部署,更多集中于代码编写,基础建设,开发 作用: 打包:把你软件运行所需的所有东西打包到一起 分发:把你打包好的“安装包”上传到一个镜像仓库&#…...

JAVA学习-练习试用Java实现“反转链表 II”
问题: 给定单链表的头指针 head 和两个整数 left 和 right ,其中 left < right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。 示例 1: 输入:head [1,2,3,4,5], left 2, right 4 输出…...

15分钟学 Python 第35天 :Python 爬虫入门(一)
Day 35 : Python 爬虫简介 1.1 什么是爬虫? 网页爬虫(Web Crawler)是自动访问互联网并提取所需信息的程序。爬虫的主要功能是模拟用户通过浏览器访问网页的操作,从而实现对网页内容的批量访问与信息提取。它们广泛应用于数据收集…...

【Qt】Qt学习笔记(一):Qt界面初识
Qt 是一个跨平台应用程序和 UI 开发框架。使用 Qt 您只需一次性开发应用程序,无须重新编写源代码,便可跨不同桌面和嵌入式操作系统部署这些应用程序。Qt Creator是跨平台的Qt集成开发环境。 创建项目 Qt的一些界面,初学时一般选择Qt Widgets …...

Unity3D游戏的内存控制详解
前言 Unity3D是一款流行的游戏引擎,支持多种平台,包括PC、移动设备和VR等。随着游戏的复杂性不断提高,Unity3D的内存管理变得尤为重要。本文将详细介绍Unity3D游戏中的内存控制技术,包括自动内存管理、对象池、延迟加载资源和手动…...

《数据结构》--栈【概念应用、图文并茂】
本节讲完栈下次再讲一下队列,最后补充一个串,我们的线性结构基本就完事了。下图中黄色框框圈中的是我们今日份内容(分为两篇博客): 知识体系图 栈(Stack-LIFO)结构 栈的基础概念 栈(Stack)是一个后进先出(Last-In-First-Out)的一个特殊数据…...