之前做的都是传统行业的项目,对性能要求极低,所以对项目的运行速度也不是很关注。但是最近为优速物流做了一个“优速智能客服”项目,由于数据量较大、并发量较大,所以对项目性能产生了极大的考验。现将整个项目关于性能部分的优化经验做个简单的记录:
背景:
1、优速项目全国几万个网点,大约都集中在早上8-10点登录,进行问题件处理
2、优速客服部门(主要为呼叫中心)对项目的响应时间要求极高,分秒必争
3、优速项目大约每天会产生30w的问题件,一个月大约1000W,数据保留三个月大约3000W数据量
浅显的经验:
1、工单编码冲突问题:每条工单对应一个编码,我们将编码放在redis缓存中,每次用的时候取出来,然后在此基础上加1作为新的编码使用,并将新的编码存在缓存中做记录以便下次使用,并发量小的时候,这种方案还可以,当并发量增大时,就会出现编码冲突的问题,但是加同步锁又会影响性能,所以最终确定的解决方案是,利用redis原生的自增方法incr,每次incr后,编码由redis自动加1;(切记:jedis使用后一定要关闭,否则连接数使用完之后,会导致系统瘫痪)代码如下:
2、HttpClient接口调用不稳定问题:项目中第三方接口我们是使用Httpclient调用的,结果上线后发现接口请求会越来越慢,有时候会直接出现数据加载不出来的现象,导致部分功能无法正常使用,最开始怀疑是第三方接口响应问题,后来日志验证发现不是第三方接口问题,而是随意请求次数的增加,每次调用响应时间都会变长,最终查资料发现:httpclient为线程安全的,所以再高并发使用时会出现等待问题,当某次请求出现超时或者响应较长时,就会导致后面等待的也会响应增长,从而导致接口响应时长增加,我们最终通过增加HttpClient链接池的方式解决了这个问题,链接池部分代码如下:
HttpClient源码地址:https://pan.baidu.com/s/1sc5DqiGMg_oRmVBhLKFaoA
3、数据库操作相关的经验总结:
1、业务代码与数据库交互时,坚决不做多余的数据库操作
2、数据库常用的查询字段要建索引、尽量索引字段排序、尽量组合索引
3、关联表关联字段编码相同索引才会生效
4、like函数左侧不可加%否则索引会失效
5、多表大数据量组合查询可以使用子查询尽可能多的使索引生效
6、一张表索引不能太多
7、一张表字段不能太多
4、代码规范问题:
1、空指针判断,不对空指针判断,对于业务流程来说是毁灭性的,得不偿失,必须要做
2、Exception错误日志的打印方式:logger.error(“错误”,e);代替e. printStackTrace();
3、类属性字段尽量使用序列化属性,像List用ArrayList代替、Map用HashMap代替
4、不要在非静态方法中给静态属性赋值
5、扫描规范一定要在项目开始的时候定好,不然后面改很麻烦