spring boot 2.0+ 默认使用 lettuce,若配置 spring.redis.jedis.pool.max-active 不生效,是因为未排除 lettuce 依赖且未引入 jedis,导致 jedis 配置被完全忽略;必须在 spring-boot-starter-data-redis 中排除 lettuce-core 并显式添加 jedis 依赖,否则底层不会初始化 jedis 连接池。

Spring Boot 默认用 Lettuce,不是 Jedis;想切 Jedis 必须显式排除依赖并引入,否则 spring.redis.jedis 配置项会被忽略。
为什么 spring.redis.jedis.pool.max-active 不生效?
因为 Spring Boot 2.0+ 的 spring-boot-starter-data-redis 默认只加载 Lettuce 客户端。即使你写了 Jedis 的配置项,Spring 也不会解析它——底层压根没初始化 Jedis 连接池。
- 检查 Maven 是否包含
redis.clients:jedis,且没有被spring-boot-starter-data-redis的传递依赖覆盖 - 必须排除默认 Lettuce:
<dependency><groupid>org.springframework.boot</groupid><artifactid>spring-boot-starter-data-redis</artifactid><exclusions><exclusion><groupid>io.lettuce</groupid><artifactid>lettuce-core</artifactid></exclusion></exclusions></dependency>
- 再显式引入 Jedis:
<dependency><groupid>redis.clients</groupid><artifactid>jedis</artifactid></dependency>
spring.redis.lettuce.pool 参数调哪些才不泄漏?
Lettuce 连接池泄漏最常见原因是空闲连接不回收、等待队列卡死、或 reactive 场景下连接未关闭。关键参数不是“越多越好”,而是要配平:
-
max-active建议设为 20~40(不要负值),避免压垮 Redis 或本地 fd 限制 -
min-idle设为 0,Lettuce 不推荐维持常驻空闲连接(Netty channel 复用机制不同) -
time-between-eviction-runs必须 > 0(如30000),否则 idle 连接永不驱逐 -
max-wait别设太长(建议 ≤ 2000ms),否则线程卡在获取连接上,堆积阻塞 -
shutdown-timeout至少留 5000ms,否则应用停机时连接强行中断,可能丢数据
集群模式下,RedisClusterConfiguration 和连接池怎么配合?
Lettuce 支持原生集群拓扑发现,但连接池行为和单机不同:它会为每个节点维护独立子池,总连接数 ≈ 节点数 × max-active。容易误判为“连接数爆炸”。
- 别用
spring.redis.host/port配集群,必须用spring.redis.cluster.nodes,例如:192.168.1.10:7001,192.168.1.10:7002,192.168.1.10:7003 - 集群模式下
max-active是 per-node,不是全局总数 - 若用哨兵,改用
spring.redis.sentinel.master+spring.redis.sentinel.nodes,此时连接池仍作用于最终解析出的 master 地址 - 拓扑刷新间隔(
spring.redis.lettuce.cluster.refresh.period)建议设为 30000,避免频繁轮询影响性能
真正难的不是配参数,而是验证是否生效:启动后查 actuator/health 或 actuator/metrics,看 redis.connection.pool.active 和 redis.connection.pool.idle 是否随流量变化;线上务必开 lettuce debug 日志,盯住 pool acquired 和 pool released 事件是否对称。











