在日常开发中要去数据库查询某些数据,而这些数据平时不会轻易改变。
如果一直查询数据库,会增加很多的IO操作,尤其是并发量高时显然会拖慢接口的响应。
那么,可以考虑将查询到的数据加载到本地。
但是在数据库数据发生变化时,又需要实时刷新数据库数据。那么就需要支持实时刷新数据库。
所以,结合以上需求,可以使用Guava来实现本地缓存,并且支持切换开关。在需要实时获取数据时,就可以将直接切到数据库查询。
实现 引用的依赖实现的代码com.google.guava guava 18.0
@Component
@Slf4j
public class ThirdSmsTemplateComponent {
private static final String prefix="third_t_";
@Value("${thirdSmsTemplate.hotKey.timeout:20}")
private int hotKeyTimeOut;
@Value("${thirdSmsTemplate.hotKey.maxNum:1000}")
private int hotKeyMaxNum;
@Value("${thirdSmsTemplate.hotKey.useLocalCache:true}")
private boolean useLocalCache;
public static Cache localCache;
@Resource
private IMdmThirdSmsTemplateService mdmThirdSmsTemplateService;
@PostConstruct
public void init(){
localCache = CacheBuilder.newBuilder().maximumSize(hotKeyMaxNum) // 设置缓存的最大容量
.expireAfterWrite(hotKeyTimeOut, TimeUnit.MINUTES) // 设置缓存在写入xx分钟后失效
.concurrencyLevel(Runtime.getRuntime().availableProcessors()) // 设置并发级别为cpu核心数
.recordStats() // 开启缓存统计
.build();
}
public TMdmThirdSmsTemplate getThirdSmsTemplate(String templateCode){
if (StringUtils.isBlank(templateCode)){
log.warn("getThirdSmsTemplate_warn_isBlank:{}",templateCode);
return null;
}
if (useLocalCache){
try {
return localCache.get(prefix + templateCode,()->mdmThirdSmsTemplateService.getThirdSmsTemplate(templateCode));
} catch (CacheLoader.InvalidCacheLoadException | ExecutionException e) {
return null;
}
}else {
return mdmThirdSmsTemplateService.getThirdSmsTemplate(templateCode);
}
}
}



