从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;
    }

你可能感兴趣的:(java,redis,数据库,缓存,java)