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