首页 > 其他分享 >接口优化总结

接口优化总结

时间:2023-11-15 14:35:20浏览次数:29  
标签:总结 异步 缓存 可以 接口 查询 优化

一、架构图

二、批处理

       批量思想:批量操作数据库,这个很好理解,我们在循环插入场景的接口中,可以在批处理执行完成后一次性插入或更新数据库,避免多次IO。

         

二、异步处理

       异步思想:针对耗时比较长且不是结果必须的逻辑,我们可以考虑放到异步执行,这样能降低接口耗时。

       例如一个理财的申购接口,入账和写入申购文件是同步执行的,因为是T+1交易,后面这两个逻辑其实不是结果必须的,我们并不需要关注它的实时结果,所以我们考虑把入账和写入申购文件改为异步处理。如图所示:   

                    

     至于异步的实现方式,可以用线程池,也可以用消息队列,还可以用一些调度任务框架。

三、空间换时间

       一个很好理解的空间换时间的例子是合理使用缓存,针对一些频繁使用且不频繁变更的数据,可以提前缓存起来,需要时直接查缓存,避免频繁地查询数据库或者重复计算。

       需要注意的事,这里用了合理二字,因为空间换时间也是一把双刃剑,需要综合考虑你的使用场景,毕竟缓存带来的数据一致性问题也挺令人头疼。

       这里的缓存可以是R2M,也可以是本地缓存、memcached,或者Map。

       举一个股票工具的查询例子:

       因为策略轮动的调仓信息,每周只更新一次,所以原来的调接口就去查库的逻辑并不合理,而且拿到调仓信息后,需要经过复杂计算,最终得出回测收益和跑赢沪深指数这些我们想要的结果。如果我们把查库操作和计算结果放入缓存,可以节省很多的执行时间。如图:

                 

四、预处理

        也就是预取思想,就是提前要把查询的数据,提前计算好,放入缓存或者表中的某个字段,用的时候会大幅提高接口性能。跟上面那个例子很像,但是关注点不同。

        举个简单的例子:理财产品,会有根据净值计算年化收益率的数据展示需求,利用净值去套用年化收益率计算公式计算的逻辑我们可以采用预处理,这样每一次接口调用直接取对应字段就可以了。

 五、池化思想

        我们都用过数据库连接池,线程池等,这就是池思想的体现,它们解决的问题就是避免重复创建对象或创建连接,可以重复利用,避免不必要的损耗,毕竟创建销毁也会占用时间。

        池化思想包含但并不局限于以上两种,总的来说池化思想的本质是预分配与循环使用,明白这个原理后,我们即使是在做一些业务场景的需求时,也可以利用起来。

        比如:对象池。

六、串行改并行

        串行就是,当前执行逻辑必须等上一个执行逻辑结束之后才执行,并行就是两个执行逻辑互不干扰,所以并行相对来说就比较节省时间,当然是建立在没有结果参数依赖的前提下。

        比如,理财的持仓信息展示接口,我们既需要查询用户的账户信息,也需要查询商品信息和banner位信息等等来渲染持仓页,如果是串行,基本上接口耗时就是累加的。如果是并行,接口耗时将大大降低。

        如图:

                    

七、索引

       加索引能大大提高数据查询效率,这个在接口设计之出也会考虑到,这里不再多赘述,随着需求的迭代,我们重点整理一下索引不生效的一些场景,希望对小伙伴们有所帮助。

      具体不生效场景不再一一举例,后面有时间的话,单独整理一下。

     

 

 八、避免大事务

        所谓大事务问题,就是运行时间较长的事务,由于事务一致不提交,会导致数据库连接被占用,影响到别的请求访问数据库,影响别的接口性能。

       举个例子:

@Transactional(value = "taskTransactionManager", propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED, rollbackFor = {RuntimeException.class, Exception.class})
 public BasicResult purchaseRequest(PurchaseRecord record) {
     BasicResult result = new BasicResult();
     ...
     pushRpc.doPush(record);        
     result.setInfo(ResultInfoEnum.SUCCESS);
     return result;
 }
View Code

       所以为避免大事务问题,我们可以通过以下方案规避:

  1. RPC调用不放到事务里面;
  2. 查询操作尽量放到事务之;
  3. 事务中避免处理太多数据。

九、优化程序结构

      程序结构问题一般出现在多次需求迭代后,代码叠加形成。会造成一些重复查询、多次创建对象等耗时问题。在多人维护一个项目时比较多见。解决起来也比较简单,我们需要针对接口整体做重构,评估每个代码块的作用和用途,调整执行顺序。

十、深分页问题

      深分页问题比较常见,分页我们一般最先想到的就是 limit ,为什么会慢,我们可以看下这个SQL:

select * from purchase_record where productCode = 'PA9044' and status=4 and id > 100000 limit 200
View Code

     这样优化的好处是命中了主键索引,无论多少页,性能都还不错,但是局限性是需要一个连续自增的字段。

 十一、SQL优化

