广州做网站哪家公司好/关键词搜索工具好站网
接口的性能优化(前端、后端、数据库)
主要通过三方面进行优化
- 前端
- 后端
- 数据库
前端优化
接口拆分
不要搞一个大而全的接口,要区分核心与非核心的接口,不然核心接口就会被非核心接口拖累
或者一个接口中大部分返回都很快,但是被其中某个逻辑拖累,导致整个接口都很慢,这时候就可以把这个慢的逻辑抽出来,单独做一个接口
什么是核心呢?比如你是视频或者直播网站,那么你的视频、直播的内容就是核心,要先调用视频、直播的接口,保证核心内容能够正常加载,然后再加载评论、礼物等接口。
当然接口的拆分也不宜过多,因为每次接口的请求与断开也都会消耗资源。
按需加载
如果你的接口是返回一篇文章,如果文章很长,则不要直接返回全部内容(尤其设计多图片、视频),可根据用户阅读进度进行逐步加载。
如果是返回列表,则不要全部返回,而要分页显示。
及时反馈用户状态
有些接口返回较慢,用户触发后(比如点击按钮),可能无法立即返回结果。
这时候如果等待接口返回结果后再给用户反馈,那么用户在等待的过程中就会以为自己的操作没有生效,这时候不仅用户体验不好,同时用户还可能会重复点击,造成多次接口访问,同时也会消耗资源。
为避免这种情况,要求用户触发某个动作时,要立刻给用户一个反馈,比如显示“加载中,请等待。。”等字样。
当然前端也可以通过其他方式来限制用户重复点击的问题,比如设置过期时间,加锁等方式
接口并行访问
如果接口之前没有依赖关系,可并行访问,加快访问速度
静态资源CDN
静态资源包括图片、视频等媒体问题,同时也包括js、css、html等一些文本文件。相同的是这些文件都是静态,也就是短期内不会变化的问题。
这些文件就非常适合通过CDN进行加速分发
静态资源缓存
与上述原因相同,因为是静态资源,所以也可以缓存在本地
后端优化
限流、熔断与降级
限流是针对服务请求数量的一种自我保护机制,当请求数量超出服务的处理能力时,会自动丢弃新来的请求。
熔断这一概念来源于电子工程中的断路器(Circuit Breaker)。在互联网系统中,当下游服务因访问压力过大而响应变慢或失败,上游服务为了保护系统整体的可用性,可以暂时切断对下游服务的调用。
降级是将某些不重要的业务关闭,保证核心功能可用。降级的思想是丢车保帅。
防止重复点击
防止多次重复点击,每次接口调用,都会消耗后端资源。
可通过加锁的方式实现
使用多线程
涉及多个对象的操作,尤其是列表循环的操作,可以引入多线程,把之前的串行操作改为并行,大大提高效率
如果涉及到多个线程之前的等待,可是使用CountDownLatch、CyclicBarrier和Semaphore,可参考https://blog.csdn.net/CrankZ/article/details/83781380
异步
一些与主流程不相关的或者耗时较长的处理,可以改为异步,比如发送短信、邮件等
异步的方式有很多种,比如直接新建线程
或者引入第三方MQ
等
缓存
根据我的经验,IO操作(包括与数据库的交互和网络接口的交互)都是占用耗时的大头。所以如果能适当针对这些IO操作加上缓存,将会大大的提高性能。
缓存主要分2类,本地缓存(Caffeine为代表)、远程缓存(Redis为代表),可针对不同的场景进行使用。
当然也可以结合两者,组成二级缓存,这里可以使用阿里开源的组件 https://github.com/alibaba/jetcache
缓存相关内容可参考我的另一篇文章 https://blog.csdn.net/CrankZ/article/details/80537115
本地缓存可参考我的另一篇文章 https://blog.csdn.net/CrankZ/article/details/90344348
数据库连接池
数据库的每次连接与关闭,都会消耗资源,如果每次都这样重新建立并销毁连接,这样会性能低下。
所以数据库连接池的建立多个数据库连接,并将这些连接组成一个连接池,由应用程序动态地对池中的连接进行申请、使用和释放。
数据库连接池可参考 https://blog.csdn.net/CrankZ/article/details/82874158
JVM优化
启动的内存大小、选择合适GC等
组件升级
升级底层组件,比如升级到Java21,在Java21中可以启用虚拟线程、使用新增的GC等
数据库优化
数据库选择
首先要针对不同的数据,选择合适的数据库
常规关系型数据除了常见的MySQL,还可以选择PostgreSQL,TiDB等
非关系型数据,比如大文本,JSON等,可以考虑MongoDB
如果涉及搜索的,可以使用Elasticsearch或者ClickHouse等
图数据库,比选择Neo4j等
下面以MySQL为代表,讲一些关系型数据库的优化
读写分离
增加从节点,从节点专注读请求,主节点专注处理写请求。
主库与从库的结构完全一样,一个主库可以有多个从库
可参考我另一篇文章 https://blog.csdn.net/CrankZ/article/details/84679742
分库分表
当单库单表无法满足需求时,可考虑分库分表。
这里不做赘述,可参考我另一篇文章 https://blog.csdn.net/CrankZ/article/details/84679742
归档历史数据,降低单表规模
MySQL并不适合存储大数据量,如果不对数据进行归档,数据库会持续膨胀,从而降低查询和写入的性能。为了满足大数据量的读写需求,需要定期对数据库进行归档。
在进行数据库设计时,需要事先考虑到对数据归档的需求。
如果有需要,可以考虑专门的数据仓库Hive或者HBase等
索引优化
避免索引失效
,尽量保证每次查询都命中索引
可参考我另一篇文章 https://blog.csdn.net/CrankZ/article/details/80468760
参考
https://juejin.cn/post/7287420810318299190
相关文章:

