当前位置: 首页 > 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,这样消耗的时间也会变短。

十、去掉冗余逻辑

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

相关文章:

接口性能优化

一、耗时统计 在做接口的性能优化时,最重要的是知道时间消耗在哪里。 可以用StopWatch,进行耗时统计。 详情见: https://blog.csdn.net/sinat_32502451/article/details/148350451 二、链路追踪 如果团队使用了Skywalking,可以…...

AWTK 嵌入式Linux平台实现多点触控缩放旋转以及触点丢点问题解决

前言 最近涉及海图的功能交互,多点触摸又开始找麻烦。 在PC/Web平台awtk是通过底层的sdl2库来实现多点触摸,但是在嵌入式Linux平台,可能是考虑到性能原因,awtk并没有采用sdl库来做事件处理,而是自己实现一个awtk-lin…...

尚硅谷redis7 93-97 springboot整合reids之总体概述

93 springboot整合reids之总体概述 总体概述 jedis-lettuce-RedisTemplate三者的联系 名称类型作用描述和其它的关系JedisRedis 客户端早期主流的 Java Redis 客户端,基于阻塞 I/O,同步操作可作为 RedisTemplate 的底层连接实现LettuceRedis 客户端基…...

Flutter、React Native、Unity 下的 iOS 性能与调试实践:兼容性挑战与应对策略(含 KeyMob 工具经验)

移动端跨平台开发逐渐成为常态,Flutter、React Native、Unity、Hybrid App 等框架在各类 iOS 项目中频繁出现。但随之而来的,是一系列在 iOS 设备上调试难、性能数据采集难、日志整合难的问题。 今天这篇文章,我从实际项目出发,聊…...

声纹技术体系:从理论基础到工程实践的完整技术架构

文章目录 一、声纹技术的理论基础与概念内核1.1 声纹的生物学本质与数学表征1.2 特征提取的理论基础与实现机制 二、声纹识别技术的演进逻辑与方法体系2.1 传统统计学方法的理论架构2.2 深度学习方法的技术革新2.3 损失函数的设计原理与优化策略 三、声纹识别系统的架构设计与模…...

行为型:命令模式

目录 1、核心思想 2、实现方式 2.1 模式结构 2.2 实现案例 3、优缺点分析 4、适用场景 5、实际应用 1、核心思想 目的:将指令信息封装成一个对象,并将此对象作为参数发送给接收方去执行,以使命令的请求方与执行方解耦 概念&#xff…...

构建多模型协同的Ollama智能对话系统

构建多模型协同的Ollama智能对话系统 在人工智能应用中,单一模型往往难以满足复杂场景的需求。本文将介绍如何整合多个Ollama模型,构建一个智能对话系统,实现情感分析、危机评估和智能回复的协同功能。 系统架构 该系统采用多模型pipeline…...

vue3 + WebSocket + Node 搭建前后端分离项目 开箱即用

[TOC](vue3 WebSocket Node 搭建前后端分离项目) 开箱即用 前言 top1:vue3.5搭建前端H5 top2:Node.js koa搭建后端服务接口 top3:WebSocket 长连接实现用户在线聊天 top4:接口实现模块化 Mysql 自定义 top5:文件上…...

Win10秘笈:两种方式修改网卡物理地址(MAC)

Win10秘笈:两种方式修改网卡物理地址(MAC) 在修改之前,可以先确定一下要修改的网卡MAC地址,查询方法有很多种,比如: 1、在设置→网络和Internet→WLAN/以太网,如下图所示。 2、在控…...

【软件】navicat 官方免费版

Navicat Premium Lite https://www.navicat.com.cn/download/navicat-premium-lite...

【深度学习】16. Deep Generative Models:生成对抗网络(GAN)

Deep Generative Models:生成对抗网络(GAN) 什么是生成建模(Generative Modeling) 生成模型的主要目标是从数据中学习其分布,从而具备“生成”数据的能力。两个关键任务: 密度估计&#xff0…...

