纠纷奇闻社交美文家庭
投稿投诉
家庭城市
爱好生活
创业男女
能力餐饮
美文职业
心理周易
母婴奇趣
两性技能
社交传统
新闻范文
工作个人
思考社会
作文职场
家居中考
兴趣安全
解密魅力
奇闻笑话
写作笔记
阅读企业
饮食时事
纠纷案例
初中历史
说说童话
乐趣治疗

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

7月23日 乔了了投稿
  前言
  最近对外接口偶现504超时问题,原因是代码执行时间过长,超过nginx配置的15秒,然后真枪实弹搞了一次接口性能优化。在这里结合优化过程,总结了接口优化的八个要点,希望对大家有帮助呀数据量比较大,批量操作数据入库耗时操作考虑异步处理恰当使用缓存优化程序逻辑、代码SQL优化压缩传输内容考虑使用文件MQ等其他方式暂存,异步再落地DB跟产品讨论需求最恰当,最舒服的实现方式
  嘻嘻,先看一下我们对外转账接口的大概流程吧
  1。数据量比较大,批量操作数据入库
  优化前:for循环单笔入库for(TransDetaildetail:list){insert(detail);}
  优化后:批量入库,mybatisdemo实现insertidinsertBatchparameterTypejava。util。Listinsertintotransdetail(id,amount,payer,payee)valuesforeachcollectionlistitemitemindexindexseparator,({item。id},{item。amount},{item。payer},{item。payee})foreachinsert
  性能对比:
  解析批量插入性能更好,更加省时间,为什么呢?打个比喻:假如你需要搬一万块砖到楼顶,你有一个电梯,电梯一次可以放适量的砖(最多放500),你可以选择一次运送一块砖,也可以一次运送500,你觉得哪种方式更方便,时间消耗更少?2。耗时操作考虑异步处理
  耗时操作,考虑用异步处理,这样可以降低接口耗时。本次转账接口优化,匹配联行号的操作耗时有点长,所以优化过程把它移到异步处理啦,如下:
  优化前:
  优化后
  匹配联行号的操作异步处理
  性能对比:
  假设一个联行号匹配6ms
  解析:因为联行号匹配比较耗时,放在异步处理的话,同步联机返回可以省掉这部分时间,大大提升接口性能,并且不会影响到转账主流程功能。除了这个例子,平时我们类似功能,如用户注册成功后,短信邮件通知,也是可以异步处理的,这个优化建议香饽饽的所以,太耗时的操作,在不影响主流程功能的情况下,可以考虑开子线程异步处理的啦。3。恰当使用缓存
  在适当的业务场景,恰当地使用缓存,是可以大大提高接口性能的。这里的缓存包括:Redis,JVM本地缓存,memcached,或者Map等。
  这次转账接口,使用到缓存啦,举个简单例子吧
  优化前
  以下是输入用户账号,匹配联行号的流程图
  优化后:
  恰当使用缓存,代替查询DB表,流程图如下:
  解析:把热点数据放到缓存,不用每次查询都去DB拉取,节省了这部分查SQL的耗时,美滋滋呀当然,不是什么数据都适合放到缓存的哦,访问比较频繁的热点数据才考虑缓存起来呢4。优化程序逻辑、代码
  优化程序逻辑、程序代码,是可以节省耗时的。
  我这里就本次的转账接口优化,举个例子吧
  优化前:
  优化前,联行号查询了两次(检验参数一次,插入DB前查询一次),如下伪代码:punlicvoidprocess(Reqreq){检验参数,包括联行号(前端传来的payeeBankNo可以为空,但是如果后端没匹配到,会抛异常)checkTransParams(Reqreq);SaveDBsaveTransDetail(req);}voidcheckTransParams(Reqreq){checkAmount,andsoon。checkAmount(req。getamount);checkpayeebankNoif(Utils。isEmpty(req。getPayeeBankNo())){StringpayeebankNogetPayeebankNo(req。getPayeeAccountNo);if(Utils。isEmpty(payeebankNo){throwsException();}}}intsaveTransDetail(req){StringpayeebankNogetPayeebankNo(req。getPayeeAccountNo);req。setPayeeBankNo(payeebankNo);insert(req);。。。}
  优化后:
  优化后,只在校验参数的时候插叙一次,然后设置到对象里面入库前就不用再查啦,伪代码如下:voidcheckTransParams(Reqreq){checkAmount,andsoon。checkAmount(req。getamount);checkpayeebankNoif(Utils。isEmpty(req。getPayeeBankNo())){StringpayeebankNogetPayeebankNo(req。getPayeeAccountNo);if(Utils。isEmpty(payeebankNo){throwsException();}}查询到有联行号,直接设置进去啦,这样等下入库不用再插入多一次req。setPayeeBankNo(payeebankNo);}intsaveTransDetail(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一个超大的数,一般会很慢的
投诉 评论 转载

马斯克上月关于特斯拉产量的推文并未违反法院命令北京时间3月12日上午消息,据彭博社报道,特斯拉CEO埃隆马斯克(ElonMusk)对纽约法官表示,他上月发布的数条推文并没有违反与美国证券交易委员会(SEC)之前达成的协议。……特斯拉推电动车,但还得买运输拖车北京时间3月12日早间消息,美国财经媒体CNBC根据获得的最新证券文件报道称,特斯拉近期发行了1380万美元股票,用于购买将电动汽车从工厂车间运往客户处的卡车和拖车。本周……记一次接口性能优化实践总结优化接口性能的八个建议前言最近对外接口偶现504超时问题,原因是代码执行时间过长,超过nginx配置的15秒,然后真枪实弹搞了一次接口性能优化。在这里结合优化过程,总结了接口优化的八个要点,希……乌镇进行时这些世界互联网领先科技成果不简单中国青年报客户端讯(中青报中青网记者杨月)9月26日下午,由国家互联网信息办公室、浙江省人民政府主办的2021年世界互联网领先科技成果发布活动在乌镇互联网国际会展中心举行,这是……长城欧拉R1电动小车正式上市补贴后售价5。98万元起IT之家12月26日消息今日,长城旗下新能源汽车品牌欧拉的电动小车ORAR1正式上市。欧拉R1最高综合续航里程351公里,首批将于2019年1月交付。欧拉R1长、宽、高分……欧洲一公司已开始交付全电动卡车据国外媒体报道,日前荷兰卡车制造公司DAF已经向客户交付了其首款CF全电动卡车,这也将全电动卡车推向市场、实现运输行业电气化的竞赛再次推向了高潮。据悉,今年早些时候DAF……特斯拉公布第三代超级充电站5分钟可行驶120公里IT之家3月7日消息今天特斯拉公布了全新的第三代超级充电站,称Model3汽车在充电5分钟的情况下可以行使120公里。特斯拉表示第三代超充是一种全新的充电架构,可以支撑单车25……Model3节油?特斯拉被要求在德国删除误导性宣传语北京时间3月7日消息,特斯拉同意修改Model3在德国的广告,从广告中去除有关节省油费的说法。特斯拉的广告被德国公平竞争监管机构认为具有误导性。特斯拉一直在其德语网站上宣……电动车续航假面狂欢,特斯拉国产动了谁的蛋糕特斯拉都已经打到家门口了,咱们就别再搞这些宣传手段(等速续航)自嗨了。李想在微博上的一番话击穿了整个行业一直以来的宣传乱象。工信部统计数据显示,2018年,中国新能源汽车……特斯拉在底特律遇强手,美日大厂纷纷加码电动汽车北京时间1月15日讯,底特律汽车展历来是无数车厂与车迷的盛宴,但马斯克却怎么也笑不起来,因为一场展览下来,特斯拉的股价下跌了2。4。从美国到日本的汽车制造商纷纷加码电动汽车产业……马斯克只要5亿美元就能让特斯拉上海工厂运转起来北京时间1月31日下午消息,据彭博社报道,特斯拉CEO埃隆马斯克(ElonMusk)周三对投资者表示,特斯拉不会因为第一座海外工厂的运转而背负沉重的财务负担。马斯克在电话……金属质感才够味!影驰金属大师系列RTX3080开箱体验最近最让电脑游戏玩家亢奋的莫过于9月2号老黄发布的二代30系列光追显卡了,除了新品带来性能上的大幅度提升,主要还是这次对应给到的价格真的还是蛮良心的(狠到把自家先前近万元价格的……
假如华为没了任正非,格力没了董明珠,两家公司还能高速发展吗,小米11更新MIUI12。5增强版体验没有新功能,却更加令人4G无线路由器插SIM卡就能上网宽带wifi的无忧选择渔民清早赶海白天摆摊,摊上货品有海鲜有贝壳有珊瑚还有小鱼干uniapp多端开发我们公司已经写了很多项目2021国庆假期你准备到哪里去放飞自我4K8K电视中的超分辨率技术到底是啥?让我来告诉你(二插值篇奥运健儿名字被抢注?奥委会及时撤回和停止实施商标注册申请分析工程变更计量的论文在线教育退潮,智能教育硬件起浪电子黑板成为新趋势32寸毫无压力,爱格升LX单臂显示器支架体验关于动物论文的评述报告
普京曾振奋人心作表态支持两个地方回归中国豆豉是生的还是熟的豆豉可以经常吃吗汽车机油哪种好教你选购汽车机油2021暑假买学生票可以直接刷身份证进站吗豆腐的发明有关姑姑的小学生作文苹果通过家庭设置追逐不信任的父母市场华为老总任正非四谈衡水中学后,让衡水之争消停了不少外媒情况不妙法德两国准备持续使用核能发电起风了初一作文好听的励志流行歌曲介绍愚人节玩笑?詹皇发推正式宣布我的赛季结束了!咱们秋天见

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找美丽时装彩妆资讯历史明星乐活安卓数码常识驾车健康苹果问答网络发型电视车载室内电影游戏科学音乐整形