在项目组做的一次性能优化的任务
程序员文章站
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加载对象时造成内存溢出