介绍
在微服务项目中,有许多很少变化或者几乎不变化的数据,那我们就可以使用google的guava本地缓存来缓存这些数据,这样就不需要每次都去数据库查询了。提高用户的访问速度。
引入依赖
ts
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>19.0</version>
</dependency>
使用
1.创建本地缓存对象localCache
ts
private Cache<String,String> localCache =
CacheBuilder.newBuilder()
.maximumSize(5000)
.expireAfterWrite(10, TimeUnit.SECONDS)
.build();
2.查询并缓存信息
ts
@SneakyThrows
@Override
public List<SubjectCategoryBO> queryCategoryAndLabel(SubjectCategoryBO subjectCategoryBO) {
String cacheKey = "categoryAndLabel."+subjectCategoryBO.getId();
//获取已缓存的结果数据content
String content = localCache.getIfPresent(cacheKey);
List<SubjectCategoryBO> subjectCategoryBOS = new LinkedList<>();
if (StringUtils.isBlank(content)) {
subjectCategoryBOS = getSubjectCategoryBOS(subjectCategoryBO.getId());
localCache.put(cacheKey,JSON.toJSONString(subjectCategoryBOS));
} else {
subjectCategoryBOS = JSON.parseArray(content,SubjectCategoryBO.class);
}
return subjectCategoryBOS;
}
优化
抽取缓存工具类,泛型实现本地缓存
ts
/**
* 缓存工具类
*/
@Component
public class CacheUtil<V> {
private Cache<String,String> localCache =
CacheBuilder.newBuilder()
.maximumSize(5000)
.expireAfterWrite(10, TimeUnit.SECONDS)
.build();
public List<V> getResult(String cachekey, Class<V> clazz,
Function<String,List<V>> function){
List<V> resultList = new ArrayList<>();
String content = localCache.getIfPresent(cachekey);
if (StringUtils.isNotBlank(content)) {
resultList = JSON.parseArray(content, clazz);
}else{
resultList = function.apply(cachekey);
if(!CollectionUtils.isEmpty(resultList)){
localCache.put(cachekey,JSON.toJSONString(resultList));
}
}
return resultList;
}
}
缓存工具类的使用:
ts
@SneakyThrows
@Override
public List<SubjectCategoryBO> queryCategoryAndLabel(SubjectCategoryBO subjectCategoryBO) {
String cacheKey = "categoryAndLabel."+subjectCategoryBO.getId();
List<SubjectCategoryBO> SubjectCategoryBOS = cacheUtil.getResult(cacheKey,
SubjectCategoryBO.class,
(result) -> getSubjectCategoryBOS(subjectCategoryBO.getId()));
return SubjectCategoryBOS;
}