sql优化能大幅提高接口的查询性能,由于本文重点讲述接口优化的方案,具体sql优化不再一一列举,小伙伴们可以结合索引、分页、等关注点考虑优化方案。

十二、锁粒度避免过粗

锁一般是为了在高并发场景下保护共享资源采用的一种手段,但是如果锁的粒度太粗,会很影响接口性能。

关于锁粒度:就是你要锁的范围有多大,不管是synchronized还是redis分布式锁,只需要在临界资源处加锁即可,不涉及共享资源的,不必要加锁,就好比你要上卫生间,只需要把卫生间的门锁上就可以,不需要把客厅的门也锁上。

错误的加锁方式:

//非共享资源
private void notShare(){
}
//共享资源
private void share(){
}
private int right(){
    notShare();
    synchronized (this) {
        share();
    }
}
View Code

十三、总结

        很多接口的效率问题不是一朝一夕形成的,在需求迭代的过程中,为了需求快速上线,采取直接累加代码的方式去实现功能,这样会造成以上这些接口性能问题。

        变换思路,更高一级思考问题,站在接口设计者的角度去开发需求,会避免很多这样的问题,也是降本增效的一种行之有效的方式。

 

标签:总结,异步,缓存,可以,接口,查询,优化
From: https://www.cnblogs.com/xiaobaicai12138/p/17833736.html

相关文章

  • 接口(interface)
    一、前言面向接口编程,抽象方法是模板,接口是规范二、接口的基本内容:interfaceIFather{//静态常量可以省略static和final关键字publicstaticfinalStringNAME="张三";//抽象方法可以省略abstract关键字publicvoideat();......
  • day16 阶段总结和考试
    day16阶段总结课程目标:对第二模块“函数和模块”阶段的知识点进行总结和考试,让学员更好的掌握此模块的相关知识。课程概要:知识补充阶段总结(思维导图)考试题1.知识补充1.1nolocal关键字在之前的课程中,我们学过global关键字。name='root'defouter():name......
  • day08 总结和考试
    day08总结和考试课程目标:对第一模块“Python基础”阶段的知识点进行总结和考试,让学员更好的掌握此模块的相关知识。课程概要:代码规范知识补充阶段总结(思维导图)考试题1.代码规范程序员写代码是有规范的,不只是实现功能而已。1.1名称在Python开发过程中会创建文件夹......
  • TienChin-课程管理-课程更新接口
    更改包名将之前的entity更改为domain:将之前的validator包当中的校验分组接口移动到common模块当中,因为其它模块也需要使用就放到公共当中进行存储。更改完毕之后在修改下Course.java的校验注解的作用范围:/***课程ID*/@TableId(value="course_id",type=IdType.A......
  • TienChin-课程管理-添加课程接口
    CourseController.java@PreAuthorize("hasPermission('tienchin:course:create')")@Log(title="课程管理",businessType=BusinessType.INSERT)@PostMappingpublicAjaxResultadd(@Validated@RequestBodyCoursecourse){returnAja......
  • Docker logs 命令格式总结
    1、Dockerlogs命令格式dockerlogs参数容器名/容器id参数说明:--details显示提供给日志的其他详细信息--follow,-f实时跟踪日志输出--since显示自某个timestamp之后的日志大于等于某个时间,或相对时间,如1h就是1h)--tail,-nall从日志末尾显示的行数,默认值为all全......
  • Android性能优化:一份详细的布局优化实战指南,太特么重要了
    前言对于Android开发者来说,仅掌握基本的应用开发技能是远远不够的。无论是在工作中还是面试过程中,掌握大量的性能优化知识对于提升应用体验至关重要。Android性能优化主要涵盖以下方面:启动优化、渲染优化、内存优化、网络优化、卡顿检测与优化、耗电优化、安装包体积优化以及安全问......
  • 优化器
    参数普通参数(ModelParameters):这些参数是模型内部学习过程中需要调整的参数,它们通过训练数据进行优化。普通参数是模型通过学习从数据中获取的,比如神经网络中的权重和偏置项。优化算法的目标是通过调整这些参数,使得模型在给定任务上表现得更好。超参数(Hyperparameters):......
  • 业务开发时接口不能对外暴露解决方案
    一、内外网接口微服务隔离    1.1、方式       将对外暴露的接口和对内暴露的接口分别放到两个微服务上,一个服务里所有的接口均对外暴露,另一个服务的接口只能内网服务间调用。该方案需要额外编写一个只对内部暴露接口的微服务,将所有只能对内暴露的业务接口......
  • 2023NOIP A层联测30 总结
    2023NOIPA层联测30总结题目T1草莓列车\(n\leq10^5,m\leq10^7\)赛时思路一开始看错\(m\)数据范围,以为\(O(m\logm)\)可以过,后来发现问题以后,集中在考虑线段树之类的\(\log\)级别的算法维护序列,或者线段区间,一直没有想过ST表相关数据结构,于是最后只有60。赛后......