Spring Boot Caffeine Cache異なるキャッシュポリシーの設定とヒット率の表示

10230 ワード

Spring Boot Caffeine Cache異なるキャッシュポリシーの設定とヒット率の表示
SpringBootの公式ドキュメントによると、Caffiene Cacheの使い方は簡単です.
spring.cache.type=caffeine
spring.cache.cache-names=cache1,cache2
spring.cache.caffeine.spec=maximumSize=500,expireAfterAccess=600s

しかし、cache 1、cache 2に異なるポリシーを設定し、ヒット率を表示するにはどうすればいいのでしょうか.
カスタムポリシーには、次の2つの部分が必要です.
  • カスタムCacheManagerは、Spring Bootがデフォルトで生成したCaffeineCacheManager
  • に置き換えられます.
  • カスタムCache
  • サンプルコードは次のとおりです.
    @Bean
    	public CacheManager cacheManager() {
    		SimpleCacheManager cacheManager = new SimpleCacheManager();
    		List<Cache> caches = new ArrayList<>();
    		if (StringUtils.isNotBlank(commonCacheNames)) {
    			Caffeine<Object, Object> caffeine = Caffeine.from(commonSpec);
    			String[] cacheNames = commonCacheNames.split(",");
    			for (String cacheName : cacheNames) {
    				caches.add(new CaffeineCache(cacheName, caffeine.build(), true));
    			}
    		}
    		caches.add(productCache());
    
    		cacheManager.setCaches(caches);
    		return cacheManager;
    	}
    
    	@Bean
    	public Cache productCache() {
    		return new CaffeineCache("cache2", Caffeine.newBuilder()
    				.maximumSize(20000)
    				.expireAfterWrite(5, TimeUnit.MINUTES)
    				.recordStats() //              hit miss  
    				.build(), true);
    	}
    

    ヒット率を表示するには、spring-boot-starter-actuatorのサポートが必要です.直接配置すればいいです.(CaffeineCacheStatisticsProviderを含まないバージョンもあり、自分で実現する必要があります)
    構成が完了すると、http://xxxx.com/metricsにアクセスすると、キャッシュの現在のsize、miss ratio、hit ratioが表示されます.
    最後にCaffeineCacheStatusProviderのコードを添付します.
    public class CaffeineCacheStatisticsProvider
    		implements CacheStatisticsProvider<CaffeineCache> {
    
    	@Override
    	public CacheStatistics getCacheStatistics(CacheManager cacheManager,
    			CaffeineCache cache) {
    		DefaultCacheStatistics statistics = new DefaultCacheStatistics();
    		statistics.setSize(cache.getNativeCache().estimatedSize());
    		CacheStats caffeineStatistics = cache.getNativeCache().stats();
    		if (caffeineStatistics.requestCount() > 0) {
    			statistics.setHitRatio(caffeineStatistics.hitRate());
    			statistics.setMissRatio(caffeineStatistics.missRate());
    		}
    		return statistics;
    	}
    
    }