spring boot默认不开启redis缓存统计,因rediscachemanager仅作轻量封装、不实现cachestatistics接口,且2.4+已移除自动配置支持;需通过自定义cache子类+aop或micrometer+cachemeterbinder手动接入。

Spring Boot默认不开启Redis缓存的统计信息(比如命中率、put/get次数),RedisCacheManager 本身不内置统计能力,必须手动启用并配置监控逻辑——否则你在日志或Actuator端点里根本看不到任何缓存行为数据。
为什么 RedisCacheManager 默认没有缓存统计?
因为 Spring 的 RedisCacheManager 是一个轻量封装,它只负责把 Cache 接口调用转成 Redis 操作,不记录指标。统计属于可观测性范畴,需显式接入或自行包装。
- Spring Boot 2.4+ 移除了
cache.statistics自动配置支持,旧版(如 1.5.x)的spring.cache.redis.statistic-interval已失效 -
RedisCacheConfiguration类本身不含统计开关,它只控制序列化、TTL、null 值策略等基础行为 - 即使你启用了 Actuator 的
/actuator/caches端点,返回的也只是缓存名称列表,不是运行时指标
如何让 @Cacheable 方法产生可采集的统计信息?
核心思路:不依赖 RedisCacheManager 自带功能,而是用 AOP 或自定义 Cache 实现包裹原始缓存操作,并在每次 get/put/evict 时更新计数器。
Redis 缓存和数据结构管理技能。通过自然语言操作 Redis,支持 String、Hash、List、Set、ZSet、Stream 等数据结构操作。当用户提到 Redis、缓存、消息队列、会话存储时使用此技能。
- 继承
RedisCache,重写get、put、evict方法,在内部维护AtomicLong hitCount、missCount、putCount等字段 - 在构造时传入一个全局
ConcurrentMap<string cachestats></string>,按 cacheName 分组聚合指标 - 暴露一个
@GetMapping("/cache/stats")接口或集成到 Actuator,返回 JSON 格式统计(如{"users": {"hits": 120, "misses": 8, "hitRate": 0.937}}) - 避免在高并发下锁竞争:所有计数器必须用
AtomicLong,不要用synchronized或ReentrantLock
使用 Micrometer + CacheMeterBinder 的标准方式
如果你已引入 spring-boot-starter-actuator 和 micrometer-registry-prometheus(或其他 registry),推荐走 Micrometer 官方路径,比手写更可靠:
- 确保依赖包含:
spring-boot-starter-actuator、micrometer-registry-prometheus(或micrometer-registry-graphite) - 自定义
CacheManagerBean 时,用RedisCacheManager.builder(...).withCacheConfiguration(...)构建,**不要直接 new RedisCacheManager** - 手动注册
CacheMeterBinder:@Bean public CacheMeterBinder cacheMeterBinder(CacheManager cacheManager) { return new CacheMeterBinder(cacheManager, "redis"); } - 启动后访问
/actuator/metrics/cache.gets或 Prometheus 的cache_gets_total{cache="users",result="hit"}即可看到指标 - 注意:
CacheMeterBinder只对实现了CacheStatistics接口的Cache生效;而默认RedisCache不实现该接口,所以必须配合自定义Cache子类(见上一节)一起用
容易忽略的关键点
很多人卡在「配了却看不到指标」,问题往往出在三个地方:
-
@EnableCaching开了,但没在配置类里显式定义CacheManagerBean —— Spring Boot AutoConfiguration 会 fallback 到无统计能力的默认实例 - 用了
RedisCacheConfiguration.defaultCacheConfig(),但没调用.disableCachingNullValues()或.serializeValuesWith(...),导致缓存 key/value 序列化失败,统计逻辑根本没走到 - 在
@Cacheable方法上用了unless = "#result == null",结果 null 值被拦截,missCount不增加,误以为统计不准
统计不是开个配置就行的事,它需要你明确选择「自己埋点」还是「对接 Micrometer」,并且保证每一层(CacheManager → Cache → RedisTemplate)都按预期串联。漏掉任意一环,指标就断了。










