提高后端接口性能的方法

个人bibilailai(不喜请跳过):前几天参加的部门技术分享会,同事分享了一个内容为“提高接口性能的常见技巧”,个人觉得很有用,所以想在这里分享给大家,希望对刚入职场不久的兄弟姐妹们有所帮助。

1.避免大事物

大事务:有事务的方法的运行时间比较长,长时间未提交的事务。

1.1 大事务产生的原因

  • 操作的数据比较多
  • 大量的锁竞争
  • 事务中有其他非DB的耗时操作

1.2 大事务造成的影响

  • 并发情况下,数据库连接池容易被撑爆
  • 锁定太多的数据,造成大量的阻塞和锁超时,甚至导致死锁
  • 执行时间长,容易造成主从延迟
  • 回滚所需要的时间比较长
  • undo log膨胀

1.3 例子

反例:

@Transactional(rollbackFor=Exception.class)public void save(Req req) {checkParam(req);saveData1(req);updateData2(req);}private void checkParam(Req req){Data1 data = selectData1();Data2 data2 = selectData2();if(data.getSomeThing() != STATUS_YES){throw new BusinessTimeException(.....);}}

优化思路:一般只需要把与数据库的插入和修改操作放在事务里面,其他的校验以及查询数据等等都不需要放在事务内。

正例:

class ServiceAImpl implements ServiceA {@Transactional(rollbackFor=Exception.class)public void save(Req req) {saveData1(req);updateData2(req);}private void checkParam(Req req){Data1 data = selectData1();Data2 data2 = selectData2();if(data.getSomeThing() != STATUS_YES){throw new BusinessTimeException(.....);}}public void save(Req req){checkParam(req);doSave(req);}
}

2.异步调用

同步调用:也就是在你写的代码里面,在方法内部,必须按照从上往下的顺序执行,如果中间某一步报错了,就不能继续往下面执行了,全程只有一个主线程在执行。

异步调用:会在异步调用处启动另外一个线程1来执行被一步标记的那一步,全程有两个线程,除了线程1还有一个主线程,这两个线程是完全分开的,即使线程1报错也不会影响主线程的执行。

一般情况要看具体业务的时效性以及具体功能的必要性,比如注册会员,一般情况下会先修改用户数据,然后给用户发放100的奖励积分,其中对于发放积分这个操作就可以异步执行。

实现异步调用的方式有很多,这里就不赘述了。

3.添加索引

为表添加适当的索引,大家可以参考我这篇文章:写文章-CSDN创作中心icon-default.png?t=O83Ahttps://mp.csdn.net/mp_blog/creation/editor/140501342

4.避免循环查数据库

开发是要尽量减少与数据库的交互,因为和数据库交互非常耗时,影响性能。

