Redis的maxclients参数决定了单个实例能同时持有的客户端连接数量,默认值是10000。这个数字听起来不小,但在使用连接池、每个请求都可能新建连接的场景下,稍不留神就会撞到上限,出现经典的报错:max number of clients reached。一旦到达上限,Redis会直接拒绝新连接,业务侧表现为大量请求超时,影响面非常大。这篇文章就来把这个参数的配置方法、它和操作系统文件描述符的关系,以及连接数被打满时的排查思路讲清楚。

maxclients的两种设置方式
第一种是修改配置文件redis.conf。找到或新增一行maxclients配置,写入期望的值即可,比如把上限提到20000,然后重启实例生效。这种方式适合变更窗口固定的场景,配置会持久化,重启后依然有效。
# redis.conf 中设置最大客户端连接数为 20000 maxclients 20000
第二种是通过CONFIG SET命令在线修改,不需要重启服务:
# 在线修改,立即生效 127.0.0.1:6379> CONFIG SET maxclients 20000 OK # 查看当前值 127.0.0.1:6379> CONFIG GET maxclients 1) "maxclients" 2) "20000"
需要注意,CONFIG SET只对当前运行中的进程生效,如果只改了这里而没有写回配置文件,实例重启后会回落到旧值。稳妥的做法是在线修改验证无误后,再补一句CONFIG REWRITE,把当前配置回写到redis.conf中。两种方式各有适用场景:紧急扩容用CONFIG SET,长期规划用配置文件,实际运维中往往两者结合使用。
为什么改了maxclients却没有生效
很多人把maxclients从10000改成50000,重启后发现实际值不是50000,而是变小了。这是因为Redis启动时会检查当前进程能打开的文件描述符数量,也就是操作系统的限制。Redis自身要占用一部分描述符(大约32个用于内部用途),能分配给客户端的只有剩余部分。如果系统的限制不够,Redis会把maxclients自动下调到ulimit减去32,并在启动日志里打出一行告警。
# 查看当前用户的文件描述符软限制 ulimit -Sn 1024 # 临时提高限制 ulimit -n 65535
所以调整maxclients之前,必须先确认操作系统的限制足够。临时修改用ulimit命令,永久生效需要编辑/etc/security/limits.conf,给运行Redis的用户加上类似redis soft nofile 65535和redis hard nofile 65535的配置。如果Redis由systemd管理,还要在service文件中设置LimitNOFILE=65535,否则limits.conf的配置不会生效。这三层限制是层层递进的,漏掉任何一层都可能导致实际值不符合预期。
另一个容易忽略的点是容器环境。在Docker或Kubernetes中运行Redis时,容器的文件描述符限制可能继承自容器运行时而非宿主机配置,需要在部署描述中显式声明。排查时可以直接看Redis启动日志,里面会明确写出实际的maxclients值,以及它是否因为文件描述符限制而被下调。
连接数被打满的排查与治理
配置够大不代表万事大吉,连接数被打满往往暴露的是业务侧问题。最常见的原因是连接泄漏:客户端创建了连接却没有归还连接池或关闭,连接一直挂着占坑。还有一类是慢查询堆积导致请求处理变慢,客户端为了维持吞吐不断新建连接,进一步加剧占用。排查时可以用client list命令查看每个连接的来源IP、端口、空闲时长和年龄:
# 查看当前所有客户端连接的关键信息 127.0.0.1:6379> CLIENT LIST id=12 addr=192.168.1.20:52318 fd=9 name= age=3600 idle=3500 ... id=15 addr=192.168.1.21:52320 fd=10 name= age=7200 idle=7100 ...
如果发现大量连接的idle值非常高,基本可以判定是空闲连接没被释放。这时可以配置timeout参数,让空闲超过指定秒数的连接被服务端主动断开,比如timeout 300表示空闲5分钟就关闭。同时配合tcp-keepalive让服务端定期探测死连接。应用侧则要检查连接池的max-idle、max-total配置,确保连接能正常复用和回收。
从容量规划的角度看,maxclients并不是越大越好。每个连接都消耗内存(初始几KB,带缓冲区后会增长),无脑调大上限可能掩盖真正的连接泄漏问题。合理的做法是:根据应用实例数量乘以每个实例连接池大小估算总需求,留出两到三成余量,同时用INFO clients中的connected_clients指标做监控告警,在连接数逼近上限前发现问题,而不是等到报错才处理。
Redis maxclientsRedis连接数文件描述符修改时间:2026-09-07 19:22:32