接口优化通用方案

目录

  • 批量
  • 异步、回调
  • 缓存
  • 预取
  • 池化
  • 并行
  • 锁粒度
  • 索引
  • 大事务
  • 海量数据

在这里插入图片描述

批量

  1. 批量思想:批量操作数据库
    优化前:

//for循环单笔入库
for(TransDetail detail:transDetailList){
insert(detail);
}
优化后:

batchInsert(transDetailList);

异步、回调

异步思想:耗时操作,考虑放到异步执行
耗时操作,考虑用异步处理,这样可以降低接口耗时。
将接口的耗时操作或IO操作改为异步执行,可以让接口在等待耗时操作完成的同时继续处理其他请求,提高并发处理能力。可以使用 CompletableFuture、CompletableFuture、@Async 注解等方式实现异步调用。

事件回调思想:拒绝阻塞等待。
如果你调用一个系统B的接口,但是它处理业务逻辑,耗时需要10s甚至更多。然后你是一直阻塞等待,直到系统B的下游接口返回,再继续你的下一步操作吗?这样显然不合理。

我们参考IO多路复用模型。即我们不用阻塞等待系统B的接口,而是先去做别的操作。等系统B的接口处理完,通过事件回调通知,我们接口收到通知再进行对应的业务操作即可。

缓存

空间换时间思想:恰当使用缓存。
在适当的业务场景,恰当地使用缓存,是可以大大提高接口性能的。缓存其实就是一种空间换时间的思想,就是你把要查的数据,提前放好到缓存里面,需要时,直接查缓存,而避免去查数据库或者计算的过程。

这里的缓存包括:Redis缓存,JVM本地缓存,memcached,或者Map等等。

预取

预取思想:提前初始化到缓存
预取思想很容易理解,就是提前把要计算查询的数据,初始化到缓存。如果你在未来某个时间需要用到某个经过复杂计算的数据,才实时去计算的话,可能耗时比较大。这时候,我们可以采取预取思想,提前把将来可能需要的数据计算好,放到缓存中,等需要的时候,去缓存取就行。这将大幅度提高接口性能。

池化

池化思想:预分配与循环使用
大家应该都记得,我们为什么需要使用线程池?

线程池可以帮我们管理线程,避免增加创建线程和销毁线程的资源损耗。

如果你每次需要用到线程,都去创建,就会有增加一定的耗时,而线程池可以重复利用线程,避免不必要的耗时。 池化技术不仅仅指线程池,很多场景都有池化思想的体现,它的本质就是预分配与循环使用。

比如TCP三次握手,大家都很熟悉吧,它为了减少性能损耗,引入了Keep-Alive长连接,避免频繁的创建和销毁连接。当然,类似的例子还有很多,如数据库连接池、HttpClient连接池。

以下是一些常见的应用池化思想的应用场景和实践方法:
连接池:数据库连接池是应用池化思想的一个典型应用。在项目中使用连接池可以避免频繁地创建和销毁数据库连接,提高数据库访问的性能。常见的连接池实现有 Apache Commons DBCP、HikariCP 等。
线程池:线程池是管理和复用线程资源的一种机制。在项目中使用线程池可以避免频繁地创建和销毁线程,提高线程的利用率和性能。Java 提供了 ThreadPoolExecutor 类来实现线程池,可以根据具体需求进行配置和使用。
对象池:对象池是管理和复用对象资源的一种机制。在项目中使用对象池可以避免频繁地创建和销毁对象,提高对象的利用率和性能。常见的对象池实现有 Apache Commons Pool 等。
缓存池:缓存池是将数据或计算结果缓存起来供后续使用的一种机制。在项目中使用缓存池可以减少重复计算的开销,提高系统的响应速度。常见的缓存池实现有 Redis、Ehcache 等。
资源池:除了上述具体的池化实现外,还可以根据项目的需求创建其他类型的资源池,如连接资源池、文件资源池等。通过池化思想可以有效地管理和复用资源,提高系统的性能和稳定性。

并行

远程调用由串行改为并行
假设我们设计一个APP首页的接口,它需要查用户信息、需要查banner信息、需要查弹窗信息等等。如果是串行一个一个查,比如查用户信息200ms,查banner信息100ms、查弹窗信息50ms,那一共就耗时350ms了,如果还查其他信息,那耗时就更大了。其实我们可以改为并行调用,即查用户信息、查banner信息、查弹窗信息,可以同时并行发起。

锁粒度

在高并发场景,为了防止超卖等情况,我们经常需要加锁来保护共享资源。但是,如果加锁的粒度过粗,是很影响接口性能的。

