使用Caffeine做JVM缓存,提升字典类查询性能

业务场景

对于字典值,一般只存code,名称则查询时去查字典,返回给前端展示。那么就会存在jvm中多次调用字典查询的问题,为了提高性能,对字典进行jvm缓存。
示例代码

  1. Caffeine创建缓存,有效期为5分钟,这个视业务情况而定,看实时性要求。每次查询,可保存5分钟
  2. 编写查询接口,此处会实际调接口,对应接口还可做一层redis缓存,避免直接打到数据库
  3. 实用方法convertDict,通过loadingCache.get查询本地缓存,无数据,则调接口
java 复制代码
@Slf4j
public class DictUtil {
    private static final LoadingCache<String, Map<String, String>> loadingCache = Caffeine.newBuilder().expireAfterWrite(Duration.ofMinutes(5)).build(DictUtil::queryDictAll);
    /**
     * 查询字典  缓存本地  避免多次查询
     */
    private static Map<String, String> queryDictAll(String key) {
        FeignUtils feignUtil = SpringUtil.getBean("feignUtils", FeignUtils.class);
        Map<String, String> allDict = feignUtil.getDictCodeValueMapName(null, key);
        if (CollectionUtil.isNotEmpty(allDict)) {
            return allDict;
        }
        return Collections.emptyMap();
    }
    /**
     * @description: 通过 字典编码和值 获取字典值  比如 caliber 25 得到 DN25
     * @param: [dicType, dictCode]  dicType 推荐使用 DictConstants
     * @return: java.lang.String
     **/
    public static String convertDict(String dicType, String dictCode) {
        if (StringUtils.isBlank(dictCode) || StringUtils.isBlank(dicType)) {
            return null;
        }
        Map<String, String> dictMap = loadingCache.get(dicType);
        if (Objects.isNull(dictMap) || dictMap.size() == 0) {
            return null;
        }
        return dictMap.get(dictCode);
    }
}

效果

避免了频繁调接口查询字典

相关推荐
rannn_1112 小时前
JVM 面试题:类加载过程详解(附高频考点)
java·jvm·后端
Shaoshing12 小时前
ThreadLocal
java·jvm·threadlocal
写后端的胖头鱼12 小时前
一文详解CAS
java·jvm·spring·cas·乐观锁·自旋
估值探索者14 小时前
【Python量化系统工程实战 #08】从脚本到生产:量化系统上线 checklist 的最小闭环
java·开发语言·jvm·python·数据挖掘·数据·股票数据api接口
Chase_______15 小时前
【杂项知识点】一文搞懂 JVM、JRE 与 JDK:从概念混淆到生产部署
java·开发语言·jvm
用户0942485680317 小时前
第28章:JDK容器感知、cgroup与云原生JVM参数治理
java·jvm
anew___18 小时前
《从零手写操作系统 (30):环境变量与进程上下文——export/unset与继承语义》
java·开发语言·网络·jvm·算法
拾贰_C18 小时前
【English | conversation 】call | 抖音AI短句情景:打电话---come over
数据库·redis·缓存
Mikko720 小时前
JVM 线上排查实战(六):JFR 怎么用?JDK 8 要不要加 UnlockCommercialFeatures、jfr 命令在哪、录的文件为什么读不了
java·运维·jvm·后端
ShineWinsu21 小时前
对于Redis:缓存的解析
java·redis·缓存·缓存穿透·缓存击穿·缓存雪崩·缓存预热