接口的性能優化(從前端、后端、數據庫三個角度分析)

接口的性能優化(前端、后端、數據庫)

主要通過三方面進行優化

  • 前端
  • 后端
  • 數據庫

前端優化

接口拆分

不要搞一個大而全的接口,要區分核心與非核心的接口,不然核心接口就會被非核心接口拖累

或者一個接口中大部分返回都很快,但是被其中某個邏輯拖累,導致整個接口都很慢,這時候就可以把這個慢的邏輯抽出來,單獨做一個接口

什么是核心呢?比如你是視頻或者直播網站,那么你的視頻、直播的內容就是核心,要先調用視頻、直播的接口,保證核心內容能夠正常加載,然后再加載評論、禮物等接口。

當然接口的拆分也不宜過多,因為每次接口的請求與斷開也都會消耗資源。

按需加載

如果你的接口是返回一篇文章,如果文章很長,則不要直接返回全部內容(尤其設計多圖片、視頻),可根據用戶閱讀進度進行逐步加載。

如果是返回列表,則不要全部返回,而要分頁顯示。

及時反饋用戶狀態

有些接口返回較慢,用戶觸發后(比如點擊按鈕),可能無法立即返回結果。

這時候如果等待接口返回結果后再給用戶反饋,那么用戶在等待的過程中就會以為自己的操作沒有生效,這時候不僅用戶體驗不好,同時用戶還可能會重復點擊,造成多次接口訪問,同時也會消耗資源。

為避免這種情況,要求用戶觸發某個動作時,要立刻給用戶一個反饋,比如顯示“加載中,請等待。。”等字樣。

當然前端也可以通過其他方式來限制用戶重復點擊的問題,比如設置過期時間,加鎖等方式

接口并行訪問

如果接口之前沒有依賴關系,可并行訪問,加快訪問速度

靜態資源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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/208605.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/208605.shtml
英文地址,請注明出處:http://en.pswp.cn/news/208605.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

通過rc.local開機自啟執行nohup命令運行Flask,nohup.out中沒有Flask請求響應日志

需求 通過修改/etc/rc.d/rc.local,實現開機自啟Flask服務,CentOS 7.9。rc.local參考鏈接1,參考鏈接2。 問題 在/etc/rc.d/rc.local中添加 /home/python/face_jiance/kaijiziqi.sh 在/home/python/face_jiance/kaijiziqi.sh中寫 nohup /…

數據可視化軟件的興起:背后的驅動力

在當今信息時代,數據變得比以往任何時候都更為重要。數據可視化軟件的廣泛應用成為了一種趨勢。那么,為什么越來越多的人選擇使用數據可視化軟件呢?今天我就以自己的工作經驗為基礎,進行簡單的分析。 數據可視化軟件能將枯燥的數…

react-lazyload 的介紹、安裝、使用。

目錄 基本介紹 安裝 使用 基本使用 詳細屬性 基本介紹 react-lazyload 是一個 React 組件,用于延遲加載(懶加載)頁面上的圖片或其他資源。懶加載是一種優化手段,它允許頁面在初次加載時只加載可視區域內的內容,…

【Harmony】鴻蒙操作系統架構

目錄 導論 第一部分:內核與核心組件 1.1 鴻蒙微內核的設計 1.2 分布式能力的強化 1.3 HarmonyOS的分層架構 1.4 分布式數據管理 第二部分:鴻蒙的核心能力 2.1 華為 ARK Compiler的引入 2.2 分布式圖形界面的實現 2.3 統一的設備驅動框架 2.4 輕…

vue3移動端腳手架(純凈,集成豐富)

概述 一個純凈的移動端框架 ,用到了 Vue3 vuex Vite3 Vant3 sass eslint stylelint htmlhint husky commitlint axios axios-adapter VConsole 自定義全局 loading ,自定義函數式 dialog (api模仿微信小程序)&#x…

增強現實中的真實人/機/環與虛擬人/機/環

在增強現實中,真實人與虛擬人、真實機器與虛擬機器、真實環境與虛擬環境之間有著密切的關系。增強現實技術通過將真實與虛擬相結合,打破了傳統的現實世界與虛擬世界的界限,創造出了一種新的體驗方式。真實人、真實機器和真實環境與其對應的虛…

linux進入emergency mode

問題描述 linux系統進入emergency mode模式 解決方法 查看問題原因 journalctl -xb -p3 使用fsck 不一定是sda2,也可能是其他,我的是/dev/sda6,然后接受所有的option,完畢后重啟電腦 fsck /dev/sda2接受所有的選項&#xff…

Python與ArcGIS系列(十六)重復節點檢測

目錄 0 簡述1 實例需求2 arcpy開發腳本0 簡述 在處理gis線圖層和面圖層數據時,有時候會遇到這種情況:數據存在重復節點或偽重復節點(兩個節點距離極小),往往我們需要對這種數據進行檢測標注或進行修改。本篇將介紹如何利用arcpy及arcgis的工具箱實現這個功能。 1 實例需求…

