You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SpringBoot+Caffeine+Micrometer:多缓存配置与可观测性实现

实现两个独立配置的Caffeine缓存+Micrometer监控

1. 缓存配置类实现

创建配置类,为两个第三方服务分别定义独立的缓存实例,同时绑定Micrometer指标采集:

import com.github.benmanes.caffeine.cache.Caffeine;
import io.micrometer.core.instrument.MeterRegistry;
import io.micrometer.core.instrument.binder.cache.CaffeineCacheMetrics;
import org.springframework.cache.Cache;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.caffeine.CaffeineCache;
import org.springframework.cache.support.SimpleCacheManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;

@Configuration
@EnableCaching
public class CacheConfig {

    // 第三方服务1缓存:1小时过期,最大容量1000
    @Bean
    public Cache service1Cache(MeterRegistry meterRegistry) {
        Caffeine<Object, Object> caffeineConfig = Caffeine.newBuilder()
                .expireAfterWrite(1, TimeUnit.HOURS)
                .maximumSize(1000)
                .recordStats(); // 开启缓存统计

        CaffeineCache cache = new CaffeineCache("service1-cache", caffeineConfig.build());
        // 绑定Micrometer指标,指定缓存标识
        CaffeineCacheMetrics.monitor(meterRegistry, cache, "service1-cache");
        return cache;
    }

    // 第三方服务2缓存:2小时过期,最大容量500
    @Bean
    public Cache service2Cache(MeterRegistry meterRegistry) {
        Caffeine<Object, Object> caffeineConfig = Caffeine.newBuilder()
                .expireAfterWrite(2, TimeUnit.HOURS)
                .maximumSize(500)
                .recordStats();

        CaffeineCache cache = new CaffeineCache("service2-cache", caffeineConfig.build());
        CaffeineCacheMetrics.monitor(meterRegistry, cache, "service2-cache");
        return cache;
    }

    // 将两个缓存注册到CacheManager
    @Bean
    public CacheManager cacheManager(List<Cache> caches) {
        SimpleCacheManager manager = new SimpleCacheManager();
        manager.setCaches(caches);
        return manager;
    }
}

2. 服务层绑定缓存

在调用第三方服务的方法上,指定对应缓存名称即可:

import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

@Service
public class ThirdPartyCallerService {

    @Cacheable(value = "service1-cache", key = "#requestParam")
    public String callService1(String requestParam) {
        // 调用第三方服务1的逻辑(原耗时超5秒)
        return "service1-response";
    }

    @Cacheable(value = "service2-cache", key = "#requestParam")
    public String callService2(String requestParam) {
        // 调用第三方服务2的逻辑(原耗时超5秒)
        return "service2-response";
    }
}

3. 监控指标说明

Micrometer会自动生成带缓存标识的核心指标(以Prometheus格式为例):

  • cache_gets_total{cache="service1-cache",result="hit"}:缓存命中次数
  • cache_gets_total{cache="service1-cache",result="miss"}:缓存未命中次数
  • cache_size{cache="service2-cache"}:缓存当前存储量
  • cache_load_duration_seconds{cache="service2-cache"}:缓存加载耗时

这些指标可通过Spring Boot的/actuator/prometheus端点获取(需引入spring-boot-starter-actuator和micrometer-registry-prometheus依赖)。

注意事项

  • 确保已引入依赖:spring-boot-starter-cache、com.github.benmanes.caffeine:caffeine、micrometer-core
  • 缓存key需根据实际请求参数合理设计,避免缓存击穿/雪崩
  • 如需基于访问时间过期,可替换expireAfterWrite为expireAfterAccess

内容的提问来源于stack exchange,提问作者PatPanda

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 20:26:03