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

八种十倍提升API性能的方式

提起API,作为程序员来说并不陌生,很多程序员的大部分工作都是围绕着它, 然而,有些内容被大家忽略,API的性能会直接影响产品的用户体验,比如,一个视频软件,播放1s后需要加载5s,还有人会用它吗?API背后隐藏了很多复杂的业务逻辑,如何保证API的性能,直接体现了一个程序员的综合能力。今天我们就来聊聊八种提升API性能的常用方法。

一、什么是API? 

在讲解方法之前,先对API做个简单的介绍。API,Application Programming Interface,翻译为:应用程序接口,它是一种允许两个软件组件使用一组定义和协议相互通信的机制。比如,手机上的天气预报软件,它通过 API 与远程气象系统“交互”,获取天气相关数据,最后再将数据展示在手机上。如下图:软件A通过API与软件B进行交互。

二、API性能提升方法

 1. 缓存

缓存,应该是最容易被大家使用,提升API性能的方法,如下图:

在日常的业务开发中,通常会包含对数据库的CRUD,但是数据库的读写性能是有限的,比如在一些场景中,需要对某些数据进行频繁的读取,这时候,可以考虑将这些数据缓存起来,下次读取时,直接从缓存中读取,减少对数据库的访问,提升API性能。举个例子:假如访问 DB的耗时是 100ms,访问缓存的耗时是10ms,那么整个API的性能就提升 10倍。常用的缓存工具有 Redis 和 Google Guava cache(本地缓存)。

可能有些小伙伴会问:一个 API的响应数据,100ms 和 10ms 对于用户来说,似乎没有很大的差异?

假如把时间放大 10倍,100倍,就能发现,这个差异非常明显,比如,一个 API的响应时间是 10s, 如果能够通过缓存将响应时间降低到 1ms,那么整个系统的吞吐量就提升了 10倍,性能提升相当可观,对于用户的体验来说也是天壤之别。

2. 连接池

连接池,是一种数据库连接管理技术,它可以在系统初始化时,创建一定数量的数据库连接,当有请求时,直接从连接池中获取连接,使用完毕后 ,再将连接放回连接池中,这样就可以避免频繁的创建和销毁数据库连接,提升API的性能。如下图:

服务器和数据库建立连接是基于 TCP协议,而TCP 需要3次握手,这个过程比较耗时,如果每次请求都需要创建一个连接,那么就会频繁的进行3次握手,从而影响 API的性能。所以在日常开发中,和数据库连接时,通常都会使用一些三方的池化工具,以达到复用连接的目的。常用的池化工具有:JDBC,HikariCP,Druid,C3P0,DBCP,BoneCP等。

3. 异步

异步,是一种编程模型,它可以在一个线程中执行多个任务,如下图: 

在日常的业务开发中,通常包含核心链路和非核心链路,比如:订单支付中,支付是核心链路,支付后邮件通知是非核心链路,因此,可以把这些非核心链路的操作,改成异步实现,这样就可以提升API的性能。常用的异步方式有:线程池,消息队列,事件总线等。比如:上面的邮件发送,当用户支付完之后,可以使用线程池去实现邮件发送,也可以往消息队列中发送一条消息,由消费服务去消费,实现邮件发送。

4. N + 1问题

“N+1 问题” 是一个在数据库查询性能优化领域常见的概念,指的是在进行关联查询时,当你需要获取主表中的 N 条记录以及每条记录关联的另一个表中的相关信息时,会导致在获取相关信息时产生额外的查询操作,从而造成额外的负担和性能问题。如下图: 

举个例子:假如有两张表,文章 “post”表 和文章评论”comment”表,现在要统计每篇文章的评论数,通常SQL语句写法如下:

SELECT id FROM post;   // 1//for each post
SELECT count(*) FROM comment WHERE post_id = ?  // N

如上文的例子,查询 1次 post表,假如 post中有 N条数据,这样就需要额外查询 N次 comment表,因此,产生了 N + 1次查询。

解决”N+1 问题”的通常方法为:使用 JOIN 进行关联查询,如下SQL:

SELECT post.id, count(comment.id) FROM postLEFT JOIN comment ON post.id = comment.post_id GROUP BY post.id;

但是,在一些分库分表的情况下,无法进行 JOIN查询,该如何解决这种 N+1问题?

