首页 > 其他分享 >接口优化技巧

接口优化技巧

时间:2023-05-19 09:55:07浏览次数:48  
标签:事务 缓存 技巧 接口 共享资源 避免 加锁 优化

 

1.批处理

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

//for循环单笔入库
list.stream().forEatch(msg->{
    insert();
});
//批量入库
batchInsert();

2. 异步处理

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

3. 空间换时间

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

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

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

4. 预处理

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

5. 池化思想

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

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

比如:对象池

6. 串行改并行

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

7. 索引

加索引能大大提高数据查询效率

 

8. 避免大事务

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

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

1,RPC 调用不放到事务里面

2,查询操作尽量放到事务之外

3,事务中避免处理太多数据

 

9. 优化程序结构

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

10. 深分页问题

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

select*from purchase_record where productCode ='PA9044'andstatus=4orderby orderTime desclimit100000,200

limit 100000,200 意味着会扫描 100200 行,然后返回 200 行,丢弃掉前 100000 行。所以执行速度很慢。一般可以采用标签记录法来优化,比如:

select*from purchase_record where productCode ='PA9044'andstatus=4and id >100000limit200

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

1.SQL 优化

sql 优化能大幅提高接口的查询性能

12. 锁粒度避免过粗

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

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

错误的加锁方式:

//非共享资源
privatevoidnotShare(){
}
//共享资源
privatevoidshare(){
}
privateintwrong(){
    synchronized(this){
      share();
      notShare();
    }
}

正确的加锁方式:

//非共享资源
privatevoidnotShare(){
}
//共享资源
privatevoidshare(){
}
privateintright(){
    notShare();
    synchronized(this){
    share();
 }
}
 

标签:事务,缓存,技巧,接口,共享资源,避免,加锁,优化
From: https://www.cnblogs.com/KL2016/p/17414048.html

相关文章

  • PPT制作技巧汇总(二)——光影的美妙
    顶部投影1.选个漂亮点的背景图,再拉个大矩形白色底,2.给矩形添加内容,双击矩形给它添加阴影,给矩形添加90度的阴影突出大标题,再增加阴影距离42,模糊53,透明度63,大小100%左侧投影1.和之前一样张图片嵌入下,之后设置阴影,角度45,距离86,模糊85,透明60,大小90右侧投影1.和之前一样张图片......
  • 用Python调用chatGpt接口
    安装openaipipinstallopenai 编写python代码(chat.py)1importopenai2openai.api_key='个人的APIKEY'3whileTrue:4mesgs=[]5user_input=input('我:')6ifuser_input=='end':7break8mesgs.append......
  • javascript小技巧(六)
    操作EXECL<scriptlanguage="javascript">functionjStartExcel(){varxls=newActiveXObject("Excel.Application");xls.visible=true;varnewBook=xls.Workbooks.Add;newBook.Worksheets.Add;newBook.Worksheets(1).Activa......
  • 小D-新版接口自动化教程- 接口自动化测试综合实战
    mysql安装:Win10安装MySQL5.7(图文详解)_51CTO博客_win10安装mysql5.7下载navicat若连接mysql报错:关于连接MySQL8.0.11出现2059错误(baidu.com)......
  • 武汉星起航:亚马逊平台新手卖家的选品技巧与策略
    在亚马逊平台上,成功的选品是打造一个繁荣业务的关键。新手卖家在面对广阔的市场和激烈的竞争时,需要掌握一些选品技巧和策略。在选择产品之前,进行充分的市场研究是至关重要的。了解当前市场趋势、热门产品以及消费者需求是成功选品的关键。通过分析销售排名、竞争对手的表现和顾客评......
  • Postman+Newman生成HTML接口测试报告
    NewMan是官方提供的专门用于posman进行自动化的命令行工具环境配置:Node.js:Newman是基于Node.js,所以安装NewMan之前需要保证本地有安装Node.jsNewMan:npminewman-g,安装成功后输入newman-v来检查版本,显示出版本即表示安装成功html格式报告的插件:npminstall-gnewman......
  • 亚马逊AMAZON中国站API详情接口获取商品详情接口
       亚马逊中国站是亚马逊在中国开设的在线购物平台,提供包括图书、电子产品、家居生活、服饰鞋包等各类品类的商品。亚马逊为了满足中国消费者的需求,特别推出了全球购和自营模式两种购物方式,全球购支持跨境购物,自营模式则是由亚马逊直接发货并提供售后服务。同时,亚马逊还提......
  • Html中使用jquery通过Ajax请求WebService接口以及跨域问题解决
    场景VS2019新建WebService/Web服务/asmx并通过IIS实现发布和调用:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/130743584在上面实现发布WebService的基础上,怎样在html中通过jquery对接口发起请求和解析数据。注:博客:https://blog.csdn.net/badao_liumang_qiz......
  • 【淘宝拼多多抖音】订单详情API接口系列
    订单详情接口主要是获取订单的详细信息,包括但不限于订单号、下单时间、支付状态、发货状态、收货人信息、商品信息、金额、物流信息、退货/换货信息等。这些数据可以用于订单管理和追踪订单状态,以提供更好的客户服务。搜索当前会话用户作为卖家已卖出的交易数据(只能获取到三个月......
  • 记一次排查:接口返回值写入excel后,从单元格copy出来的数据会带有多重引号的问题
    在项目里刚好有3个服务,同一个网关内层的3个服务,两个php的,一个golang的,为了提高负载以及进行分流,部分客户的接口调用会被网关自动分配到go服务。恰好为了测试,我写了一个全量用户的生产、测试环境调用接口返回结果进行对比的脚本,于是发现了题中的问题:两个php服务里的接口返回值写入......