当前位置: 首页 > article >正文

接口性能优化

一、耗时统计

在做接口的性能优化时,最重要的是知道时间消耗在哪里。
可以用StopWatch,进行耗时统计。
详情见: https://blog.csdn.net/sinat_32502451/article/details/148350451

二、链路追踪

如果团队使用了Skywalking,可以用来进行链路追踪,耗时统计。
时间主要消耗在哪些服务,哪些方法,通过traceid一看便知。
Skywalking非常有用,哪怕项目里没有,也可以积极推进并接入Skywalking。

三、性能监控

如果团队里面有用到一些性能监控的工具,比如Grafana、Prometheus。
可以多看下接口的请求数、响应时间、服务器的CPU、GcCount等。

四、线程池

多线程、异步

如果多个任务之间不存在先后关系,没有强依赖,可以使用线程池做多线程、异步。
如果接口中存在多个任务,可以考虑使用多线程。
如果接口中有某个任务比较耗时,可以考虑使用异步。
CompletableFuture类能够开多线程处理多个任务,还能处理异步回调。
还能将多个任务合并成一个,设置阻塞时间。非常实用。
详情见:https://blog.csdn.net/sinat_32502451/article/details/133955576

线程池调优

详情见:https://blog.csdn.net/sinat_32502451/article/details/148350537

五、MQ

MQ的使用场景: 异步,解耦,削峰。
如果存在耗时的任务或功能,对性能的要求比较高,可以使用MQ做异步。
线程池也可以异步处理,但如果系统挂了,线程池也会失效,MQ则不会。MQ做异步,还有重试机制。

六、数据库

数据表加索引

数据库最常见的优化,就是加索引。
索引能够极大地提升数据表查询的速度。
常用的区分度高的字段,可以尝试加索引。
如果经常查询的有多个字段,可以考虑查询条件是否符合最左匹配原则,符合的话用复合索引。

批量处理–数据表

接口代码在做批量处理时,一定要注意,不要在for循环中调用数据库/缓存,不仅性能极差,还有连接数耗尽的可能。
数据表的批量处理,详情见:https://blog.csdn.net/sinat_32502451/article/details/148350849

Explain

接口中的sql比较慢时,可以用 Explain查看执行计划,做性能优化。
详情见: https://segmentfault.com/a/1190000008131735

分库分表

数据表的数据量大,可以分库分表。
详情见: https://blog.csdn.net/sinat_32502451/article/details/140732625

七、缓存

加缓存

Redis缓存的处理速度,远远快于数据库/网络这些IO。在做性能优化时,如果数据库/网络太慢,经常会用到Redis缓存。
加缓存有几点要注意:
1.如果在查询时使用了缓存,那么在更新(删除、插入)之后,必须处理缓存(一般是更新DB后删除缓存),让数据最终一致。
2.实时数据,频繁更新的数据,最好不要加缓存。
3.如果不是频繁更新的数据,又没法在数据变更时处理缓存,比如调用其他系统的接口,可以尝试加较短时间的缓存,比如1分钟。

详情见: https://blog.csdn.net/sinat_32502451/article/details/139545057

批量处理–缓存

Redis的execute(),可以在一次连接中处理多个命令。
Redis的execute(),详情见:https://blog.csdn.net/sinat_32502451/article/details/134366504

Pipeline (管道) 可以一次性发送多条命令并在执行完后一次性将结果返回。
Redis的管理操作,详情见: https://blog.csdn.net/sinat_32502451/article/details/134366490

数据预热

使用定时任务,定时去查询数据,或者是通过前置过滤器提前预热。
查询之后数据进入缓存,那么用户再去查时速度就会快很多。

八、服务器

服务器的状态

服务器是否正常启动。
在调用接口时,服务器的CPU、GcCount是否正常。

服务器的个数

服务器肯定是越多越好。但一般情况下,都会考虑成本。
服务器的个数有多少,能否加机器。

九、优化服务链路

如果接口的服务链路比较复杂,可以试着优化服务链路。
比如A服务中分别调用了B,C,D服务,那可以试着将BCD服务的内容合并到一个服务中,只做一次调用。
比如服务链路为 A->B->C->D,可以试着缩短服务链路,由 A->D,这样消耗的时间也会变短。

十、去掉冗余逻辑

如果接口复用了项目中其他的方法/代码,可以看是否有冗余的逻辑,如果有冗余的,考虑能否抽取可用逻辑,去掉冗余的逻辑。

http://www.lryc.cn/news/2394631.html

相关文章:

  • AWTK 嵌入式Linux平台实现多点触控缩放旋转以及触点丢点问题解决
  • 尚硅谷redis7 93-97 springboot整合reids之总体概述
  • Flutter、React Native、Unity 下的 iOS 性能与调试实践:兼容性挑战与应对策略(含 KeyMob 工具经验)
  • 声纹技术体系:从理论基础到工程实践的完整技术架构
  • 行为型:命令模式
  • 构建多模型协同的Ollama智能对话系统
  • vue3 + WebSocket + Node 搭建前后端分离项目 开箱即用
  • Win10秘笈:两种方式修改网卡物理地址(MAC)
  • 【软件】navicat 官方免费版
  • 【深度学习】16. Deep Generative Models:生成对抗网络(GAN)
  • java操作服务器文件(把解析过的文件迁移到历史文件夹地下)
  • 特伦斯 S75 电钢琴:重构演奏美学的极致表达
  • STM32-标准库-GPIO-API函数
  • Java 文件操作 和 IO(4)-- Java文件内容操作(2)-- 字符流操作
  • 机器学习与深度学习06-决策树02
  • Netty 实战篇:构建简易注册中心,实现服务发现与调用路由
  • 微信小程序(uniapp)对接腾讯云IM
  • 使用摄像头推流+VLC软件拉流
  • python魔法函数
  • XCUITest 是什么
  • 使用k8s服务进行端口代理
  • 灌水论坛系统总体设计文档
  • Mac M1编译OpenCV获取libopencv_java490.dylib文件
  • 使用 Let‘s Encrypt 和 Certbot 为 Cloudflare 托管的域名申请 SSL 证书
  • 【Python进阶】元编程、并发
  • 网络协议:[0-RTT 认证 ]
  • 单例模式的类和静态方法的类的区别和使用场景
  • flowable中流程变量的概念(作用域)
  • 【基础算法】模拟算法
  • 项目 react+taro 编写的微信 小程序,什么命令,可以减少console的显示