通常的做法有:数据冗余,说白了就是空间换时间。比如:在 post表中,增加一个 comment_count字段,用于存储评论数,这样就可以避免 N+1问题,但是会造成数据冗余,增加了存储空间。

因此,在程序员的世界,很多时候都是在时间和空间上的权衡(trade off)。

5. 分页

分页(Pagination),是一种常见的数据查询方式,它可以将大量的数据,分成多个页面进行展示,如下图:

分页也是业务开发中比较常见的一种方式,当数据量比较大时,通常会使用分页的方式进行查询,这样可以避免一次性查询大量的数据,造成内存溢出的问题。

6. JSON 序列化

JSON(JavaScript Object Notation)序列化是将数据结构或对象转换为JSON格式的字符串的过程,以便在网络传输、存储或与其他程序交互时进行数据交换。JSON是一种轻量级的数据交换格式,易于人类阅读和编写,同时也易于解析和生成。在各种编程语言中,可以使用库或内置函数来进行JSON序列化和反序列化操作。如下图:

7.压缩 payload

在API开发中有个默认的约定:参数要尽量的少。因为参数越多,API的复杂度就越高,维护成本也就越高。因此,通常我们会对参数进行压缩。如下图:

比如:上传文件,通常会对文件进行压缩,以减少文件的大小,提升上传速度。

8. 精简Log或者异步log

在业务流程中,通常会增加 log来标记一些核心的流程,以及记录错误信息,方便排查问题。但是,log通常是磁盘操作,如果log过多,就会影响API的性能。因此,通常会对log进行精简,或者异步log。如下图:

异步日志(Asynchronous Logging)是一种在计算机程序中进行日志记录的技术。与传统的同步日志记录不同,异步日志记录允许程序在记录日志时不必等待日志写入磁盘或其他存储介质完成,而是将日志数据放入队列或缓冲区中,然后由另一个线程或进程负责将日志异步地写入存储介质。异步日志记录通常会涉及以下一些组件:

  • 日志缓冲区或队列:程序将要记录的日志信息放入缓冲区或队列中,然后可以继续执行其他任务。
  • 日志写入线程:另一个线程负责从缓冲区或队列中获取日志数据,并将其写入实际的存储介质(如磁盘)中。这个过程是异步的,不会阻塞主程序的执行。
  • 同步机制:由于异步操作涉及多线程,可能需要适当的同步机制来确保线程之间的安全性,避免竞态条件等问题。

异步日志的优点可以减少主程序的延迟和性能损失的同时,提升性能。需要注意的是,在实现异步日志时,要小心处理缓冲区溢出、数据丢失以及确保正确的日志顺序等问题。

三、总结 

本文分别了介绍了API的性能优化方案,包括:

  • 缓存
  • 连接池
  • 异步
  • N+1问题
  • 分页
  • JSON序列化
  • 压缩payload
  • 精简log等

当然,这些方案并不是一定要使用,而是根据实际的业务场景,具体问题具体分析,选择合适的方案。

另外,在API的开发中我们通常需要关注三个最常见的问题:

  • 性能
  • 安全性
  • 健壮性

相关文章:

八种十倍提升API性能的方式

提起API,作为程序员来说并不陌生,很多程序员的大部分工作都是围绕着它, 然而,有些内容被大家忽略,API的性能会直接影响产品的用户体验,比如,一个视频软件,播放1s后需要加载5s&#x…...

pg_database中的datlastsysoid

一,关于 pg_database 在 PostgreSQL 中,对于在数据库集群内创建的每个数据库,其关键信息都会被保存到 pg_database 系统表中。 PostgreSQL 确保通过 pg_database 系统表持久化存储每个数据库的属性信息,以方便后续管理和使用。这也让 pg_da…...

【已解决】ognl.PropertyAccessor

在Spring boot2.x用TemplateEngine处理数据得时候&#xff0c;出现以下错误&#xff1a; 定位到代码行&#xff1a; 解决办法&#xff1a;修改thymeleaf的依赖&#xff1a; <!-- thymeleaf --><dependency><groupId>org.thymeleaf</groupId><…...

Pytest系列-快速入门和基础讲解(1)

