连接池需按业务负载调校而非套模板:redis-py生产中应设max_connections为50–100、min_idle为5–10、health_check_interval=30,区分socket_connect_timeout与socket_timeout;ioredis慎开enableOfflineQueue;redis-py无testOnBorrow,依赖health_check_interval和隐式健康检查;Lettuce与redis-py模型不同,前者事件驱动更轻量。
连接池不是“开了就完事”的开关,而是需要按业务节奏调校的资源调度器。盲目增大 max_connections 可能压垮 Redis 或耗尽文件描述符,而设得太小又会让请求排队阻塞。关键在匹配真实负载曲线,而非套用模板值。
ConnectionPool 怎么配才不踩坑redis-py 默认会创建一个 ConnectionPool,但默认参数(如 max_connections=10、health_check_interval=0)只适合开发环境。生产中必须显式配置:
max_connections 建议设为 50–100:低于 30 容易排队,高于 100 需同步确认 Redis 的 maxclients 和系统 ulimit -n
min_idle 设为 5–10:避免冷启动时频繁建连,尤其在定时任务或低峰后突发流量场景health_check_interval=30 必须启用:否则网络闪断或 Redis 主从切换后,池里残留的失效连接会持续失败,错误日志刷屏socket_connect_timeout 和 socket_timeout 要区分:前者控制 TCP 握手超时(建议 1–2s),后者控制命令执行超时(建议 3–5s),混用会导致连接卡死enableOfflineQueue 开还是关这个开关决定客户端在网络中断时是否缓存命令。开它看似容错更强,但实际风险很高:
RedisError: Connection is closed,你得自己处理重试逻辑,但可控性强retryStrategy 控制重试次数和退避间隔testOnBorrow 在 redis-py 里根本不存在这是 Jedis 用户迁移到 redis-py 时最常踩的坑。redis-py 没有 testOnBorrow 或 testOnReturn 这类参数,它的健康检查只靠 health_check_interval 定期 ping,且只对空闲连接生效。
Connection closed,别急着加测试逻辑,先检查 health_check_interval 是否设为 0(默认值),以及网络是否真稳定retry_on_timeout=True + 合理的 socket_timeout,而不是幻想每次取连接都做一次 TCP 探测两者底层模型不同:Lettuce 基于 Netty 的事件驱动,单连接可并发处理多命令;redis-py 是同步阻塞模型,每个连接同一时间只能处理一个命令。
max-active 实际影响的是连接数上限,而 redis-py 的 max_connections 直接对应并发吞吐瓶颈max-active=20 下,Redis 侧看到的连接数可能远少于 20;redis-py 则基本一对一max-wait=-1 表示无限等待连接,线上必须改成具体毫秒值(如 2000),否则线程池可能被卡死连接池参数不是一次性写死的配置项,而是要随业务流量、Redis 版本(RESP2/RESP3)、部署拓扑(单机/集群/Proxy)动态调整的运行时变量。监控 tasksQueueLength、连接池 idle 和 active 数,比背参数手册有用得多。