Webpack技術入門與實踐

1.概念: 本質上, webpack是一個現代JavaScript應用程序的靜態模塊打包器,當webpack處理應用程序時,它會遞歸地構建一個依賴關系圖,其中包含應用程序需要的每個模塊,然后將所有這些模塊打包成一個或多個bund…

【UE 材質】任務目標點效果

效果 步驟 1. 新建一個工程,創建一個Basic關卡 2. 新建一個材質,這里命名為“M_GoalPoint” 打開“M_GoalPoint”,設置混合模式為“半透明”,勾選“雙面” 在材質圖表中添加如下節點 此時預覽效果如下 繼續添加如下節點 此時效果…

無人機巡檢中臺揭秘,無人機管控平臺助力巡查無人機巡檢方案落地

隨著無人機智能巡檢的飛速發展,巡查無人機應用場景也日益多元,無人機巡檢方案被頻繁落地到工業生產及巡檢巡邏業務中。而無人機管控平臺應運而生,成為推動無人機智能巡檢的關鍵工具。那我們一起來看一下無人機管控平臺的作用: 一、…

微信小程序引入Vant Weapp修改樣式不起作用,使用外部樣式類進行覆蓋

一、引入Vant Weapp后樣式問題 在項目中使用第三方組件修改css樣式時,總是出現各種各樣問題,修改的css樣式不起作用,沒有效果,效果不符合預期等。 栗子(引入一個搜索框組件)實現效果: 左側有一個搜索文字背景為藍色,接著跟一個搜索框 wxml <view class"container&q…

【Python】 Python web開發庫大全

庫排序是按照使用人數和文檔的活躍度為參考進行的&#xff0c;建議大家使用排名靠前的框架&#xff0c;因為它們的文檔更齊全&#xff0c;技術積累要更多&#xff0c;社區更繁盛&#xff0c;能得到更好的支持&#xff0c;這樣在遇到自己無法解決的問題&#xff0c;可以更快更高…

數據結構:單鏈表——定義、插入、刪除

1、定義 注&#xff0c;以下都是帶頭節點的單鏈表 typedef struct LNode {ElementType data;struct LNode *next; }LNode,*LinkList;bool InitList(LinkList &L){L (LNode *)malloc(sizeof(LNode));if(LNULL){//內存不足return false;}L->nextNULL;return true; }這里…

Mint Blockchain,一個聚焦在 NFT 領域的 L2 網絡

Mint 是什么&#xff1f; Mint 是一個聚焦在 NFT 領域的創新型 L2 網絡。Mint Blockchain 致力于促進 NFT 資產協議標準的創新和現實商業場景中 NFT 資產的大規模采用。 不管是過去 3 年在以太坊網絡涌現的 NFT&#xff0c;還是當下在比特幣網絡活躍的“銘文” NFT&#xff0c…

通信協議 遠程調用RPC

1.通訊協議 所有的HDFS通訊協議都是建立在TCP/IP協議之上。 客戶端通過一個可配置的TCP端口連接到Namenode&#xff0c;通過ClientProtocol協議與Namenode交 互。而Datanode使用DatanodeProtocol協議與Namenode交互。 一個遠程過程調用(RPC)模型被抽象出來封裝ClientProtoc…

微信小程序引入vant-weapp爬出坑

最新的微信小程序的項目結構跟之前的不一樣&#xff0c;然后&#xff0c;按照vant-weapp上的官方文檔&#xff0c;安裝步驟失敗&#xff0c;提示了各種錯誤。如果你的微信小程序結構跟我的一致&#xff0c;可以采用和我一樣的方案。 微信小程序引入vant-weapp爬出坑 移動pack…

深入淺出:HTTPS單向與雙向認證及證書解析20231208

介紹: 網絡安全的核心之一是了解和實施HTTPS認證。本文將探討HTTPS單向認證和雙向認證的區別&#xff0c;以及SSL證書和CA證書在這些過程中的作用&#xff0c;并通過Nginx配置實例具體說明。 第一部分&#xff1a;HTTPS單向認證 定義及工作原理&#xff1a;HTTPS單向認證是一…

ELK架構監控MySQL慢日志

目錄 一、架構概述 二、安裝部署 三、Filebeat配置 四、Logstash配置 一、架構概述 本文使用將使用filebeat收集mysql日志信息&#xff0c;發送到redis中緩存&#xff0c;由logstash從redis中取出&#xff0c;發送es中存儲&#xff0c;再從kibana中展示。 二、安裝部署 ELK…

做數據分析為何要學統計學(5)——什么問題適合使用t檢驗?

t檢驗&#xff08;Students t test&#xff09;&#xff0c;主要依靠總體正態分布的小樣本&#xff08;例如n < 30&#xff09;對總體均值水平進行差異性判斷。 t檢驗要求樣本不能超過兩組&#xff0c;且每組樣本總體服從正態分布&#xff08;對于三組以上樣本的&#xff0…