前言 目前有两种纯测试的测试框架&#xff0c;pytest和unittestunittest应该是广为人知&#xff0c;而且也是老框架了&#xff0c;很多人都用来做自动化&#xff0c;无论是UI还是接口pytest是基于unittest开发的另一款更高级更好用的单元测试框架 单元测试框架介绍 单元测试…...

微信小程序实现连续签到七天

断签之后会从第一天重新开始 <template><view class"content" style"height: 100vh;background: white;"><view class"back"><view style"position: absolute;bottom: 200rpx;left: 40rpx;width: 90%;"><i…...

将 Spring Boot 应用程序与 Amazon DocumentDB 集成

Amazon DocumentDB&#xff08;与 MongoDB 兼容&#xff09;是一种可扩展、高度持久和完全托管的数据库服务&#xff0c;用于操作任务关键型 MongoDB 工作负载。在 Amazon DocumentDB 上&#xff0c;您可以使用相同的 MongoDB 应用程序代码、驱动程序和工具来运行、管理和扩展工…...

前端小案例1:用css实现蒙层效果

前端小案例1&#xff1a;用css实现蒙层效果 我想要在react的函数组件中实现如下效果&#xff1a;首先dom结构中有一个slider组件用于展示当前的亮度条&#xff0c;如果在 flag为true的情况下&#xff0c;就给当前页面上覆盖一张透明度为0.8图片。有一个按钮会切换flag的值。 …...

RTMP流媒体服务器EasyDSS视频点播平台在不关闭防火墙的情况下平稳部署的具体步骤

EasyDSS视频直播点播平台提供了视频转码、点播、直播、推拉流、录像、回放等功能&#xff0c;可应用在AR、VR、无人机推流、虚拟直播、教育培训、远程会议等多样化的场景中。 通常我们在部署EasyDSS时都建议用户关闭防火墙的&#xff0c;但是也有无需关闭防火墙的部署办法&…...

QT中信号与槽机制的介绍,以及信号与槽连接的几种方式

信号与槽机制 信号与槽的介绍 功能&#xff1a;实现多个组件之间的相互通信&#xff0c;是QT引以为傲的核心机制信号&#xff1a;就是信号函数&#xff0c;定义在类体的signals权限下&#xff0c;是一个不完整的函数&#xff0c;只有声明没有定义&#xff1b;槽&#xff1a;就…...

学习笔记——Java入门第二季

1.1 介绍类与对象 类和对象的关系&#xff1a; 时间万物皆对象。对象是具体的事物&#xff0c;是类的具体事例 类是抽象的概念&#xff0c;是对象的模板。 new关键字是创建实例对象最重要的标志 Dog duoduonew Dog(); Dog luckynew Dog(); 这样就创建了两个对象并且在java内…...

计算机视觉的应用13-基于SSD模型的城市道路积水识别的应用项目

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下计算机视觉的应用13-基于SSD模型的城市道路积水识别的应用项目。今年第11号台风“海葵”后部云团的影响&#xff0c;福州地区的降雨量突破了历史极值&#xff0c;多出地方存在严重的积水。城市道路积水是造成交通拥…...

【39元linux开发板-ADB远程教程】-[ADB远程终端]-幸狐Luckfox Pico-超越树莓派PICO

【教程-持续更新】 幸狐Luckfox Pico RV1103 教程合集 【39元linux开发板-ADB远程教程】-[ADB远程终端]-幸狐Luckfox Pico-超越树莓派PIC...

900ES1-0100 honeywell 可减少视觉引导应用的整体开发时间

900ES1-0100 honeywell 可减少视觉引导应用的整体开发时间 CV2视觉系统配有高柔性电缆(以太网或USB)。通过将高柔性电缆作为所有CV2视觉系统的标准配置&#xff0c;Epson CV2摄像机可以安装在机器人臂(移动)或固定装置(固定)上。基于向导的校准使机器人到视觉系统的校准变得轻…...

Openvslam

文章目录 Openvslam 学习报告什么是Openvslam概念特点 安装和运行OpenVSLAM克隆源代码安装依赖库测试&#xff08;环境已经安装成功&#xff09;运行运行失败的总结运行成功 系统设计模块和函数接口调用流程流程图参考资料 Openvslam 学习报告 什么是Openvslam 概念 OpenVSL…...

Windows通过RDP异地远程桌面Ubuntu【内网穿透】