下面是一些常见的方法来限制锁的粒度:
细粒度锁:使用更小的锁范围来减少锁竞争。例如,可以将锁粒度从整个对象降低到对象的某个字段或方法上。
分离锁:将数据结构拆分成多个部分,并为每个部分使用独立的锁。这样不同部分之间的操作可以并行执行,减少锁竞争。
读写分离锁:对于读多写少的场景,可以使用读写锁(ReadWriteLock)来实现。读操作可以共享锁,而写操作需要独占锁。这样可以提高并发性能,因为多个读操作可以同时进行,而写操作会互斥。
锁分段:对于数据结构较大且操作并发较高的情况,可以将数据结构分成多个段,并为每个段使用独立的锁。这样不同段之间的操作可以并行执行,减少锁竞争。
无锁算法:对于特定的场景,可以使用无锁算法来替代锁。无锁算法利用原子操作和无锁数据结构,实现线程安全的并发访问。
乐观锁:在某些情况下,可以使用乐观锁机制,避免使用独占锁。乐观锁假设并发冲突较少,通过版本号或时间戳等机制来检测和解决并发冲突。
减少锁持有时间:尽量减少在锁内的操作时间,将非必要的操作移到锁外。这样可以缩小锁的范围,减少锁竞争。

索引

提到接口优化,很多小伙伴都会想到添加索引。没错,添加索引是成本最小的优化,而且一般优化效果都很不错。

索引优化这块的话,一般从这几个维度去思考:

你的SQL加索引了没?
你的索引是否真的生效?
你的索引建立是否合理?
关于索引原理可以参考:索引原理

大事务

避免大事务问题
为了保证数据库数据的一致性,在涉及到多个数据库修改操作时,我们经常需要用到事务。而使用spring声明式事务,又非常简单,只需要用一个注解就行@Transactional
所谓大事务问题就是,就是运行时间长的事务。由于事务一致不提交,就会导致数据库连接被占用,即并发场景下,数据库连接池被占满,影响到别的请求访问数据库,影响别的接口性能。

大事务引发的问题主要有:接口超时、死锁、主从延迟等等。因此,为了优化接口,我们要规避大事务问题。我们可以通过这些方案来规避大事务:

RPC远程调用不要放到事务里面
一些查询相关的操作,尽量放到事务之外
事务中避免处理太多数据

海量数据

海量数据处理,考虑NoSQL
之前看过几个慢SQL,都是跟深分页问题有关的。发现用来标签记录法和延迟关联法,效果不是很明显,原因是要统计和模糊搜索,并且统计的数据是真的大。最后跟组长对齐方案,就把数据同步到Elasticsearch,然后这些模糊搜索需求,都走Elasticsearch去查询了。

我想表达的就是,如果数据量过大,一定要用关系型数据库存储的话,就可以分库分表。但是有时候,我们也可以使用NoSQL,如Elasticsearch、Hbase等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/97654.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

模块化与组件化:开发中的双剑合璧

引言:模块化与组件化的重要性 在现代软件开发中,随着项目规模的增长和技术的复杂性增加,如何有效地组织和管理代码变得越来越重要。模块化与组件化作为两种主要的代码组织方法,为开发者提供了有效的工具,帮助他们创建…

数学建模:层次分析法

🔆 文章首发于我的个人博客:欢迎大佬们来逛逛 层次分析法 步骤描述 将问题条理化,层次化,构建出一个有层次的结构模型。层次分为三类:目标层,准则(指标)层,方案层。比…

若依 vue中el-radio无法默认选中

网上看了很多方法都不管用, 即便是element官方示例方法也不行 解决方法: html <el-form-item label"是否公开" prop"isOpen"><el-radio-group v-model"form.isOpen"><el-radio :label"0">不公开</el-radio>…

攻防世界-What-is-this

原题 解题思路 解压后文件 没有后缀&#xff0c;不知道是什么文件。用notepad打开找不到flag。 尝试当成压缩包解压。 用stegsolve以打开图片1&#xff0c; 合成两张图片。

扫盲:OLTP和OLAP的区别

定义 OLTP是Online Transaction Processing的缩写&#xff0c;其中文含义为&#xff1a;联机事务处理&#xff1b; OLAP是Online Analysis Processing的缩写&#xff0c;其中文含义为&#xff1a;联机分析处理。 上世纪60年代&#xff0c;关系数据库之父E.F.Codd提出了关系模…

大屏开发,浏览器的可视区域和设备的分辨率

在线屏幕检测 - 显示器检测 - 显示器坏点检测工具

飞桨中的李宏毅课程中的第一个项目——PM2.5的预测

所谓的激活函数&#xff0c;就是李宏毅老师讲到的sigmoid函数 和 hard sigmoid函数 &#xff0c;ReLU函数那些 现在一点点慢慢探索&#xff0c;会成为日后想都做不到的经历&#xff0c;当你啥也不会的时候&#xff0c;才是慢慢享受探索的过程。 有一说一&#xff0c;用chatGP…

Gitee API的使用|如何批量删除Gitee下的所有仓库

前言 那么这里博主先安利一些干货满满的专栏了&#xff01; 首先是博主的高质量博客的汇总&#xff0c;这个专栏里面的博客&#xff0c;都是博主最最用心写的一部分&#xff0c;干货满满&#xff0c;希望对大家有帮助。 高质量博客汇总https://blog.csdn.net/yu_cblog/cate…