如下反例:

 @Overridepublic List<Account> getAccountList(List<String> ids) {List<Account>  accounts = new ArrayList<>();for (String id : ids) {Account account = mapper.selectById(id);accounts.add(account);//其他业务操作}return accounts;}

正例:直接一次性查出需要的所有数据:

  @Overridepublic List<Account> getAccountList(List<String> ids) {List<Account> accounts = mapper.selectBatchIds(ids);return accounts;}

5.避免无限递归

特别是在不确定递归深度的时候,最好不要递归循环查数据库。

和上述避免循环查数据库是一样的道理。

方法有如下:

1.设定递归深度(也就是确定递归的次数)。

2.先查出所有的数据,然后去数据列表中筛选。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.net Core 使用Panda.DynamicWebApi动态构造路由

我们以前是通过创建controller来创建API&#xff0c;通过controller来显示的生成路由&#xff0c;这里我们讲解下如何不通过controller&#xff0c;构造API路由 安装 Panda.DynamicWebApi 1.2.2 1.2.2 Swashbuckle.AspNetCore 6.2.3 6.2.3添加ServiceAction…

ETCD简介

ETCD etcd的使用场景默认处理的数据都是控制数据&#xff0c; 对于应用数据&#xff0c;只推荐数据量很小&#xff0c;但是更新访问频繁的情况 主要用于共享配置和服务发现的组件&#xff08;激活码验证&#xff09; 分布式键值(key-value)数据库 基于go语言实现 分布式系…

服务器新建用户

文章目录 前言一、步骤二、问题三、赋予管理员权限总结 前言 环境&#xff1a; 一、步骤 创建用户需要管理员权限sudo sudo useradd tang为用户设置密码 sudo passwd tang设置密码后&#xff0c;可以尝试使用 su 切换到 tang 用户&#xff0c;确保该用户可以正常使用&#…

【.NET 8 实战--孢子记账--从单体到微服务】--简易权限--接口路径管理

从这篇文章开始&#xff0c;我们将为孢子记账增加简易的权限系统&#xff0c;它包含接口路径管理、角色可访问接口管理、访问权限中间件。在本篇文章中我们先实现接口路径管理相关的接口。 一、需求 接口路径管理比较简单&#xff0c;需求和前面的 用户 以及 **角色**的需求类…

NVR监测软件/设备EasyNVR多品牌NVR管理工具/设备对城市安全有哪些具体益处?

在智慧城市的建设中&#xff0c;各种先进的技术系统正发挥着越来越重要的作用。其中&#xff0c;NVR监测软件/设备EasyNVR作为一种高效的视频边缘计算网关&#xff0c;不仅能够实现视频数据的采集、编码和存储&#xff0c;还能与其他智慧城市系统进行深度集成&#xff0c;共同推…

TCP建立连接之后怎么保持长连接(检测连接断没断)

在TCP连接建立后&#xff0c;保持长连接的主要方式是通过定期的心跳检测&#xff08;Keep-Alive&#xff09;和超时机制。以下是一些具体的方法和机制 1. TCP Keep-Alive TCP协议本身提供了一种Keep-Alive机制&#xff0c;可以通过以下步骤实现&#xff1a; 启用Keep-Alive&…

速盾:海外cdn高防

随着互联网的快速发展&#xff0c;网站的安全性和稳定性变得越来越重要。尤其是对于大型企业和电商平台来说&#xff0c;保护用户数据和维护网站稳定运行是至关重要的。为了应对日益增长的网络攻击和恶意访问&#xff0c;海外CDN高防服务成为了一种非常受欢迎的解决方案。 首先…

【NOIP提高组】虫食算

【NOIP提高组】虫食算 C语言C &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 所谓虫食算&#xff0c;就是原先的算式中有一部分被虫子啃掉了&#xff0c;需要我们根据剩下的数字来判定被啃掉的字母。来看一个简单的例子&#xff1a; 43#98…

【系统架构设计师】2021年真题论文: 论面向方面的编程技术及其应用(AOP)(包括解题思路和素材)

更多内容请见: 备考系统架构设计师-专栏介绍和目录 文章目录 真题题目(2021年 试题1)解题思路面向方面的编程(AOP)技术概念和原理AOP的核心机制AOP 在软件系统开发中的应用场景AOP 应用案例分析论文素材参考真题题目(2021年 试题1) 面向过程编程是一种自顶向下的编程方…

Lobe Chat:你的私人AI助理

有一天&#xff0c;一位程序员对他的朋友说&#xff1a;‘我希望有一个助手&#xff0c;能像我一样聪明&#xff0c;但不会吃饭、喝水和请病假。’朋友回答说&#xff1a;‘这很简单&#xff0c;你只需要一个智能聊天助手&#xff01;’于是&#xff0c;程序员便找到了 LobeCha…

【CAPL实战】LIN帧干扰的脚本实现

文章目录 1、帧头干扰响应linDisturbRespWithHeader1.1 函数功能1.2 参数说明1.3 代码实例1.4 执行结果 2、帧头干扰帧头linDisturbHeaderWithHeader2.1 函数功能2.2 参数说明2.3 代码实例 1、帧头干扰响应linDisturbRespWithHeader 1.1 函数功能 使用一个新的header帧头来干…

华为HarmonyOS打造开放、合规的广告生态 - 激励广告

场景介绍 激励广告是一种全屏幕的视频广告&#xff0c;用户可以选择点击观看&#xff0c;以换取相应奖励。 接口说明 接口名 描述 loadAd(adParam: AdRequestParams, adOptions: AdOptions, listener: AdLoadListener): void 请求单广告位广告&#xff0c;通过AdRequestPar…

自由学习记录(18)

动画事件的碰撞器触发 Physics 类的常用方法 RaycastHit hit; if (Physics.Raycast(origin, direction, out hit, maxDistance)) {Debug.Log("Hit: " hit.collider.name); } Physics.Raycast&#xff1a;从指定点向某个方向发射射线&#xff0c;检测是否与碰撞体…

【elkb】创建用户和角色

在使用中我们不能把超管的用户信息给到所有者&#xff0c;我们需要为不用的使用场景创建不同的用户。 登录管理员用户 打开管理页面 创建角色 点击角色&#xff0c;创建角色 填写角色信息 设置Kibana 权限 最后点击创建角色 创建用户 点击用户--->创建用户 填写信息 登录…

【论文复现】语言模型中的多模态链式推理

&#x1f4d5;作者简介&#xff1a;热爱跑步的恒川&#xff0c;致力于C/C、Java、Python等多编程语言&#xff0c;热爱跑步&#xff0c;喜爱音乐、摄影的一位博主。 &#x1f4d7;本文收录于论文复现系列&#xff0c;大家有兴趣的可以看一看 &#x1f4d8;相关专栏C语言初阶、C…

Mysql常用语法一篇文章速成

文章目录 前言前置环境数据库的增删改查查询数据查询所有条件查询多条件查询模糊查询分页查询排序查询分组查询⭐️⭐️关联查询关联分页查询 添加数据insert插入多条记录不指定列名(适用于所有列都有值的情况) 更新数据更新多条记录更新多个列更新不满足条件的记录 删除统计数…

【每日C/C++问题】

一、 结构体和联合体有什么区别&#xff1f;能否在声明过程当中缺省名字&#xff1f;&#xff08;需要写清楚使用方法&#xff09; 结构体的各个成员占用不同的内存空间&#xff0c;总大小是所有成员大小之和&#xff08;结构体字节对齐&#xff09;&#xff1a; typedef str…

Docker小记

Docker就是将程序和环境一同打包成一个独立的容器&#xff0c;容器和容器之间独立&#xff0c;可以理解为一个app,一个手机就是一个pod&#xff0c;一个pod上可以运行多个容器&#xff0c;容器之间共享磁盘和网络&#xff0c;每个容器仍然运行在自己的进程空间中&#xff0c;有…

Spring Boot代理问题

在 Spring Boot 2.x 中&#xff0c;AOP&#xff08;面向切面编程&#xff09;默认使用 CGLIB&#xff08;Code Generation Library&#xff09;来实现类的代理。CGLIB 代理是通过在运行时生成目标类的子类来增强目标类的方法。这种方式允许对没有实现接口的类进行代理。以下是一…

“不可原谅的漏洞”论文导读

文章《Unforgivable Vulnerabilities》由Steve Christey 2007年撰写&#xff0c;主要探讨了在软件安全领域中那些本可以避免的漏洞&#xff0c;即“不可原谅的漏洞”。这些漏洞通常由于开发者忽视了基本的安全开发实践而存在&#xff0c;且容易被发现和利用。文章提出了建立一套…