文章目录 前言1. ubuntu安装XRDP2.局域网测试连接3.安装cpolar内网穿透4.cpolar公网地址测试访问5.固定域名公网地址 前言 XRDP是一种开源工具&#xff0c;它允许用户通过Windows RDP访问Linux远程桌面。 除了Windows RDP外&#xff0c;xrdp工具还接受来自其他RDP客户端(如Fre…...

js 基础 (ES 模块)

ES 模块语法 1、模块化的背景 JavaScript 程序本来很小——在早期&#xff0c;它们大多被用来执行独立的脚本任务&#xff0c;在你的 web 页面需要的地方提供一定交互&#xff0c;所以一般不需要多大的脚本。过了几年&#xff0c;我们现在有了运行大量 JavaScript 脚本的复杂…...

K8s 多集群实践思考和探索

作者&#xff1a;vivo 互联网容器团队 - Zhang Rong 本文主要讲述了一些对于K8s多集群管理的思考&#xff0c;包括为什么需要多集群、多集群的优势以及现有的一些基于Kubernetes衍生出的多集群管理架构实践。 一、为什么需要多集群 随着K8s和云原生技术的快速发展&#xff0c…...

德国金融监管机构网站遭遇大规模DDoS攻击后“瘫痪”

德国波恩的BaFin大楼 BaFin是负责监督和监管德国金融机构和市场的金融监管机构&#xff0c;其职责是确保德国金融体系的稳定性、完整性和透明度。 此外&#xff0c;BaFin 的网站还为企业和消费者提供银行、贷款和财产融资等方面的信息。它还提供消费者帮助热线和举报人信息共…...

关于特殊时期电力行业信息中心运营思路

一、防御思路 安全运营是一系列规则、技术和应用的集合&#xff0c;用以保障组织核心业务平稳运行的相关活动&#xff0c;是通过灵活、动态的实施控制以期达到组织和业务需要的整体范围可持续性正常运行。信息中心在特殊时期扮演着关键的角色&#xff0c;因此需要精心设计运营…...

机器人中的数值优化(八)——拟牛顿方法(上)

本系列文章主要是我在学习《数值优化》过程中的一些笔记和相关思考&#xff0c;主要的学习资料是深蓝学院的课程《机器人中的数值优化》和高立编著的《数值最优化方法》等&#xff0c;本系列文章篇数较多&#xff0c;不定期更新&#xff0c;上半部分介绍无约束优化&#xff0c;…...

mac安装adobe需要注意的tips(含win+mac all安装包)

M2芯片只能安装2022年以后的&#xff08;包含2022年的&#xff09; 1、必须操作的开启“任何来源” “任何来源“设置&#xff0c;这是为了系统安全性&#xff0c;苹果希望所有的软件都从商店或是能验证的官方下载&#xff0c;导致默认不允许从第三方下载应用程序。macOS sie…...

C/C++学习网址

1、http://snippets.dzone.com/tag/c/ --数以千计的有用的C语言源代码片段 2、http://www.hotscripts.com/category/c-cpp/scripts-programs/ Hotscripts --提供数以百计的C和C脚本和程序。所有程序都分为不同的类别。 3、http://www.planetsourcecode.com/vb/default.asp?lng…...

Typora导出的PDF目录标题自动加编号

Typora导出的PDF目录标题自动加编号 在Typora主题文件夹增加如下文件后&#xff0c;标题便自动加上了编号&#xff1a; https://gitcode.net/as604049322/blog_data/-/blob/master/base.user.css 例如&#xff1a; 但是导出的PDF中&#xff0c;目录却没有编号&#xff1a; 这…...

【React】React学习:从初级到高级(二)

React学习【二】 2 添加交互2.1 响应事件2.1.1 添加事件处理函数2.1.2 在事件处理函数中读取props2.1.3 将事件处理函数作为props传递2.1.4 命名事件处理函数prop2.1.5 事件传播2.1.6 阻止传播2.1.7 传递处理函数作为事件传播的替代方案2.1.8 阻止默认行为 2.2 State: 组件的记…...

无法将类型为“Newtonsoft.Json.Linq.JObject”的对象转换为类型“Newtonsoft.Json.Linq.JArray”解决方法

对于“Newtonsoft.Json.Linq.JObject”的对象强制类型转换为类型“Newtonsoft.Json.Linq.JArray”报错 第一的图为对象{“*************”:“********”} 第二个图片为数组[{“…”:“…”}] 在我这里进行强制转换对象转换为类型“Newtonsoft.Json.Linq.JArray”报错. 那我们…...