界面控件Telerik UI for WPF——Windows 11主题精简模式提升应用体验

Telerik UI for WPF拥有超过100个控件来创建美观、高性能的桌面应用程序&#xff0c;同时还能快速构建企业级办公WPF应用程序。Telerik UI for WPF支持MVVM、触摸等&#xff0c;创建的应用程序可靠且结构良好&#xff0c;非常容易维护&#xff0c;其直观的API将无缝地集成Visua…

设计模式之九:迭代器与组合模式

有许多方法可以把对象堆起来成为一个集合&#xff08;Collection&#xff09;&#xff0c;比如放入数组、堆栈或散列表中。若用户直接从这些数据结构中取出对象&#xff0c;则需要知道具体是存在什么数据结构中&#xff08;如栈就用peek&#xff0c;数组[]&#xff09;。迭代器…

如何制作并运行 jar 程序

以下是用 Intellij 制作 jar 程序&#xff0c;并运行的方法。 【1】新建工程&#xff0c;保持默认选项&#xff0c;Next 【2】保持默认选项&#xff0c;Next 【3】给工程命名&#xff0c;设置保存位置&#xff0c;Finish 【4】新建工程结束&#xff0c;进入开发界面 【5】展开…

使用 Laf 一周内上线美术狮 AI 绘画小程序

“美术狮 AI 绘画”&#xff08;以下简称“美术狮”&#xff09;&#xff0c;是我们小团队的一次尝试&#xff0c;定位是人人都可以上手的&#xff0c;充满创意的&#xff0c;理解中文和中国文化的图片生成工具。 在完善图像模型和论证核心问题之后&#xff0c;我们开始构建 MV…

CSS中的margin与padding

目录 一、margin 1.概念及作用 2.基本语法 3.margin的用法 二、padding 1.介绍 2.基本语法及要求 3. 用法 4.内边距和元素宽度 讲这些之前&#xff0c;先看一张图&#xff0c;便于理解 一、margin 1.概念及作用 CSS margin 属性用于在任何定义的边框之外&#xff0c;…

长胜证券:什么是创业板股票

创业板股票是指在我国股票市场上&#xff0c;以创新式、高技术、高成长性和高危险特征为首要标志的公司&#xff0c;经审核后在创业板上市的股票。那么&#xff0c;什么是创业板&#xff1f;创业板是中国证券监督管理委员会依据实际需求设立的一个专门服务于创新式、高成长性中…

QLabel控件使用

Qt为我们应用程序界面开发提供的一系列的控件&#xff0c;下面我们介绍两种最常用一些控件&#xff0c;所有控件的使用方法我们都可以通过帮助文档获取。 1.QLabel控件使用 QLabel是我们最常用的控件之一&#xff0c;其功能很强大&#xff0c;我们可以用来显示文本&#xff0c…

(一)SpringBoot 整合WebSocket 前端 uniapp 访问

第一次使用WebSocket&#xff0c;所以最需要一个及其简单的例子&#xff0c;跑通之后&#xff0c;增加自己对该技术的理解。&#xff08;技术基础介绍就免掉了&#xff0c;后面再补&#xff09; 案例逻辑&#xff1a;目前只有一个用户&#xff0c;而且是一个用户给服务器发送数…

C# textBox1.Text=““与textBox1.Clear()的区别

一、区别 textbox.Text "" 和 textbox.Clear() 都可以用于清空文本框的内容&#xff0c;但它们之间有一些细微的区别。 textbox.Text "": 这种方式会将文本框的 Text 属性直接设置为空字符串。这样会立即清除文本框的内容&#xff0c;并将文本框显示为空…

【Python小项目】Python的GUI库Tkinter实现随机点名工具或抽奖工具并封装成.exe可执行文件

一、项目背景 受朋友所托,帮他在公司年会活动上做一个点名抽奖的小工具。经过沟通后,他发给我一个人员名单表格,是xlsx格式的excel工作表,并大概设计了一下抽奖工具的界面以及相关要求。话不多说,马上开始项目流程。 二、需求分析 客户需求总结如下: UI界面设计如下:…

kafka原理与应用

架构图 Broker Kafka集群包含多个服务器&#xff0c;服务器节点称为BrokerBroker存储Topic数据 如果某topic有N个partition&#xff0c;集群有N个broker&#xff0c;那么每个broker存储该topic的一个partition。如果某topic有N个partition&#xff0c;集群有(NM)个broker&#…

深度学习优化入门:Momentum、RMSProp 和 Adam

目录 深度学习优化入门&#xff1a;Momentum、RMSProp 和 Adam 病态曲率 1牛顿法 2 Momentum:动量 3Adam 深度学习优化入门&#xff1a;Momentum、RMSProp 和 Adam 本文&#xff0c;我们讨论一个困扰神经网络训练的问题&#xff0c;病态曲率。 虽然局部极小值和鞍点会阻碍…