Redis 缓存指标在 SpringBoot 2.4.2 版本中不起作用

Posted

技术标签:

【中文标题】Redis 缓存指标在 SpringBoot 2.4.2 版本中不起作用【英文标题】:Redis cache metrics doesn't work in SpringBoot version 2.4.2 【发布时间】:2021-05-27 05:09:36 【问题描述】:

我们正在尝试向 Prometheus 公开我们的 redis 缓存指标。以下是我们所做的。

我们有一个类CachingConfig,如下所示,

@Configuration
@EnableCaching
public class CachingConfig 

  private final Duration cacheEntryTtl;

  public CachingConfig(
      @Value("$spring.cache.redis.entryTtl")
      final Duration cacheEntryTtl
  ) 
    this.cacheEntryTtl = cacheEntryTtl;
  

  @Bean
  public CacheManager cacheManager(final RedisConnectionFactory redisConnectionFactory) 
    final Map<String, RedisCacheConfiguration> cacheConfigurations = new HashMap<>();
    cacheConfigurations.put("cacheA",cacheConfiguration(cacheEntryTtl));
    cacheConfigurations.put("cacheB",cacheConfiguration(cacheEntryTtl));

    return RedisCacheManager.builder(redisConnectionFactory)
        .cacheDefaults(cacheConfiguration(cacheEntryTtl))
        .withInitialCacheConfigurations(cacheConfigurations)
        .build();
  

然后我们在我们的类中使用 Redis 缓存,如下所示。

public class BusinessService 
    public static final String CACHE_A_NAME = "cacheA"
    private final BusinessServiceClient businessServiceClient;
    private final CacheManager cacheManager;
    private final CacheMetricsRegistrar cacheMetricsRegistrar;

    @PostConstruct
    public void postConstruct() 
        final Cache cache = cacheManager.getCache(CACHE_A_NAME);
        cacheMetricsRegistrar.bindCacheToRegistry(cache);
    

    @Cacheable(cacheNames = CACHE_A_NAME)
    public Set<String> getOwnersOfProviderAccount(String para1, String para2) 
        return businessServiceClient.getResonponse(para1, para2);
    

根据this,我还在我们的application.properties 文件中添加了以下行。

spring.cache.type=redis
spring.cache.redis.enable-statistics=true

所以理论上,Redis 缓存指标应该能够工作,但是当我从以下 URL 检查我们的缓存指标时。

GET .../actuator/metrics/cache.gets?tag=name:cacheA

响应总是像下面这样,COUNT 总是为零,似乎统计数据不起作用,但我们的 Redis 缓存有效。


   "name":"cache.gets",
   "description":"The number of pending requests",
   "baseUnit":null,
   "measurements":[
      
         "statistic":"COUNT",
         "value":0.0
      
   ],
   "availableTags":[
      
         "tag":"result",
         "values":[
            "hit",
            "pending",
            "miss"
         ]
      ,
      
         "tag":"cache",
         "values":[
            "cacheA"
         ]
      ,
      
         "tag":"application",
         "values":[
            "business-service"
         ]
      ,
      
         "tag":"cacheManager",
         "values":[
            "cacheManager"
         ]
      
   ]

如果我们检查来自 /management/prometheus 的指标,我们会得到以下结果,所有值都是零。

# HELP cache_gets_total the number of times cache lookup methods have returned an uncached (newly loaded) value, or null
# TYPE cache_gets_total counter
cache_gets_totalapplication="business-service",cache="cacheA",cacheManager="cacheManager",name="cacheA",result="miss", 0.0
cache_gets_totalapplication="business-service",cache="cacheA",cacheManager="cacheManager",name="cacheA",result="pending", 0.0
cache_gets_totalapplication="business-service",cache="cacheA",cacheManager="cacheManager",name="cacheA",result="hit", 0.0

我在配置 Redis 缓存指标时是否遗漏了什么?谢谢,任何建设性的建议都值得赞赏。

【问题讨论】:

【参考方案1】:

您正在自己创建RedisCacheManager,因此缓存管理器自动配置已退出。因此,spring.cache.type=redis 是不必要的,更重要的是,spring.cache.redis.enable-statistics=true 将不起作用。

要启用RedisCacheManager 的统计信息,请在cacheManager @Bean 方法中调用构建器上的enableStatistics() 方法。

【讨论】:

以上是关于Redis 缓存指标在 SpringBoot 2.4.2 版本中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 2.x 集成 Redis 缓存

SpringBoot整合redis缓存

SpringBoot 结合 Spring Cache 操作 Redis 实现数据缓存

Springboot 2.0.x Redis缓存Key生成器,自定义生成器

完美取代hashmap,SpringBoot整合Redis缓存DB数据

Springboot+Redis缓存(windows下配置)