java操作服务器文件(把解析过的文件迁移到历史文件夹地下)

第一步导出依赖 <dependency><groupId>org.apache.sshd</groupId><artifactId>sshd-core</artifactId><version>2.13.0</version></dependency> 第二步写代码 public void moveFile( List<HmAnalysisFiles> hmAnalys…...

特伦斯 S75 电钢琴:重构演奏美学的极致表达

在数字音乐时代&#xff0c;电钢琴正从功能性乐器升级为融合艺术、科技与生活的美学载体。特伦斯 S75 电钢琴以极简主义哲学重构产品设计&#xff0c;将专业级演奏体验与现代家居美学深度融合&#xff0c;为音乐爱好者打造跨越技术边界的沉浸式艺术空间。 一、极简主义的视觉叙…...

STM32-标准库-GPIO-API函数

1.void GPIO_DeInit(GPIO_TypeDef* GPIOx); 简明 清除GPIOx的外围寄存器下所有引脚的配置, 恢复到默认配置状态&#xff08;即上电初始值&#xff09; 参数 GPIOx&#xff1a;其中x可以是&#xff08;A..G&#xff09;来选择GPIO外设。 返回值 None void GPIO_DeInit(GPI…...

Java 文件操作 和 IO(4)-- Java文件内容操作(2)-- 字符流操作

Java 文件操作 和 IO&#xff08;4&#xff09;-- Java文件内容操作&#xff08;2&#xff09;-- 字符流操作 文章目录 Java 文件操作 和 IO&#xff08;4&#xff09;-- Java文件内容操作&#xff08;2&#xff09;-- 字符流操作观前提醒&#xff1a;1. Java中操作文件的简单介…...

机器学习与深度学习06-决策树02

目录 前文回顾5.决策树中的熵和信息增益6.什么是基尼不纯度7.决策树与回归问题8.随机森林是什么 前文回顾 上一篇文章地址&#xff1a;链接 5.决策树中的熵和信息增益 熵和信息增益是在决策树中用于特征选择的重要概念&#xff0c;它们帮助选择最佳特征进行划分。 熵&#…...

Netty 实战篇:构建简易注册中心,实现服务发现与调用路由

本文将为前面构建的轻量级 RPC 框架添加“服务注册与发现”功能&#xff0c;支持多服务节点动态上线、自动感知与调用路由&#xff0c;为构建真正可扩展的分布式系统打好基础。 一、背景&#xff1a;为什么需要注册中心&#xff1f; 如果每个客户端都硬编码连接某个 IP/端口的…...

微信小程序(uniapp)对接腾讯云IM

UniApp 对接腾讯云 IM&#xff08;即时通讯&#xff09;完整指南 一、项目背景与需求分析 随着社交场景的普及&#xff0c;即时通讯功能已成为移动应用的标配。腾讯云 IM&#xff08;Tencent IM&#xff0c;即 TIM&#xff09;提供稳定可靠的即时通讯服务&#xff0c;支持单聊…...

使用摄像头推流+VLC软件拉流

一、作用 使用摄像头创建rtsp链接&#xff0c;并使用VLC软件拉流显示。 二、步骤 1、安装FFmpeg库 下载地址&#xff1a;https://ffmpeg.org/download.htmlFFmpeg库的下载参考之前的博客&#xff0c;下载Win64版本即可&#xff1a;https://blog.csdn.net/beijixingcd/artic…...

python魔法函数

Python 中的魔法方法&#xff08;Magic Methods&#xff09;&#xff0c;也称为特殊方法&#xff08;Special Methods&#xff09;或双下方法&#xff08;Dunder Methods&#xff09;&#xff0c;是以双下划线 __ 开头和结尾的方法。它们用于定义类的行为&#xff0c;例如运算符…...

XCUITest 是什么

XCUITest&#xff08;全称 Xcode UI Test&#xff09;是苹果官方提供的 iOS/macOS UI 自动化测试框架&#xff0c;集成在 Xcode 开发工具中&#xff0c;专门用于测试 Swift/Objective-C 开发的应用程序。 1. XCUITest 的核心特点 ✅ 官方支持&#xff1a;苹果原生框架&#xf…...

使用k8s服务进行端口代理

创建registry-service.yaml 使用无Selector的Service Endpoints模式 vi registry-service.yaml编辑以下内容 apiVersion: v1 kind: Service metadata:name: registry-service spec:type: NodePortports:- name: httpprotocol: TCPport: 81 # Service内部端口targ…...

灌水论坛系统总体设计文档

一、实验题目 灌水论坛系统 二、实验目的 旨在通过一个相对完整且功能丰富的Web应用实例&#xff0c;全面地实践和巩固Web开发所需的各项核心技术和工程方法&#xff0c;从而提升其综合应用能力和解决实际开发问题的能力。它不仅仅是完成一个软件&#xff0c;更是一个学习、…...

Mac M1编译OpenCV获取libopencv_java490.dylib文件

Window OpenCV下载地址 https://opencv.org/releases/OpenCV源码下载 https://github.com/opencv/opencv/tree/4.9.0 https://github.com/opencv/opencv_contrib/tree/4.9.0OpenCV依赖 brew install libjpeg libpng libtiff cmake3 ant freetype构建open CV cmake -G Ninja…...

使用 Let‘s Encrypt 和 Certbot 为 Cloudflare 托管的域名申请 SSL 证书

一、准备工作 1. 确保域名解析在 Cloudflare 确保你的域名 jessi53.com 和 www.jessi53.com 的 DNS 记录已经正确配置在 Cloudflare 中&#xff0c;并且状态为 Active。 2. 安装 Certbot 在你的服务器上安装 Certbot 和 Cloudflare 插件。以下是基于 Debian/Ubuntu 和 Cent…...

【Python进阶】元编程、并发

目录 🌟 前言🏗️ 技术背景与价值🩹 当前技术痛点🛠️ 解决方案概述👥 目标读者说明🧠 一、技术原理剖析📊 核心架构图解💡 核心作用讲解🔧 关键技术模块说明⚖️ 技术选型对比🛠️ 二、实战演示⚙️ 环境配置要求💻 核心代码实现案例1:元类实现ORM框架…...

网络协议:[0-RTT 认证 ]

1. 为什么要 0-RTT 认证 降低延迟&#xff1a;SOCKS5 在无认证时需要 2 RTT&#xff08;握手&#xff0b;请求&#xff09;&#xff0c;若加用户名/密码又要 3 RTT&#xff1b;0-RTT 通过合并步骤&#xff0c;目标是把握手&#xff0b;认证&#xff0b;请求都压缩到 1 RTT。 IE…...

单例模式的类和静态方法的类的区别和使用场景

单例模式的类和使用静态方法的类在功能上都能提供全局访问的能力&#xff0c;但它们在实现方式、特性和使用场景上存在差异&#xff0c;下面从多个方面进行比较&#xff1a; 1. 实现方式 单例模式的类 单例模式确保一个类只有一个实例&#xff0c;并提供一个全局访问点。通常…...

flowable中流程变量的概念(作用域)

核心概念&#xff1a;流程变量&#xff08;Process Variables&#xff09; 流程变量是 Flowable 工作流引擎中用于存储、传递和共享与业务流程相关的数据的机制。你可以将它们理解为附着在流程实例&#xff08;或执行流、任务&#xff09;上的键值对&#xff08;Key-Value&…...

【基础算法】模拟算法

文章目录 算法简介1. 多项式输出解题思路代码实现 2. 蛇形方阵解题思路代码实现 3. 字符串的展开解题思路代码实现 算法简介 模拟&#xff0c;顾名思义&#xff0c;就是题目让你做什么你就做什么&#xff0c;考察的是将思路转化成代码的代码能力。 这类题一般较为简单&#xf…...