接口的性能优化(从前端、后端、数据库三个角度分析)
接口的性能优化(前端、后端、数据库) 主要通过三方面进行优化 前端后端数据库 前端优化 接口拆分 不要搞一个大而全的接口,要区分核心与非核心的接口,不然核心接口就会被非核心接口拖累 或者一个接口中大部分返回都很快&…...

区块链扩容问题研究【06】
1.Plasma:Plasma 是一种基于以太坊区块链的 Layer2 扩容方案,它通过建立一个分层结构的区块链网络,将大量的交易放到子链上进行处理,从而提高了以太坊的吞吐量。Plasma 还可以通过智能合约实现跨链交易,使得不同的区块…...

英语论文写作常用词汇积累
baseline:比较算法好坏中作为“参照物”而存在,在比较中作为基线;目的是比较提出算法的性能或者用以彰显所提出的算法的优势; benchmark:评价算法好坏的一种规则和标准。是目前的模型能做到的比较好的效果;…...

redis集群(cluster)笔记
1. 定义: 由于数据量过大,单个Master复制集难以承担,因此需要对多个复制集进行集群,形成水平扩展每个复制集只负责存储整个数据集的一部分,这就是Redis的集群,其作用是提供在多个Redis节点间共享数据的程序…...

css 元素前后添加图标(::before 和 ::after 的妙用)
<template><div class"container"><div class"label">猜你喜欢</div></div> </template><style lang"scss" scoped> .label {display: flex;&::before,&::after {content: "";widt…...

C++ 设计模式 Forward Declaration Pimpl
放几轮跟 chatgpt 的对话,很精彩的回答 You 我有个问题,我的 main 目标依赖 src/gcp_subscriber.h 的 GCPSubscriber class 这个 class 有个 private 成员 google::cloud::pubsub::Subscriber 也就意味着我得在 gcp_subscriber.h 里面引用 google clou…...

【uniapp】小程序开发8:滚动组件scroll-view
我们经常需要做页面中部分内容可以滚动的功能,例如“猜你喜欢”,内容太多,通常都会超出屏幕,那么此块区域应该可以滚动,但是顶部的自定义导航栏应该不能随着滚动。 这个时候,就可以使用uniapp提供的滚动组件…...

Java王者荣耀火柴人
主要功能 键盘W,A,S,D键:控制玩家上下左右移动。按钮一:控制英雄发射一个矩形攻击红方小兵。按钮控制英雄发射魅惑技能,伤害小兵并让小兵停止移动。技能三:攻击多个敌人并让小兵停止移动。普攻:对小兵造成基础伤害。小…...

1.鸿蒙应用程序开发app_hap开发环境搭建
1.下载Node.js, Javascipts的运行环境 node.js版本下载v12.18.3/https://www.cnblogs.com/txwtech/p/17865780.html 2.下载并安装DevEco Studio DevEco Studio 3.1 DevEco Studio 3.1配套支持HarmonyOS 3.1版本及以上的应用及服务开发,提供了代码智能编辑、低代…...

JDK多版本集成 Jacoco 配置指南
JDK多版本集成 Jacoco 配置指南 本篇相关 JDK 版本配置如下: JDK8 JDK11 JDK17 Jacoco 是什么 Jacoco 是一个用于Java程序的代码覆盖率报告工具。它通过动态分析(在代码执行时收集数据)来生成代码覆盖率报告文件。Jacoco 支持多种覆盖率标…...

容器及容器调度(云)
在云计算中,容器是一种轻量级、可执行的软件包,它包含应用程序及其全部依赖项,包括库、二进制文件、配置文件等。容器与虚拟机不同,因为它们不需要包含完整的操作系统;相反,所有容器都共享主机操作系统的内…...

实验七 子网的划分
实验七 子网的划分 实验目的掌握划分子网的方法实验内容划分给定IP地址的子网将划分后的子网应用到网络环境中实验要求每位同学从下表中至少选择一行进行子网划分,并填写所选择行的剩余部分。(注意:子网号全0的不用)标准IP地址 要求划 分子网数 借用的主机位数 子网掩码 第…...

Proteus仿真--射击小游戏仿真设计
本文介绍基于proteus射击小游戏仿真设计(完整仿真源文件及代码见文末链接) 仿真图如下 K1-K4为4个按键,用于上移、下移、确认等,模拟单机游戏 仿真运行视频 Proteus仿真--射击小游戏仿真设计 附完整Proteus仿真资料代码资料 …...

docker的资源控制:
docker的资源控制: 对容器的使用宿主机的资源进行限制 cpu 内存 磁盘i/0 docker使用linux自带的功能cgroup control grouos是linux内核系统提供的一种可以限制,记录,隔离进程所使用的物理资源 control grouos是linux内核系统提供的一种可…...

Leo赠书活动-13期 【以企业架构为中心的SABOE数字化转型五环法】文末送书
Leo赠书活动-13期 【以企业架构为中心的SABOE数字化转型五环法】文末送书 ✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客…...

【人工智能 | 知识表示方法】状态空间法 语义网络,良好的知识表示是解题的关键!(笔记总结系列)
🤵♂️ 个人主页: AI_magician 📡主页地址: 作者简介:CSDN内容合伙人,全栈领域优质创作者。 👨💻景愿:旨在于能和更多的热爱计算机的伙伴一起成长!!&…...

华清远见嵌入式学习——QT——作业1
作业要求: 代码: ①:头文件 #ifndef LOGIN_H #define LOGIN_H#include <QWidget> #include <QLineEdit> //行编辑器类 #include <QPushButton> //按钮类 #include <QLabel> //标签类 #include <QM…...

MYSQL练习创建存储函数和存储过程
创建数据表,信息如下: 表结构: 字段名 数据类型 主键 外键 非空 唯一 自增 id INT 是 否 是 是 否 name VARCHAR(50) 否 否 是 否 否 glass VARCHAR(50) 否 否 是 否…...

Java基础语法面试题
数据类型 Java有哪些数据类型 定义:Java语言是强类型语言,对于每一种数据都定义了明确的具体的数据类 型,在内存中分配了不同大小的内存空间。 分类: 基本数据类型 数值型 整数类型(byte,short,int,long) 浮点类型(float,dou…...

结合ColorUI组件开发微信小程序
1.自定义组件生命周期函数: Component({data: {},attached() {console.log("自定义组件生命周期函数 attached--先执行");this.getPos();},ready() {console.log("ready生命周期函数---在attached之后执行")},methods: {getPos() {var that th…...

如何搭建废品上门回收小程序
如今,随着环境保护意识的增强,废品的回收和再利用变得越来越重要。为了方便人们进行废品回收,搭建一个废品上门回收的小程序成为了一个不错的选择。本文将介绍如何从零开始搭建一个废品上门回收小程序。 …...

蓝牙配对、连接和删除汇总
目的:处理PC连接蓝牙设备的配对、连接和删除操作,以及常见故障。 命令行配对蓝牙设备并连接 要求:配对BLUET043蓝牙,密码为4444,然后连接该蓝牙。操作步骤如下: Step1.下载 修复工具,然后安装…...

Linux网络——高级IO
目录 一.五种IO模型 1.阻塞式IO 2.非阻塞式IO 3.信号驱动IO 4.多路转接IO: 5.异步IO 二.同步通信 vs 异步通信 三.设置非阻塞IO 1.阻塞 vs 非阻塞 2.非阻塞IO 3.实现函数SetNoBlock 四.I/O多路转接之select 1.初识select 2.select函数原型 3.socket就绪…...

Java注解详解
概述 注解是对程序代码进行标注和解释的一种方式。在Java中,注解提供了一种元数据形式,能够在程序中嵌入有关程序的信息,以便进行进一步的处理。注解通过使用符号来声明,如Override、Deprecated等。 注解和注释的区别 注释&…...

Android wifi 框架以及Enable流程
Android P相比于Android O的变化 多了WifiStateMachinePrime(状态机的前处理机制),wifiService的相关cmd 不再是直接send 给WifiStateMachine,而是被送到WifiStateMachinePrime先进行处理后,再送往WifiStateMachine也…...

十五、机器学习进阶知识:K-Means聚类算法
文章目录 1、聚类概述2、K-Means聚类算法原理3、K-Means聚类实现3.1 基于SKlearn实现K-Means聚类3.2 自编写方式实现K-Means聚类 4、算法不足与解决思路4.1 存在的问题4.2 常见K值确定方法4.3 算法评估优化思路 1、聚类概述 聚类(Clustering)是指将不同…...

软件崩溃时Visual Studio中看不到有效的调用堆栈,使用Windbg动态调试去分析定位
目录 1、问题说明 2、使用Windbg查看崩溃时详细的函数调用堆栈...

搭乘“低代码”快车,引领食品行业数字化转型全新升级
数字化技术作为重塑传统行业重要的力量,正以不可逆转的趋势改变着企业经营与客户消费的方式。 在近些年的企业数字化服务与交流过程中,织信团队切实感受到大多数企业经营者们从怀疑到犹豫再到焦虑最终转为坚定的态度转变。 在这场数字化转型的竞赛中&a…...

Axure->Axure安装,Axure菜单栏和工具栏功能介绍,页面及概要区
Axure安装Axure菜单栏和工具栏功能介绍,页面及概要区 1.Axure安装 即时设计 - 可实时协作的专业 UI 设计工具 (js.design) 点击上方下载安装⬆ 打开软件点击帮助->管理授权-> 被授权人 Axure 授权密钥:gjqpIxSSUUqFwPoZPi8XwBBhRE2VNmOQsrord0JqShk4QCXxrw6…...

【BUG】微信小程序image不会随着url动态变化
问题描述: 第一次打开界面,显示的是默认头像而不是用户头像,似乎image里面的src只要第一次有值就不会再更新了 解决 不要给src里面的变量设置初始值,而是直接赋空值...