本地缓存-google guava

http://ifeve.com/google-guava-cachesexplained/

import com.alibaba.fastjson.JSON;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cglib.beans.BeanCopier;
import org.springframework.util.DigestUtils;

import java.util.List;
import java.util.concurrent.ConcurrentHashMap;


public class ConvertBeanUtil {
    private static final Logger logger = LoggerFactory.getLogger(ConvertBeanUtil.class);
    private static ConcurrentHashMap<String, BeanCopier> cache = new ConcurrentHashMap<String, BeanCopier>();


    /**
     * 使用json转换对象效率低。但是可以兼容不通数据类型 无实际需求不建议使用
     * @param object
     * @param entityClass
     * @param <T>
     * @return
     */
    public static <T> T convertBeanByJson(Object object, Class<T> entityClass) {
        if (null == object) {
            return null;
        }
        return JSON.parseObject(JSON.toJSONString(object), entityClass);
    }

    /**
     * 使用json转换对象效率低。但是可以兼容不通数据类型 无实际需求不建议使用
     * @param sourceObjs
     * @param entityClass
     * @param <T>
     * @return
     */
    public static <T> List<T> convertBeanListByJson(List<?> sourceObjs, Class<T> entityClass) {
        if (null == sourceObjs) {
            return null;
        }
        return JSON.parseArray(JSON.toJSONString(sourceObjs), entityClass);
    }


    /**
     * @param source       源对象class
     * @param target       目标对对象class
     * @param sourceObj    复制的源对象
     * @param useConverter
     * @return
     * @throws Exception
     */
    public static <T> T copyBeanProperties(@SuppressWarnings("rawtypes") Class source, Class<T> target,
                                           Object sourceObj, boolean useConverter) {
        if (sourceObj == null) return null;
        T t;
        try {
            t = target.newInstance();
        } catch (Exception e) {
            logger.error("", e);
            return null;
        }
        String key = source.getSimpleName() + target.getSimpleName();
        BeanCopier copier = cache.get(key);
        if (copier == null) {
            copier = createBeanCopier(source, target, useConverter, key);
        }
        copier.copy(sourceObj, t, null);
        return t;
    }

    /**
     * @param sourceObj 源对象
     * @param target    目标对象
     * @return
     * @throws Exception
     */
    public static <T> T copyBeanProperties(Object sourceObj, T target) {
        return copyBeanProperties(sourceObj, target, false);
    }

    /**
     * @param sourceObj    源对象
     * @param target       目标对象
     * @param useConverter
     * @return
     * @throws Exception
     */
    public static <T> T copyBeanProperties(Object sourceObj, T target, boolean useConverter) {
        if (sourceObj == null || target == null) return null;
        String key = sourceObj.getClass().getSimpleName() + target.getClass().getSimpleName();
        BeanCopier copier = cache.get(key);
        if (copier == null) {
            copier = createBeanCopier(sourceObj.getClass(), target.getClass(), useConverter, key);
        }
        copier.copy(sourceObj, target, null);
        return target;
    }

    public static <T> List<T> copyListBeanPropertiesToList(List<?> sourceObjs, List<T> targets, Class<T> targetType) {
        if (sourceObjs == null || targets == null || targetType == null) return null;
        T t;
        for (Object o : sourceObjs) {
            try {
                t = targetType.newInstance();
                targets.add(copyBeanProperties(o, t, false));
            } catch (InstantiationException e) {
                logger.error("", e);
            } catch (IllegalAccessException e) {
                logger.error("", e);
            }
        }
        return targets;
    }

    @SuppressWarnings("unused")
    private static String getHashKey(String str) {
        if (str == null) return null;
        return DigestUtils.md5DigestAsHex(str.getBytes());
    }

    @SuppressWarnings({"rawtypes"})
    private static BeanCopier createBeanCopier(Class sourceClass, Class targetClass, boolean useConverter,
                                               String cacheKey) {
        BeanCopier copier = BeanCopier.create(sourceClass, targetClass, useConverter);
        cache.putIfAbsent(cacheKey, copier);
        return copier;
    }
}

 

 

public class FileTypeService {

    private final String CORE_FILE_TYPE = "core_file_type";

    @Autowired
    private CreditAdapter creditAdapter;


    /**
     * @desc  本地配置缓存
     * @author zoufan
     * @date 2020/7/22
    */
    private LoadingCache<String, List<CreditFileTypesQueryRespDto>> configListCache = CacheBuilder.newBuilder()
            .expireAfterWrite(1, TimeUnit.DAYS)
            .build(new CacheLoader<String, List<CreditFileTypesQueryRespDto>>() {
                @Override
                public List<CreditFileTypesQueryRespDto> load(String key) throws Exception {
                    List list = new ArrayList();
                    if (CORE_FILE_TYPE.equals(key)) {
                        list = creditAdapter.creditFileTypesQuery("ALL");
                    }
                    List<CreditFileTypesQueryRespDto> list2 = new ArrayList<>();
                    if(Objects.nonNull(list)&& list.size()>0){
                        ConvertBeanUtil.copyListBeanPropertiesToList(list, list2, CreditFileTypesQueryRespDto.class);
                    }
                    return list2;
                }
            });

