欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

在项目组做的一次性能优化的任务

程序员文章站 2022-04-28 12:43:03
...

中国XX项目关于性能优化的需求
1.需求原因:
服务器在香港,导致SQL在每次查询时,相对较慢,平均2-3s,最高10s
2.解决方案:
2-1)在系统启动时,@init进行查询(全表),并加载至redis缓存中
2-2)修改原有的查询接口service层,改成查询缓存中数据,并将条件在List遍历中进行筛选.

3.遇到的难点及收获:
3-1)其中在查询过程中,碰到了几百万数据的大表.
3-1-1)尝试的解决方法:
将几百万数据分批送入redis缓存中:
1.消耗的数据io次数过多,最优分配方式:为数据量开根号
例如100w的数据,拆成1000次,每次1000条,查询一次(1-10s)

若以prdcode为维度则会是查300次,每次几万条数据 --查询频次低,单次查询消耗时间(20-30s一次查询)

    以prdcode,insyear为两个维度,则是查30000次,每次几百条 --查询次数快(0.2-1s一次),频次过高

3-2)收获:
了解到查询全表再插入redis数据库,这个实现方式的性能瓶颈应该是50-100w左右的数据,之前有张表是1w左右的数据,耗时10-20s的查询,并插入缓存,没有产生内存溢出
50w可以拆分成7次7w数据量的查询,每次消耗40-50s的时间,系统在启动起来的时候这部分就要消耗7-8分钟,我们系统容忍的最慢启动时间是10分钟,并且不会造成内存溢出
50w已经是理论峰值,一般启动加载的缓存,建议不超过20w,不然则会影响启动性能,或者在项目list加载对象时造成内存溢出