spring boot集成redis后需通过info stats命令或自定义rediscachewrapper获取命中率,/actuator/caches端点不提供命中率数据。

Spring Boot集成Redis后,CacheManager本身不暴露命中率指标,必须通过Redis原生命令或自定义包装层获取——直接依赖@Cacheable注解或RedisCacheManager默认配置是看不到命中/未命中次数的。
用INFO stats命令读取Redis原生命中率
这是最轻量、最可靠的方式,不侵入业务代码,适用于所有Redis部署形态(单机、哨兵、集群)。
-
keyspace_hits和keyspace_misses是Redis内置计数器,每次GET/SET等操作都会自动更新 - 命中率 =
keyspace_hits / (keyspace_hits + keyspace_misses),注意分母为0时需做保护 - 调用方式:通过
redisTemplate.getRequiredConnectionFactory().getConnection().info("stats")获取Properties对象 - 不要用
info("all"),数据量大且解析慢;明确指定"stats"即可 - 该值是**累积值**,不是实时窗口值,需在监控系统中做差值计算(如Prometheus用
rate()函数)
自定义RedisCacheWrapper统计命中率
当需要按缓存名(如"users"、"orders")拆分命中率,或想和Spring Cache生命周期强绑定时,必须包装RedisCache。
Redis 8.2.3 是一款安全优先的高性能键值存储系统。该版本紧急修复了可能引发远程代码执行(RCE)的高危漏洞(CVE-2025-62507),并解决了 HyperLogLog 及 Cuckoo Filter 等数据结构在特定场景下的崩溃问题。建议所有用户立即升级,以保障生产环境的系统稳定与数据安全。
- 继承
org.springframework.data.redis.cache.RedisCache,重写get(Object key)和put(...)方法,在内部维护AtomicInteger hits和misses - 不能直接代理
RedisCacheManager,因为它的getCache(String name)返回的是不可变实例,需在构造RedisCache时注入包装类 - 关键点:必须复用原有
RedisCacheConfiguration,否则序列化、TTL等配置会丢失 - 暴露
getHitRate()方法供Actuator端点或HTTP接口调用,避免每次调用都触发Redis通信
避免误用Spring Boot Actuator的/actuator/caches端点
这个端点只返回缓存名列表和基础属性(如是否启用、是否允许null值),**完全不包含任何命中率数据**。
- 它底层调用的是
CacheManager.getCacheNames(),和Cache实例的运行时状态无关 - 即使你用了
RedisCacheManager,该端点也不会去查Redis的INFO stats - 别被名字误导——
/actuator/caches≠ 缓存监控,它只是个静态注册表查看器 - 真要集成到Actuator,得自己写一个
CacheMetricsEndpoint,手动聚合INFO stats或包装类指标
真正难的不是采集,而是区分“谁在用缓存”:业务方可能混用RedisTemplate直连和@Cacheable,前者绕过所有Spring Cache统计;命中率数字若没对齐使用路径,就只是个幻觉。










