Skip to content

介绍

在微服务项目中,有许多很少变化或者几乎不变化的数据,那我们就可以使用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;
    }

上次更新于: