背景:项目要求单接口TPS为1w,为了达到这个目标,需要尽量减少请求的响应时间。

1. 合理利用缓存

如果处理每次请求,都需要和数据库进行交互,那么必然会很耗时:

耗时主要发生在:

  1. 与数据库建立连接;
  2. 数据库查询数据;
  3. 数据的网络传输。

而实际上,很多数据都是偏向于读,而非写。即,每次都去数据库拉取数据的操作,实际上是不必须的。我们要做的,只是把数据缓存下来,下次用的时候,直接读取缓存就可以了,从而避免了重复与DB交互。

常用的缓存,分为公共缓存和本地缓存:

  1. 如果key分布均匀的话,可以考虑使用公共缓存,常用的是Redis;
  2. 如果key分布不均匀的话,则需要考虑使用本地缓存了,当然在设计时,要考虑机器的内存。

2. 扩容、增加机器的性能

扩容、或者增加机器的性能,是提高接口TPS最直接的方式。
比如,原本只有1台机器处理来的请求,现在把机器扩到8台,则理想情况下:

扩容前:TPS = 100
扩容后:TPS = 8 x 100

当然,这是理想情况,实际上请求需要经过ngx进行分流,中间按理是有损耗。

当然,这样非常考验ngx分发的能力,ngx也有可能会成为性能瓶颈!

3. 精简接口处理逻辑

如果,一个接口对性能的要求特别高,那么对于那些不必实时处理的逻辑,可以事前先处理好,放在缓存中,需要的时候,直接去取就可以了。

  1. 简化校验:比如参数的校验,只要非空,不校验合法(reason:业务会校验);
  2. 非必要的操作:不保留;
  3. 非实时的操作:提前处理。

4. 集合的类型与循环

  1. 集合优先选择:ArrayList
 ArrayList<Integer> l1 = new ArrayList<>();
  1. 集合的循环方式
 // 推荐for (int i = 0; i < l1.size(); i++) {}// 不推荐for (Integer integer : l1) {}
  1. 集合中元素需要移除