从零开始,无需公网IP,搭建本地电脑上的个人博客网站并发布到公网

文章目录 前言1. 安装套件软件2. 创建网页运行环境 指定网页输出的端口号3. 让WordPress在所需环境中安装并运行 生成网页4. “装修”个人网站5. 将位于本地电脑上的网页发布到公共互联网上 前言 在现代社会&#xff0c;网络已经成为我们生活离不开的必需品&#xff0c;而纷繁…...

Excel VSTO开发6 -Range对象

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 6 Range对象 Excel中最重要的一个对象是Range对象&#xff0c;它可以代表某一单元格、某一行、某一列、某一区域&#xff08;该区域…...

LeetCode 15 三数之和

题目链接 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 题目解析 // 1. 排序双指针 // 2. 固定一个值nums[i] 然后去剩下的位置去找 两数之和符合nums[j]nums[k]是否等于-nums[i] // 3. 细节问题&#xff1a;由于题目中是不可以包含重复的三元组的…...

车船边缘网关是如何给车辆船只定位的?

随着智能交通系统的不断发展&#xff0c;车路协同成为了重要的研究方向之一。而AI边缘计算网关在这个领域中发挥着至关重要的作用。本文将重点介绍AI边缘计算网关在车路协同中的应用&#xff0c;并强调其中的重点词汇或短语。 首先&#xff0c;什么是AI边缘计算网关&#xff1…...

详解MAC帧、ARP、DNS、ICMP协议

局域网通信原理 比如新建了一个内网&#xff0c;如果一台机器A找机器B&#xff0c;封FRAME时&#xff08;OSI的第二层用的数据格式&#xff09;&#xff0c;要封装对方的MAC&#xff0c;开始时A不知道B的MAC&#xff0c;只知道IP&#xff0c;它就发一个ARP包&#xff0c;源IP是…...

南阳做网站哪家好/上海网站排名优化公司

1.什么是Hive Hive 是建立在 Hadoop上的数据仓库基础构架。它提供了一系列的工具&#xff0c;可以用来进行数据提取转化加载&#xff08;ETL&#xff09;&#xff0c;这是一种可以存储、查询和分析存储在Hadoop中的大规模数据的机制。Hive 定义了简单的类SQL查询语言&#xff0…...

浦江县做网站/搜索网页内容

点击查看&#xff1a;基于Matlab高效的耦合字典学习方法 文件大小&#xff1a;3.9M 操作系统&#xff1a;Windows10旗舰版 开发工具&#xff1a;Matlab2018 开发语言&#xff1a;.m 简要概述&#xff1a; 一种高效的耦合字典学习方法 MATLAB代码...

淘客网站怎么建立/百度竞价托管公司

主要解决方向&#xff0c;JAVA与MYSQL中编码要统一。通常采用UTF-8.这里虽然你在项目中设置了数据库采用UTF-8&#xff0c;但是那里不包括连接方式之类的。1.查询自身MYSQL编码方式MySQL默认编码是latin1mysql> show variables like character%;---------------------------…...

查企业资质上什么网站/深圳网络营销策划

tar -zxvf pycharm-community-2022.1.2.tar.gz cd pycharm-community-2022.1.2/bin sh pycharm.sh启动&#xff1a; sh pycharm.sh 创建快捷方式 打开pycharm在工具中选创建桌面条目即可 Tools -> Create Desktop Entry...

wordpress js调用/西安网站seo技术厂家

UITextField详解 一、基本属性 1、创建文本输入框 UITextField*textField[[UITextField alloc]initWithFrame:CGRectMake(10, 10, 200, 20)]; 2、设置边框样式 textField.borderStyle UITextBorderStyleRoundedRect;//圆角 可选属性&#xff1a; UITextBorderStyleNone,无边框…...

佛山做外贸网站案例/网络优化培训骗局

const和#define的利弊&#xff0c;从而推导const的意义&#xff1b; const和#define都有类似的功能&#xff0c;那就是定义一个“常量”&#xff1b; 想用来替换#define定义常量这种方式。这是一种定义宏的方式。因为宏替换定义常量有一定的缺陷&#xff1a;不做类型检查&#…...