业务场景
对于字典值,一般只存code,名称则查询时去查字典,返回给前端展示。那么就会存在jvm中多次调用字典查询的问题,为了提高性能,对字典进行jvm缓存。
示例代码
- Caffeine创建缓存,有效期为5分钟,这个视业务情况而定,看实时性要求。每次查询,可保存5分钟
- 编写查询接口,此处会实际调接口,对应接口还可做一层redis缓存,避免直接打到数据库
- 实用方法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);
}
}
效果
避免了频繁调接口查询字典