本文主要是介绍从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;}
这篇关于从redis中获取各个属性值拼装成对象列表的优化的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!