连接池的关键参数
客户端连接池解决的是连接复用与资源上限问题:必须限制最大连接数、设置连接与读写超时、开启健康检查以剔除死连接。阻塞类命令(BLPOP、BRPOP、SUBSCRIBE)会长期占用连接,必须走独立连接或独立池,否则会把普通请求的连接额度耗尽。
基本信息
| 适用 | 各语言官方客户端均内置连接池,参数名略有差异 |
|---|---|
| max_connections | 池上限;多个客户端的池之和要小于服务端 maxclients |
| socket_timeout | 读写超时,必须设置,避免线程无限等待 |
| health_check_interval | 定期探测空闲连接,避免复用已失效连接 |
redis-py 连接池示例
redis-py 连接池示例
import redis
pool = redis.ConnectionPool(host='127.0.0.1', port=6379, max_connections=100, socket_timeout=2, socket_connect_timeout=1, health_check_interval=30) # 上限、超时与健康检查
r = redis.Redis(connection_pool=pool)
r.set('k', 'v', ex=60) # 正常请求复用池中连接
blocking_pool = redis.ConnectionPool(host='127.0.0.1', port=6379, max_connections=5)
blocking = redis.Redis(connection_pool=blocking_pool)
blocking.brpop('q:jobs', timeout=5) # 阻塞命令走独立池,避免占用普通连接参数与容量关系
| 项 | 含义 | 常见错误 |
|---|---|---|
| max_connections | 单客户端池上限 | 各池相加超过服务端 maxclients |
| socket_timeout | 读写超时时间 | 不设超时导致线程挂死 |
| socket_connect_timeout | 建立连接超时 | 网络异常时连接过程长期阻塞 |
| health_check_interval | 空闲连接探测间隔 | 不开启会反复使用已断开的连接 |
| maxclients(服务端) | 实例允许的最大连接数 | 忽略复制、哨兵、监控与运维连接的占用 |
典型使用场景
- 高并发服务限制单实例连接数,避免压垮 Redis
- 实例抖动后快速恢复:健康检查剔除死连接
- 阻塞式队列消费:用独立池与普通请求隔离
- 连接数告警排查:核对各客户端池上限之和
- 多租户服务按业务分配独立连接池额度
服务端 maxclients 要预留额度:复制连接、哨兵、监控探针与运维命令行都会占份额,各客户端池加起来顶满就会拒绝新连接。
不设超时又不做健康检查时,实例抖动后池里可能全是死连接,服务会持续报错而无法自愈。
监控与调优
- 监控活跃连接数与获取连接的等待耗时,能提前发现容量不足
- 阻塞连接的池单独设置超时与重连策略,避免拖累普通请求
- 连接数与服务端 maxclients 一起看,确认整体预算是否留有余量