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
但是如何为cache1,cache2设置不同的策略,并且查看命中率呢?
自定义策略需要两部分内容:
-
自定义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;
}
}