día96-prueba de esfuerzo de rendimiento-optimización-optimización de adquisición de datos de clasificación de tres niveles (reducir el número de interacciones con la base de datos)

A veces, a través de un diseño de código comercial razonable para evitar interacciones frecuentes con la base de datos, el rendimiento también se puede mejorar en gran medida

Aquí está la tabla de nuestra prueba de rendimiento anterior, puede ver un lote de rendimiento lento obtenido por datos de clasificación de tres niveles

Este es el código anterior. Si observa de cerca, puede ver que cada vez que obtenga la subcategoría, la obtendrá de la base de datos y continuará interactuando con la base de datos. Cuanto mayor sea la cantidad de datos en la categoría principal, cuanto mayor sea el número de interacciones. Ahora, obviamente, no es razonable. 

    @Override
    public Map<String, List<Catelog2Vo>> getCatalogJson() {

        List<CategoryEntity> category1EntityList = findCatelog1s();

        Map<String, List<Catelog2Vo>> catelog2Vos = category1EntityList.stream().collect(Collectors.toMap(k -> k.getCatId().toString(), v -> {
            //1.查到一级分类的所有二级分类
            List<CategoryEntity> category2EntityList = this.list(new QueryWrapper<CategoryEntity>().eq("parent_cid", v.getCatId()));

            //2.获取二级分类vo集合
            List<Catelog2Vo> catelog2VoList = category2EntityList.stream().map(catelog2 -> {

                List<CategoryEntity> category3EntityList = this.list(new QueryWrapper<CategoryEntity>().eq("parent_cid", catelog2.getCatId()));

                //3.获取三级分类vo集合
                List<Catelog2Vo.Catelog3Vo> catelog3Vos = null;
                if(category3EntityList !=null && category3EntityList.size() > 0){
                    catelog3Vos = category3EntityList.stream().map(catelog3 -> {
                        //获取三级分类vo
                        Catelog2Vo.Catelog3Vo catelog3Vo = new Catelog2Vo.Catelog3Vo(catelog3.getParentCid().toString(), catelog3.getCatId().toString(), catelog3.getName());
                        return catelog3Vo;
                    }).collect(Collectors.toList());
                }
                //2.获取二级分类vo
                Catelog2Vo catelog2Vo = new Catelog2Vo(v.getCatId().toString(), catelog3Vos, catelog2.getCatId().toString(), catelog2.getName());

                return catelog2Vo;
            }).collect(Collectors.toList());
            return catelog2VoList;
        }));

        return catelog2Vos;
    }

Las manos en

Idea: Primero consulte todos los datos clasificados a la vez y luego obtenga las subcategorías correspondientes cada vez. El código después de la transformación es el siguiente

    @Override
    public Map<String, List<Catelog2Vo>> getCatalogJson() {

        List<CategoryEntity> categoryEntities = this.list(null);

        List<CategoryEntity> category1EntityList = getParent_cid(categoryEntities,0l);

        Map<String, List<Catelog2Vo>> catelog2Vos = category1EntityList.stream().collect(Collectors.toMap(k -> k.getCatId().toString(), v -> {
            //1.查到一级分类的所有二级分类
            List<CategoryEntity> category2EntityList = getParent_cid(categoryEntities,v.getCatId());

            //2.获取二级分类vo集合
            List<Catelog2Vo> catelog2VoList = category2EntityList.stream().map(catelog2 -> {

                List<CategoryEntity> category3EntityList = getParent_cid(categoryEntities,catelog2.getCatId());

                //3.获取三级分类vo集合
                List<Catelog2Vo.Catelog3Vo> catelog3Vos = null;
                if(category3EntityList !=null && category3EntityList.size() > 0){
                    catelog3Vos = category3EntityList.stream().map(catelog3 -> {
                        //获取三级分类vo
                        Catelog2Vo.Catelog3Vo catelog3Vo = new Catelog2Vo.Catelog3Vo(catelog3.getParentCid().toString(), catelog3.getCatId().toString(), catelog3.getName());
                        return catelog3Vo;
                    }).collect(Collectors.toList());
                }
                //2.获取二级分类vo
                Catelog2Vo catelog2Vo = new Catelog2Vo(v.getCatId().toString(), catelog3Vos, catelog2.getCatId().toString(), catelog2.getName());

                return catelog2Vo;
            }).collect(Collectors.toList());
            return catelog2VoList;
        }));

        return catelog2Vos;
    }

    private List<CategoryEntity> getParent_cid( List<CategoryEntity> categoryEntities,Long parent_cid) {

        List<CategoryEntity> collect = categoryEntities.stream().filter(categoryEntity -> categoryEntity.getParentCid() == parent_cid).collect(Collectors.toList());
        return collect;
    }

 

Prueba de presión de nuevo

 

Consulte el informe de agregación y descubra que el rendimiento es decenas de veces mayor que antes, aunque todavía no es demasiado alto. 

Rellenar el formulario

 Si aún necesita optimizar, debe ir al siguiente artículo, use la caché para continuar optimizando

Supongo que te gusta

Origin blog.csdn.net/JavaCoder_juejue/article/details/113622581
Recomendado
Clasificación