范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

记一次接口性能优化实践总结优化接口性能的八个建议

  前言
  最近对外接口偶现504超时问题,原因是代码执行时间过长,超过nginx配置的15秒,然后真枪实弹搞了一次接口性能优化。在这里结合优化过程,总结了接口优化的八个要点,希望对大家有帮助呀~数据量比较大,批量操作数据入库耗时操作考虑异步处理恰当使用缓存优化程序逻辑、代码SQL优化压缩传输内容考虑使用文件/MQ等其他方式暂存,异步再落地DB跟产品讨论需求最恰当,最舒服的实现方式
  嘻嘻,先看一下我们对外转账接口的大概流程吧
  1.数据量比较大,批量操作数据入库
  优化前://for循环单笔入库 for(TransDetail detail:list){   insert(detail);   }
  优化后:// 批量入库,mybatis demo实现  insert into trans_detail( id,amount,payer,payee) values  (     #{item.id},	#{item.amount},     #{item.payer},#{item.payee}   )  
  性能对比:
  解析批量插入性能更好,更加省时间,为什么呢?打个比喻:假如你需要搬一万块砖到楼顶,你有一个电梯,电梯一次可以放适量的砖(最多放500), 你可以选择一次运送一块砖,也可以一次运送500,你觉得哪种方式更方便,时间消耗更少?2.耗时操作考虑异步处理
  耗时操作,考虑用异步处理,这样可以降低接口耗时。本次转账接口优化,匹配联行号的操作耗时有点长,所以优化过程把它移到异步处理啦,如下:
  优化前:
  优化后
  匹配联行号的操作异步处理
  性能对比:
  假设一个联行号匹配6ms
  解析:因为联行号匹配比较耗时,放在异步处理的话,同步联机返回可以省掉这部分时间,大大提升接口性能,并且不会影响到转账主流程功能。除了这个例子,平时我们类似功能,如用户注册成功后,短信邮件通知,也是可以异步处理的,这个优化建议香饽饽的~所以,太耗时的操作,在不影响主流程功能的情况下,可以考虑开子线程异步处理的啦。3.恰当使用缓存
  在适当的业务场景,恰当地使用缓存,是可以大大提高接口性能的。这里的缓存包括:Redis,JVM本地缓存,memcached,或者Map等。
  这次转账接口,使用到缓存啦,举个简单例子吧~
  优化前
  以下是输入用户账号,匹配联行号的流程图
  优化后:
  恰当使用缓存,代替查询DB表,流程图如下:
  解析:把热点数据放到缓存,不用每次查询都去DB拉取,节省了这部分查SQL的耗时,美滋滋呀~当然,不是什么数据都适合放到缓存的哦,访问比较频繁的热点数据才考虑缓存起来呢~4. 优化程序逻辑、代码
  优化程序逻辑、程序代码,是可以节省耗时的。
  我这里就本次的转账接口优化,举个例子吧~
  优化前:
  优化前,联行号查询了两次(检验参数一次,插入DB前查询一次),如下伪代码: punlic void process(Req req){   //检验参数,包括联行号(前端传来的payeeBankNo可以为空,但是如果后端没匹配到,会抛异常)    checkTransParams(Req req);    //Save DB   saveTransDetail(req);  }  void checkTransParams(Req req){     //check Amount,and so on.     checkAmount(req.getamount);     //check payeebankNo     if(Utils.isEmpty(req.getPayeeBankNo())){         String payeebankNo = getPayeebankNo(req.getPayeeAccountNo);         if(Utils.isEmpty(payeebankNo){             throws Exception();         }     } }  int saveTransDetail(req){     String payeebankNo = getPayeebankNo(req.getPayeeAccountNo);     req.setPayeeBankNo(payeebankNo);     insert(req);     ... }
  优化后:
  优化后,只在校验参数的时候插叙一次,然后设置到对象里面~ 入库前就不用再查啦,伪代码如下:void checkTransParams(Req req){     //check Amount,and so on.     checkAmount(req.getamount);     //check payeebankNo     if(Utils.isEmpty(req.getPayeeBankNo())){         String payeebankNo = getPayeebankNo(req.getPayeeAccountNo);         if(Utils.isEmpty(payeebankNo){             throws Exception();         }     }     //查询到有联行号,直接设置进去啦,这样等下入库不用再插入多一次     req.setPayeeBankNo(payeebankNo); }  int saveTransDetail(req){     insert(req);     ... }
  解析:对于优化程序逻辑、代码,是可以降低接口耗时的。以上demo只是一个很简单的例子,就是优化前payeeBankNo查询了两次,但是其实只查一次就可以了。很多时候,我们都知道这个点,但就是到写代码的时候,又忘记了呀~所以,写代码的时候,留点心吧,优化你的程序逻辑、代码哦。除了以上demo这点,还有其它的点,如优化if复杂的逻辑条件,考虑是否可以调整顺序,或者for循环,是否重复实例化对象等等,这些适当优化,都是可以让你的代码跑得更快的。
  之前我这篇文章,也提了几个优化点噢,有兴趣的朋友可以看一下哈~
  写代码有这些想法,同事才不会认为你是复制粘贴程序员5. 优化你的SQL
  很多时候,你的接口性能瓶颈就在SQL这里,慢查询需要我们重点关注的点呢。
  我们可以通过这些方式优化我们的SQL:加索引避免返回不必要的数据优化sql结构分库分表读写分离
  有兴趣的朋友可以看一下我这篇文章呢,很详细的SQL优化点:
  后端程序员必备:书写高质量SQL的30条建议6.压缩传输内容
  压缩传输内容,文件变得更小,因此传输会更快啦。10M带宽,传输10k的报文,一般比传输1M的会快呀;打个比喻,一匹千里马,它驮着一百斤的货跑得快,还是驮着10斤的货物跑得快呢?
  解析:如果你的接口性能不好,然后传输报文比较大的话,这时候是可以考虑压缩文件内容传输的,最后优化效果可能很不错哦~7. 考虑使用文件/MQ等其他方式暂存数据,异步再落地DB
  如果数据太大,落地数据库实在是慢的话,可以考虑先用文件的方式保存,或者考虑MQ,先落地,再异步保存到数据库~
  本次转账接口,如果是并发开启,10个并发度,每个批次1000笔数据,数据库插入会特别耗时,大概10秒左右,这个跟我们公司的数据库同步机制有关,并发情况下,因为优先保证同步,所以并行的插入变成串行啦,就很耗时。
  优化前:
  优化前,1000笔先落地DB数据库,再异步转账,如下:
  优化后:
  先保存数据到文件,再异步下载下来,插入数据库,如下:
  解析:如果你的耗时瓶颈就在数据库插入操作这里了,那就考虑文件保存或者MQ或者其他方式暂存吧,文件保存数据,对比一下耗时,有时候会有意想不到的效果哦。8.跟产品讨论需求最恰当,最舒服的实现方式
  这点个人觉得还是很重要的,有些需求需要好好跟产品沟通的。
  比如有个用户连麦列表展示的需求,产品说要展示所有的连麦信息,如果一个用户的连麦列表信息好大,你拉取所有连麦数据回来,接口性能就降下来啦。如果产品打桩分析,会发现,一般用户看连麦列表,也就看前几页因此,奸笑,哈哈 其实,那个超大分页加载问题也是类似的。即limit +一个超大的数,一般会很慢的~~

没有弹窗广告没有花里胡哨年轻人爱上适老版APP简单的内容模块,清晰明朗的标注,没有恼人的弹窗广告,没有让人眼花缭乱的跳转推送,虽然功能简单,用起来却省力更省心随着APP适老化逐渐推进,页面简洁操作简单的适老版APP在日渐繁重的拼多多第三届农货节正式启动,百亿补贴累计上线超2万款精品农货农业农村部调度数据显示,今年夏粮再获丰收,预计单产提高3公斤,产量再创历史新高。与此同时,全国各大水果产区也进入丰收季节。为了助力各大农产区增产增收,8月17日,国内最大的农产品上微信悄悄更新,朋友圈封面能动态显示了iOS微信本月初发布了新的8。0。10版本更新,主要上线了AppleWatch微信可支持微信支付,以及视频号直播可折叠显示的新功能。最近iOS微信虽然并没有新版本更新,但微信小动作韩系新派电动车,起亚EV6大量实拍图发布起亚EV6车型作为韩国品牌全新的原生纯电动车型,显示了韩国人对于未来电动车的全新理解,而新车此前已经在上海车展上亮相,近日,该车也已经在海外市场推出,并有望未来国产上市。外观方面,侯捷C视频资源全集与陈硕网络编程视频给很多小伙伴推荐过侯捷大佬的C视频,同时也推荐过陈硕大佬的网络编程视频,在B站学习中发现这些视频很多就下架了,所以很多下伙伴微信找我要视频,我以前在自己的微信学习交流群发过。今天呢轻舟智航完成一亿美元融资助力自动驾驶超级工厂加速推进来源读特继2021年年初完成A轮融资之后,轻舟智航又完成了由云锋基金和元生资本领投美团龙珠和国际知名养老基金共同投资的1亿美元A轮融资,老股东IDG资本持续跟投。自成立之初,轻舟智特斯拉国产化率将达到90,美国对特斯拉展开调查近段时间,上海自由贸易试验区临港新片区党工委副书记袁国华接受采访时提到,到2021年底,特斯拉上海超级工厂国产化率将达到90左右。同时,他还强调特斯拉上海工厂预计今年的全球产量将突从6合1到8合1!海尔空调洗空气健康再升级年累市场份额一步一个台阶,从2019年的12。4增至2021年的18。12021年第32周份额增至27。7,创下近年来新高。继布局健康空气场景迎来新增量后,进入2022新冷年,海尔室内有异味,空气浑浊怎么办?我们平时去到外面都知道要戴好口罩,除了因为疫情要做好防护外,还因为室外的空气污染实在需要挡一挡。但你有关注过家里的空气污染情况吗?室内的空气污染物,其实一点都不比室外少,各种致病细手机界颜值扛把子,摩托罗拉edgespro素皮版就这样征服了我作为一个喜欢自拍的小仙女,我买手机的原则是轻薄拍照好。之前我用的一款5G手机,又大又沉,拿着手累,外出背的化妆包也不好塞,单手自拍都很沉。关键是吧,我又喜欢戴着防滑手机壳,结果手机真正的实力派企业打印机就该这样选如何选择打印机?这一直是一个常见的话题。尤其是对于中小企业来说,印刷设备要求高效便捷耐用。因此,选择适合中小企业的打印设备并不是那么容易。那么再次,如何选择中小型打印机呢?公司购买
报告一月份新能源车保值率大幅提高中新经纬2月16日电据乘联会微信公众号消息,2022年2月,中国汽车流通协会和精真估联合发布了2022年1月中国汽车保值率研究报告。报告指出,新能源车保值率大幅提高,新能源汽车的补尘埃落定!英伟达400亿大单结果出炉,外媒这对华为是个好事儿随着科技的发展,诸多设备都开始进入智能化和自动化时代,而在这当中,芯片则充当着十分重要的地位,比如手机电脑汽车电视等等,都享受到了芯片带来的智能化时代。尽管我国在这些消费级产品上出入门烤箱天花板?看看海氏C45风炉烤箱是否所言非虚入门烤箱天花板?看看海氏C45风炉烤箱是否所言非虚大家好,我是聚灵阵主。今天闲话不多说,主要为了评测一下海氏C45风炉烤箱。海氏C45风炉烤箱是海氏家的新品烤箱,各项参数看上去都还马上消费研究院数字经济引领国际消费中心城市建设数字经济已成为我国重要的经济增长驱动力,在促进消费领域发挥重要的作用,对培育国际消费中心城市发挥创新引领作用。马上消费研究院调研上海重庆两大城市建设国际消费中心的创新做法,结合数字小米发布RedmiK50电竞版,起售价为3299元澎湃财讯2月16日,小米发布RedmiK50电竞版。小米集团高级副总裁Redmi品牌总经理卢伟冰介绍,这款设备核心配置上采用了高通骁龙8Gen1芯片,保留并升级了此前的磁动力肩键2netstat还能这么玩儿?一次摸鱼的机会,看到群里小伙伴问了一嘴netstattnpl这个命令是干啥的,这个命令用过很多,但是我其实也没有认真研究过,但是这是一个问题,我不能放过它,而且netstat这个命linux中TCP三次握手与四次挥手介绍及调优互联网中往往服务器才是主动关闭连接的一方。这是因为,HTTP消息是单向传输协议,服务器接收完请求才能生成响应,发送完响应后就会立刻关闭TCP连接,这样及时释放了资源,能够为更多的用铁路通信业务网之GSMR(一)今天咱们来聊聊铁路数字移动通信系统GSMR。GSM,是第二代移动通信系统,相交于第一代移动通信,第二代实现了一次跨越式发展。在哪儿跨越了?从模拟技术跨越到数字技术。这就很了不起啊。MySQL如何解决幻读CREATETABLEt(idint(11)NOTNULL,cint(11)DEFAULTNULL,dint(11)DEFAULTNULL,PRIMARYKEY(id),KEYc(TikTok算法它是如何工作TikTok已成为当下最常用的社交网络之一。成千上万的用户在TikTok上花费数小时,绝大多数用户不止一次地问自己如何在这个社交网络上获得更多的知名度?好吧,正如你已经知道的那样,红米手机,15002000元左右买哪款性价比高?这两款不错如果想购买红米手机,预算在15002000元左右可以考虑红米Note10系列。这个系列论性阿基吧的话,红米Note10Pro更胜一筹,单单是天玑1100这颗处理器就可以比肩许多20