    /**
     * @desc  获取单条缓存信息
     * @author zoufan
     * @date 2020/7/22
     * @param source
     * @return cn.com.cxjk.service.api.cxph.common.entity.LoanDataSetEntity
    */
    public List<CreditFileTypesQueryRespDto> queryListBySource(String source){
        log.info("FileTypeService.queryListBySource,source: ", source);
        try {
            List<CreditFileTypesQueryRespDto> list = configListCache.get(CORE_FILE_TYPE).stream().filter(CreditFileTypesQueryRespDto -> CreditFileTypesQueryRespDto.getSource().contains(source)).collect(Collectors.toList());
            return list;
        } catch (ExecutionException e) {
            log.error("FileTypeService.queryListBySource, error:{}", e);
            throw new RuntimeException(e);
        }
    }


    /**
     * 清空缓存
     */
    public void refreshFileTypeCache() {
        // 刷新今日缓存
        configListCache.refresh(CORE_FILE_TYPE);
    }


}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Guava本地缓存是Google Guava提供的一个缓存框架,它可以帮助我们在应用程序中高效地缓存数据。使用Guava本地缓存需要以下步骤: 1. 导入Guava依赖 在项目中导入Guava依赖,可以通过Maven或Gradle等方式进行导入。 2. 创建缓存对象 使用CacheBuilder来创建一个缓存对象,可以设置缓存的大小、过期时间等参数,例如: ``` Cache<String, Object> cache = CacheBuilder.newBuilder() .maximumSize(100) .expireAfterAccess(10, TimeUnit.MINUTES) .build(); ``` 3. 将数据放入缓存 使用put方法将数据放入缓存中,例如: ``` cache.put("key1", "value1"); cache.put("key2", "value2"); ``` 4. 从缓存中获取数据 使用get方法从缓存中获取数据,例如: ``` Object value1 = cache.getIfPresent("key1"); Object value2 = cache.getIfPresent("key2"); ``` 5. 删除缓存中的数据 使用invalidate方法从缓存中删除数据,例如: ``` cache.invalidate("key1"); ``` 以上就是使用Guava本地缓存的基本步骤。需要注意的是,Guava本地缓存是线程安全的,可以在多线程环境中使用。同时,Guava本地缓存也提供了一些高级特性,例如缓存的回收策略、缓存的加载方式等,可以根据实际需求进行设置。 ### 回答2: Guava本地缓存是一种Google提供的使用简单且高效的缓存实现方式。下面是使用Guava本地缓存的步骤: 1. 首先,我们需要添加Guava库的依赖,确保项目中有Guava的jar包。 2. 创建一个缓存对象,可以使用CacheBuilder类的静态方法来创建一个新的缓存实例。例如: ```java Cache<String, String> cache = CacheBuilder.newBuilder() .maximumSize(100) .expireAfterWrite(10, TimeUnit.MINUTES) .build(); ``` 上述代码创建了一个最大容量为100的缓存实例,并且设置了写入10分钟后过期。 3. 往缓存中存储数据,可以使用put方法将键值对存储到缓存中。例如: ```java cache.put("key1", "value1"); cache.put("key2", "value2"); ``` 上述代码将键值对(key1, value1)和(key2, value2)存储到缓存中。 4. 从缓存中获取数据,可以使用get方法根据键来获取对应的值。例如: ```java String value1 = cache.get("key1", () -> "default value"); ``` 上述代码尝试从缓存中获取键为key1的值,如果缓存中存在该键,则返回对应的值;如果缓存中不存在该键,则通过提供的回调函数生成一个默认值,并将该值存储到缓存中,然后返回该默认值。 5. 判断缓存中是否存在某个键,可以使用方法约束containsKey。例如: ```java boolean contains = cache.containsKey("key1"); ``` 上述代码判断缓存中是否存在键为key1的键值对。 6. 清空缓存中的所有数据,可以使用方法invalidateAll。例如: ```java cache.invalidateAll(); ``` 上述代码清空缓存中的所有键值对。 7. 在使用完缓存后,为了释放资源,可以使用方法invalidate来显式地使缓存无效,并且不会对缓存中的数据造成影响。例如: ```java cache.invalidate("key1"); ``` 上述代码使键为key1的键值对无效,但不会删除缓存中的其他数据。 通过以上步骤,我们可以灵活使用Guava本地缓存来提升程序的性能和效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值