package
com.vcredit.vmp.checkcenter.config;
import
com.github.benmanes.caffeine.cache.Cache;
import
com.github.benmanes.caffeine.cache.Caffeine;
import
com.vcredit.vmp.checkcenter.common.properties.CaffeineCacheProperties;
import
org.springframework.beans.factory.annotation.Autowired;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
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
org.springframework.context.annotation.Primary;
import
java.time.Duration;
import
java.util.*;
/**
* 缓存配置
* @author kancy
*/
@Configuration
@EnableCaching
public
class
CachingConfig {
@Autowired
CaffeineCacheProperties caffeineCacheProperties;
/**
* 创建基于Caffeine的Cache Manager
* @return
*/
@Bean
@Primary
@ConditionalOnProperty
(prefix =
"system.cache.caffeine"
, name =
"enabled"
, havingValue =
"true"
)
public
CacheManager caffeineCacheManager() {
SimpleCacheManager cacheManager =
new
SimpleCacheManager();
Map<String, CaffeineCache> cacheMap =
new
HashMap();
List<String> globalCacheNames = caffeineCacheProperties.getCacheName();
if
(globalCacheNames !=
null
&& !globalCacheNames.isEmpty()){
addCacheObject(cacheMap, globalCacheNames, caffeineCacheProperties.getExpireAfterWrite(),
caffeineCacheProperties.getExpireAfterAccess(), caffeineCacheProperties.getMaximumSize());
}
List<CaffeineCacheProperties.Config> configs = caffeineCacheProperties.getConfigs();
if
(configs !=
null
&& !configs.isEmpty()){
for
(CaffeineCacheProperties.Config config : configs) {
List<String> cacheNames = config.getCacheName();
if
(cacheNames ==
null
|| cacheNames.isEmpty()){
continue
;
}
Duration expireAfterWrite = Optional.ofNullable(config.getExpireAfterWrite()).orElse(caffeineCacheProperties.getExpireAfterWrite());
Duration expireAfterAccess = Optional.ofNullable(config.getExpireAfterAccess()).orElse(caffeineCacheProperties.getExpireAfterAccess());
Long maximumSize = Optional.ofNullable(config.getMaximumSize()).orElse(caffeineCacheProperties.getMaximumSize());
addCacheObject(cacheMap, cacheNames, expireAfterWrite, expireAfterAccess, maximumSize);
}
}
cacheManager.setCaches(cacheMap.values());
return
cacheManager;
}
private
void
addCacheObject(Map<String, CaffeineCache> cacheMap, List<String> cacheNames, Duration expireAfterWrite, Duration expireAfterAccess, Long maximumSize) {
for
(String cacheName : cacheNames) {
Caffeine<Object, Object> recordStats = Caffeine.newBuilder().recordStats().maximumSize(maximumSize);
if
(expireAfterAccess !=
null
) recordStats.expireAfterAccess(expireAfterAccess);
if
(expireAfterWrite !=
null
) recordStats.expireAfterWrite(expireAfterWrite);
Cache<Object, Object> cache = recordStats.build();
CaffeineCache caffeineCache =
new
CaffeineCache(cacheName,cache);
cacheMap.put(cacheName, caffeineCache);
}
}
}