不建议新建一个集合,然后将合法的元素进行赋值,当然,是否也需要考虑对应的场景呢?

 Iterator<Integer> iterator1 = l1.iterator();while (iterator1.hasNext()) {Integer next = iterator1.next();// 移除条件if (next.equals(1)) {iterator1.remove();}}

5. 其他操作

5.1. 定时任务

java自带的线程池其实已经有对应的方法了

      logger.info("启动定时任务,查询正在进行的实验,每10秒执行一次,即配置信息最长十秒后生效!");Long waitTime = 10 * 1000L;int availableProcessor = Runtime.getRuntime().availableProcessors();// 任务执行完成,休眠10s重新执行对应的方法ScheduledExecutorService service = Executors.newScheduledThreadPool(availableProcessor);service.scheduleWithFixedDelay(new Runnable() {@Overridepublic void run() {process();}},0,waitTime,TimeUnit.MILLISECONDS);

反面教材:

 while (true) {try {// 要执行的业务.....// 执行完,休眠10sThread.sleep(waitTime);} catch (Exception e) {logger.error("定时任务失败", e);}}

5.2. 根据名称取对象的值

根据性能看,第三种借助反射的效率最高。

    /*** 执行:10000 x 200 耗时:10711* 根据属性,获取get方法* @param ob 对象* @param name 属性名* @return* @throws Exception*/public static Object getGetMethod(Object ob , String name)throws Exception{Method[] m = ob.getClass().getMethods();for(int i = 0;i < m.length;i++){if(("get"+name).toLowerCase().equals(m[i].getName().toLowerCase())){return m[i].invoke(ob);}}return null;}/*** 执行 10000 x 200 耗时:5015* @param ob* @param name* @return*/public static Object getGetMethod2(Object ob , String name) {try{// 获取字段Field field = ob.getClass().getDeclaredField(name);PropertyDescriptor pd = new PropertyDescriptor(field.getName(), ob.getClass());// 获取get方法Method method = pd.getReadMethod();return ReflectionUtils.invokeMethod(method, ob);} catch (Exception e){System.out.println("error");}return null;}/*** 执行 10000 x 200 耗时 38ms* @param object* @return*/public static Map<String, Object> getFieldNameAndValue(Object object) {Map<String, Object> map = new HashMap<>();Class clazz = object.getClass();ArrayList<Field> fieldList = new ArrayList<>();while (clazz != null) {fieldList.addAll(new ArrayList<>(Arrays.asList(clazz.getDeclaredFields())));clazz = clazz.getSuperclass();}Field[] fields = new Field[fieldList.size()];fieldList.toArray(fields);try {for (Field field : fields) {field.setAccessible(true);map.put(field.getName(), field.get(object));}} catch (Exception e) {e.printStackTrace();}return map;}

提升项目TPS优化手段相关推荐

  1. 性能压力测试TPS优化之路---SYN__

    SYN Cookie的原理和实现 2014年01月06日 16:56:15 zhangskd 阅读数:28214 标签: TCPIPlinux内核 更多 个人分类: TCP/IPKernel 所属专栏 ...

  2. 大数据能力提升项目| 学生成果展系列之二

    导读 为了发挥清华大学多学科优势,搭建跨学科交叉融合平台,创新跨学科交叉培养模式,培养具有大数据思维和应用创新的"π"型人才,由清华大学研究生院.清华大学大数据研究中心及相关院系共 ...

  3. 大数据能力提升项目| 学生成果展系列之一

    导读 为了发挥清华大学多学科优势,搭建跨学科交叉融合平台,创新跨学科交叉培养模式,培养具有大数据思维和应用创新的"π"型人才,由清华大学研究生院.清华大学大数据研究中心及相关院系共 ...

  4. 支持实践教学:清华大数据能力提升项目举办CIKM AnalytiCup2017冠军团队经验分享会

    2017年11月29日,清华-青岛数据科学研究院(以下简称:数据院)报告厅举办了一场赛事经验分享讲座.数据院邀请到数据派研究部成员.清华大学工程力学系博士生姚易辰和清华热能系博士生李中杰前来分享他们在 ...

  5. 《大数据实践课》开创实践教学新模式:清华大数据能力提升项目特色课程系列报道之一

    2014年4月,清华大学顺应时代潮流成为全国第一批成立大数据研究机构的高等学府.四年来,清华-青岛数据科学研究院(以下简称:数据院)与研究生院共同设计组织实施了以大数据能力提升项目为主的大数据人才培养 ...

  6. 未明学院活动:新零售热门背景提升项目上线,阿里、腾讯都看重的项目经历,你来不来?

    新零售行业前景 马云曾经在杭州云栖大会上提出未来五大新趋势:新零售.新制造.新金融.新技术与新能源,并称未来这五个新的发展将会深刻地影响到中国甚至世界上的每个人.对于新零售马云认为,纯电商时代已经过去 ...

  7. 你知道的前端优化手段

    大家好,我是漫步,今天回家了,所以更新有点晚,周一恢复正常了. 前言 性能优化是一个项目发展到一定时期之后绕不开的话题,也是每个工程师心中永远在撩拨的刺.总结一下常用的前端性能优化的方法,希望对大家有 ...

  8. APM从入门到放弃:可用性监控体系和优化手段的剖析

    在移动互联网时代,一款应用是否成功,用户体验是一个关键的因素.APM的发展使得用户体验越来越完善,本文通过90年代互联产品性能优化的发展过程到今天移动互联网时代下的APM可用性监控体系,如何去解决日渐 ...

  9. 支付系统接口性能压力测试TPS优化之路

    支付系统接口性能压力测试TPS优化之路 郭柏雅 本文案例是我们品课学院在银行系统性能测试第一个案例,由发生至解决,通过对业务逻辑的认知.测试环境的了解.测试脚本的开发.服务的监控分析优化.操作系统的监 ...

最新文章

  1. pom.xml设置mysql连接_maven工程配置pom.xml实现mybatis的访问数据库操作
  2. python读取中文txt文本-Python3 解决读取中文文件txt编码的问题
  3. Python爬虫(十三)_JSON模块与JsonPath
  4. 第17课:基于 CRF 的中文句法依存分析模型实现
  5. sourcetree mac 免登录_「vscode remote ssh 免登录」mac
  6. git merge用法_常用命令之git操作(进阶篇)
  7. 前端需要了解的http知识
  8. 基于Redis的微博计算好友关系
  9. python车牌识别库_Python+Keras+TensorFlow车牌识别
  10. Word 中文编号标题与数字编号题注
  11. sybase linux下创建备份服务器,Sybase数据库备份方案
  12. Mac中ElasticSearch安装
  13. Spread 16.0 for WinForms Crack
  14. java.lang.InstantiationException: can't instantiate class
  15. Unity导入模型和材质丢失问题处理(大批量操作)
  16. Nuvoton emWin HMI Solution
  17. 四次方程根式解+四次以上方程近似解的js实现代码(上)——复数类+复数常量+三角函数简表
  18. input type=file 标签禁止让用户手动输入
  19. win10pe系统计算机名修改,win10系统账户用户名如何修改
  20. php 神盾解密工具,PHP 神盾解密工具

热门文章

  1. Python super( ) 函数详解
  2. HTMLParser 使用详解
  3. *PAT_甲级_1072 Gas Station (30point(s)) (C++)【Dijkstra/字符串截取/与数字相互转换】
  4. 程序员人人都会遇到的“画饼”,一招教你破解
  5. 【pytest-html】深度探索pytest-html测试报告的自定义使用
  6. 学习LSM(Linux security module)之一:解读yama
  7. tile cannot extend outside image
  8. mysql命令行的使用
  9. c语言定时器实验程序,C语言定时器实验.doc
  10. Bugku web(1—35)