这是我们之前的得到的压测表
1.优化首页一级菜单渲染,默认我们的生产环境themleaf的缓存时开启的,由于我们要进行优化,我们将其开启测试下。
相比于之前没看没开缓存,吞吐量420->465,90%请求响应时间338->323,99%请求响应时间604->535,性能还是有提升的。
2.继续优化首页一级菜单渲染,我们刚刚只优化了themleaf,我们可以关日志,还有数据库可以优化,
QueryWrapper<CategoryEntity> parent_cid = new QueryWrapper<CategoryEntity>().eq("parent_cid", 0);
这是我们查询一级菜单的代码,用的parent_cid进行匹配的,所以我们可以建立parent_cid索引。
在进行测试下
相比于之前的开缓存,吞吐量465->1221,90%请求响应时间323->118,99%响应时间535->201,性能还是有很大提升的。
3.优化三级分类数据获取,建立索引后在测试一下。
相比于之前没有建立索引,吞吐量从5.7->14.7,90%响应时间17285->6588,99%响应时间17372->6806.还是有一倍多的提升的。
伊甸园区和老年代总是满,不停的在进行Y gc和full gc,所以我们要适当的调大我们的堆空间。
这是我们最终的压测数据!
4.首页全量数据获取,优化(nginx动静分离)
聚合
这里吞吐量不大反而小了,是因为我们之前测试全量数据获取的时候是直接访问的localhost,没有过nginx和网关,
所以这里加上加上nginx和网关后,性能是有所下降的。
但是堆不断的进行垃圾回收,老年代要满的时候,大GC基本上1s一次,小gc1秒3次左右而且每次老年代gc的时候还gc不掉多大空间,到最后就出现了oom异常,除了内存崩溃宕机的情况了。所以我们调整堆。
-Xmx1024m -Xms1024m -Xmn512m
吞吐量基本上不变,但是不会出现内存崩溃的情况了。
并且响应时间也随之提高了,因为堆大了,gc次数少了,stw时间少了,响应时间也就变短了。
5.优化三级分类获取
我们以前获取三级分类的时候是循环查表,查出所有的一级分类,然后再去查每一个一级分类的二级分类,然后再去查每一个二级分类的三级分类。
所以我们这次优化业务逻辑代码,先查出所有的分类,然后根据parent_id去匹配。
/**
* all 所有分类
* parent_id 父id
* @param allCategory
* @param parent_id
* @return
*/
public List<CategoryEntity> getCatalogEntityByParentId(List<CategoryEntity> allCategory,Long parent_id){
List<CategoryEntity> collect = allCategory.stream().filter(item -> {
return item.getParentCid() == parent_id;
}).collect(Collectors.toList());
return collect;
}
//这个函数的意思就是在所有的分类中筛选中parent_id等于传过来的参数的 这样就避免了循环查表。
压测一下!
加索引后吞吐量从5.7->14.7,没有太大的提升,但是我们优化了业务逻辑后,直接干到了164,90%响应时间695,99%响应时间872.
所以在开发中一定要避免循环查表!!!
最后的压测单
肉眼可见,在三级分类数据获取业务中,避免了循环查表,无论是吞吐量还是业务逻辑都有很大的提升!!
所以!
所以在开发中一定要避免循环查表!!!
6.使用redis进行优化
@Override
public Map<String, List<Catelog2Vo>> getCatalogJson() {
//先去缓存中查
String catalogJSON = cache.opsForValue().get("catalogJSON");
//没有的话从缓存中查 并且放入到缓存中
if(StringUtils.isEmpty(catalogJSON)){
Map<String, List<Catelog2Vo>> catalogJsonFromDB = getCatalogJsonFromDB();
String jsonString = JSON.toJSONString(catalogJsonFromDB);
//放入到缓存汇总
cache.opsForValue().set("catalogJSON",jsonString);
return catalogJsonFromDB;
}
//有的话查出来反序列化然后返回
Map<String, List<Catelog2Vo>> result = JSON.
parseObject(catalogJSON, new TypeReference<Map<String, List<Catelog2Vo>>>() {
});
return result;
}
压测数据
吞吐量直接从164->843,90%响应时间695->139,99%响应时间872->167,性能整整提升了5倍多。
但是,如果你的lettuce版本是5.1.8以及一下的话,会报堆外异常。
具体看这个链接https://blog.csdn.net/prefect_start/article/details/115093854