从redis中获取各个属性值拼装成对象列表的优化
我的目标是根据名称,从Redis缓存中获取一些值,并将它们封装到KnowBaseArgDto对象中,然后将这些对象添加到一个列表中返回给前端。
这是直来直去,通俗易懂,优化之前的代码:
List<KnowBaseArgDto> list = new ArrayList<>();
AppKnowledgeRequestBody requestBody = new AppKnowledgeRequestBody();
String key_prefix = CacheConsts.REDIS_CACHE_PREFIX + CacheConsts.APP_USERTOKEN_KNOW_KEY_PREFIX;
String[] baseNameArray = (null != baseNames && baseNames.length() > 0) ? baseNames.split(",") : null;
if(baseNameArray == null) {return list;}
for(String baseName : baseNameArray) {
String temperature = redisTemplate.opsForValue().get(key_prefix + baseName + ":USED:temperature");
String top_k = redisTemplate.opsForValue().get(key_prefix + baseName + ":USED:top_k");
String score_threshold = redisTemplate.opsForValue().get(key_prefix + baseName + ":USED:score_threshold");
KnowBaseArgDto baseArgDto = new KnowBaseArgDto();
baseArgDto.setBaseName(baseName);
baseArgDto.setTemperature(temperature==null?Float.toString(requestBody.getTemperature()):temperature);
baseArgDto.setTop_k(top_k==null?requestBody.getTop_k().toString():top_k);
baseArgDto.setScore_threshold(score_threshold==null?Float.toString(requestBody.getScore_threshold()):score_threshold);
list.add(baseArgDto);
}
return list;
针对代码可以进行如下方式的优化:
- 减少Redis调用:Redis的pipeline功能来一次性获取所有的键值对,而不是为每个键分别调用get,这将减少与Redis的通信次数,从而提高性能;
- 优化缓存键的组装:可以考虑使用一个循环来组装和获取所有的值,而不是为每个属性写单独的代码;
优化后的代码:
List<KnowBaseArgDto> list = new ArrayList<>();
AppKnowledgeRequestBody requestBody = new AppKnowledgeRequestBody();
String key_prefix = CacheConsts.REDIS_CACHE_PREFIX + CacheConsts.APP_USERTOKEN_KNOW_KEY_PREFIX;
String[] baseNameArray = (null != baseNames && baseNames.length() > 0) ? baseNames.split(",") : null;
if (baseNameArray == null) {
return list;
}
// 准备要获取的Redis键列表
List<String> keys = new ArrayList<>();
for (String baseName : baseNameArray) {
keys.add(key_prefix + baseName + ":USED:temperature");
keys.add(key_prefix + baseName + ":USED:top_k");
keys.add(key_prefix + baseName + ":USED:score_threshold");
}
// 使用pipeline一次性获取所有的值
List<String> values = redisTemplate.opsForValue().multiGet(keys);
for (int i = 0; i < baseNameArray.length; i++) {
String baseName = baseNameArray[i];
KnowBaseArgDto baseArgDto = new KnowBaseArgDto();
baseArgDto.setBaseName(baseName);
int index = i * 3; // 因为我们每次添加了三个键
baseArgDto.setTemperature(values.get(index) == null ? Float.toString(requestBody.getTemperature()) : values.get(index));
baseArgDto.setTop_k(values.get(index + 1) == null ? requestBody.getTop_k().toString() : values.get(index + 1));
baseArgDto.setScore_threshold(values.get(index + 2) == null ? Float.toString(requestBody.getScore_threshold()) : values.get(index + 2));
list.add(baseArgDto);
}
return list;
}
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
二维码