首页/数据/Redis 进阶速查/连接复用:省下的是握手成本
性能与排障129 条

连接复用:省下的是握手成本

短连接每次都要 TCP 握手、认证与初始化,高并发下连接建立本身成为延迟与 CPU 来源;连接池复用是客户端侧的基本优化。

Redis 进阶速查数据更新于 2026-10-13

连接复用省的是什么

短连接每次都要走一遍 TCP 三次握手、可选的 TLS 握手、认证与客户端初始化,这些往返不产生业务价值却实实在在占掉延迟与 CPU。高并发下连接建立速率本身会成为瓶颈,服务端还要为每条新连接分配缓冲与内存。连接池长期持有并复用连接,是客户端侧收益最直接的优化,前提是池大小与回收策略和服务端容量匹配。

基本信息

主要成本TCP 握手、TLS 握手、认证、客户端初始化
推荐方案连接池复用长连接
服务端约束每条连接占用文件描述符与缓冲,总量受 maxclients 限制
配套参数池最大连接数、空闲回收时间、获取连接超时
验证方式INFO clients 看连接数,INFO stats 看 rejected_connections

典型使用场景

  • 高并发业务:每秒上万请求时,握手环节就会吃掉大量时间预算
  • TLS 场景:握手开销远高于明文,复用带来的收益更明显
  • 容器扩缩容:副本数变化让连接总数波动,池上限需要随之评估
  • 故障恢复:池的健康检查决定重连是平滑还是风暴
  • 服务端资源受限:用池把并发连接数压进可控区间

两端一起看

两端一起看
redis-cli INFO clients | grep -E 'connected_clients|maxclients'  # 当前连接与上限
redis-cli INFO stats | grep rejected_connections                  # 是否出现过拒绝
redis-cli CONFIG GET maxclients                                   # 核对服务端连接上限
redis-cli INFO clients | grep client_recent_max_input_buffer      # 单连接缓冲峰值
# 客户端侧按库文档配置池(示例):max=50, idle=10, acquire_timeout=200ms

连接成本对照

动作相对成本说明
复用已有连接一次请求一次往返目标状态
新建明文连接握手加往返认证与初始化另算
新建 TLS 连接显著高于明文证书校验与会话协商都耗时
连接被拒绝请求直接失败rejected_connections 上升说明已达上限
池不是越大越好:服务端为每条连接分配读写缓冲,连接数暴涨会推高内存并加重事件循环负担。按实测压出合适的池上限,比套用网上流传的经验值可靠。
池中空闲连接缺少健康检查时,取到一条已被对端关闭的连接,请求会在首次读写时报错。配合保活间隔与取用前校验,才能把这类偶发失败压下去。

易错点

  • 池上限拍脑袋设得过大:故障时所有副本同时重连,重连风暴把刚恢复的节点再打一遍
  • 取连接时不校验存活:拿到对端已关闭的连接,业务侧表现为随机的连接重置报错
  • 空闲连接长时间不释放:服务端或 LB 先回收了连接,池里却留着大量死连接
  • 只优化客户端不看 maxclients:池总量超过服务端上限时新连接被拒绝,问题从延迟升级为可用性

数据来源与参考

  • Redis 官方实践:客户端连接管理
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