lettuce连接池指标需显式启用spring.redis.lettuce.metrics.enabled=true才能在/actuator/metrics中查看,包括active.count、idle.count等关键指标;redistemplate不暴露连接池状态,健康检查无法反映连接池压力,必须依赖actuator指标监控。

直接看/actuator/metrics里的Redis连接池指标
Spring Boot 2.0+ 默认用 Lettuce,只要启用了 Actuator 和 Micrometer,Lettuce 内置的连接池指标就会自动注册到 /actuator/metrics 端点下,前提是配置了 spring.redis.lettuce.metrics.enabled=true。不配这个,redis.clients.lettuce.connection.pool.* 这类指标压根不会出现。
常见可用指标包括:
-
redis.clients.lettuce.connection.pool.active.count:当前活跃连接数 -
redis.clients.lettuce.connection.pool.idle.count:空闲连接数 -
redis.clients.lettuce.connection.pool.max.count:连接池最大容量 -
redis.clients.lettuce.connection.pool.pending.acquisition.count:等待获取连接的请求数(高值=连接池瓶颈)
访问示例:curl http://localhost:8080/actuator/metrics/redis.clients.lettuce.connection.pool.active.count。注意:该端点返回的是带标签的样本集合,不是单个数字,需解析 measurements[0].value 字段。
为什么RedisTemplate不能直接查活跃连接数
RedisTemplate 是高层封装,它不持有、也不暴露连接池状态。你调用 redisTemplate.opsForValue().get("key") 时,底层从 Lettuce 的 GenericObjectPool 拿连接,但模板本身无 getter 方法返回池对象。
试图绕过工厂去“猜”连接池实例,比如强转 redisConnectionFactory 为 JedisConnectionFactory,会触发 ClassCastException——因为 Spring Boot 3.x 已彻底弃用 Jedis,默认且仅启用 Lettuce。
正确做法是:确认实际生效的工厂类型,再通过反射或 Lettuce 原生 API 访问池实例(不推荐生产环境这么做),或者——更稳妥地——只依赖 Actuator 指标端点。
自定义健康检查只能判断通不通,不能反映连接池压力
实现 HealthIndicator(如 RedisHealthIndicator)能告诉你 Redis 是否 ping 得通,但它每次只建一个临时连接做探测,完全不经过连接池,也读不到 active.count 或 pending.acquisition.count 这类关键负载信号。
这意味着:
- 健康检查显示
UP,不代表连接池没耗尽 - 健康检查失败,可能是网络问题,也可能是连接池满导致新连接超时,但你无法区分
- 它不提供历史趋势,没法预警“活跃连接数连续5分钟 > 90% max”这类场景
所以,健康检查和指标监控必须并存:前者保底线,后者管容量。
Lettuce 指标默认不采集,必须显式开启
Micrometer 的 RedisMeterRegistry 不会被 Spring Boot 自动装配;即使你加了 micrometer-registry-prometheus,Redis 相关 timer/gauge 仍是空的。根本原因是 Lettuce 的指标挂钩默认关闭。
最小必要配置只有两条:
management.endpoints.web.exposure.include=health,metricsspring.redis.lettuce.metrics.enabled=true
缺一不可。漏掉第二条,所有 redis.clients.lettuce.* 指标都不会上报。另外,如果你用了自定义 ClientResources 或手动配置 LettuceClientConfiguration,得确保它没覆盖掉 metrics 配置。
连接池指标是诊断 Redis 瓶颈最直接的依据,但它藏得比健康检查深一点——得靠配置撬开,而不是靠代码写出来。











