一次JAVA接口優化記錄

目錄

  • 一次接口優化記錄
    • 首先考慮,添加緩存
      • 緩存策略
      • 方案一:本地緩存
      • 方案二:Redis緩存
    • 優化結果
      • 原因分析:
      • 原因驗證
    • 接口數據分析
      • 將響應數據返回大小減少
      • compression壓縮配置
      • 完美(代指這里的小系統)

一次接口優化記錄

背景:一個查詢文章的接口,有分頁,一臺二核四G的小服務器。redis也是這臺機子搭的單機Redis.
查詢速度:QPS在1-10之間。響應速度在一秒以上,可以說是極其的慢了。壓力測試直接壓到了100秒以上的響應速度。

在這里插入圖片描述

首先考慮,添加緩存

緩存策略

緩存策略
步驟:
1、http請求過來
2、根據查詢條件,單表走索引查詢結果ID
3、根據結果ID去緩存中查詢數據,返回結果集
4、判斷是否都有緩存,沒有的單獨拎出來去查詢數據庫
5、將數據庫查詢結果添加到緩存中去。
6、將所有結果返回。

方案一:本地緩存

    public static ConcurrentHashMap<Long, SysArticle> cache = new ConcurrentHashMap<>();private ArrayList<SysArticle> getSysArticlesByMapCache(List<Long> longs){List<Long> noHitIdList = new ArrayList<>();ArrayList<SysArticle> list = new ArrayList<>();// 根據Map從中查找IDfor (Long aLong : longs) {if(cache.containsKey(aLong)){list.add(cache.get(aLong));}else{noHitIdList.add(aLong);}}// 沒查詢到的從數據庫中查詢后放入Mapif (noHitIdList != null &&noHitIdList.size() > 0){List<SysArticle> articles = sysArticleService.selectSysArticleByArticleIds(noHitIdList.toArray(new Long[]{}), "");list.addAll(articles);for (SysArticle a : articles){cache.put(a.getArticleId(),a);}}return list;}}

方案二:Redis緩存

    private ArrayList<SysArticle> getSysArticlesByRedisCache(List<Long> longs) {// 文章ID集Set idSet = new HashSet();for (Long aLong : longs) {idSet.add(String.valueOf(aLong));}// 根據ID集查詢redis緩存Map<String, Object> articleMap = RedisUtils.getMultiCacheMapValue(CACHE_KEY, idSet);// 查看是否有沒有緩存的文章,沒有則添加到待查詢列表List<Long> noHitIdList = new ArrayList<>(articleMap.size());for (Long id: longs){if (!articleMap.containsKey(String.valueOf(id))){noHitIdList.add(id);}}ArrayList<SysArticle> list = new ArrayList<>();for (Map.Entry<String, Object> longObjectEntry : articleMap.entrySet()) {list.add((SysArticle) longObjectEntry.getValue());}if(noHitIdList.size() > 0) { // 找出不存在的緩存,添加進去// 根據ID直接查詢文章List<SysArticle> articles = sysArticleService.selectSysArticleByArticleIds(noHitIdList.toArray(new Long[]{}), "");if (articles != null && articles.size() > 0) {// 添加到緩存,并且添加到返回列表中Map<String, SysArticle> collect = new HashMap<>();for (SysArticle a : articles) {collect.put(String.valueOf(a.getArticleId()), a);}RedisUtils.setCacheMap(CACHE_KEY, collect);list.addAll(articles);}}return list;}

優化結果

優化結果不明顯。可以說是一點都沒進步。甚至還退步。
主要還是第三個接口的響應時間過久。
在這里插入圖片描述

原因分析:

1、線程池線程數量不足?
2、JVM空間不夠,頻繁回收?
3、Nginx有限制?
4、Redis性能過差?
5、網絡帶寬過低?

原因驗證

線程池線程數量不足?

擴大線程池數量,發現依舊不變。排除,況且業務并不繁忙,僅是簡單的查詢數據。

JVM空間不夠,頻繁回收?

使用率基本不超過20%,也排除。

Nginx有限制?

直接訪問ip請求,不走nginx,發現速度也沒變化

Redis性能過差?

直接在本機搭建Redis,減少網絡帶寬。況且redis可是能處理過萬的并發。我這才幾百。依舊沒有變化。

網絡帶寬過低?

可其他接口訪問也不低呀,為啥偏偏你就低。

接口數據分析

在這里插入圖片描述

我:突然發現,一個接口返回50多KB。這接口返回的什么呀,這么大,

嗯: 返回了一大段的長文本文子。難怪那么大。

我: 看來也不是非必要數據,去除看看效果。

在這里插入圖片描述

將響應數據返回大小減少

在這里插入圖片描述

這就很舒服了。。。

等等,我覺得這個10kB還能優化。我記得SpringBoot有一個壓縮響應的配置的。再運用看看

compression壓縮配置

server:compression:#是否對響應數據開啟gzip壓縮,默認falseenabled: true#對指定的響應類型進行壓縮,值是數組,用逗號隔開mime-types: text/html,text/xml,text/plain,text/css,text/javascript,application/javascript,application/json,application/xml

開啟壓縮后

在這里插入圖片描述

再來壓測一波

完美(代指這里的小系統)

在這里插入圖片描述
在這里插入圖片描述

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

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

相關文章

CentOS 的常見命令

CentOS 是一種廣泛使用的 Linux 發行版&#xff0c;特別在服務器環境中。本文將詳細介紹 CentOS 中常見的命令&#xff0c;以便幫助用戶在操作系統中有效地進行各種操作。下面介紹一下文件和目錄操作、用戶和權限管理、系統信息查看、軟件包管理以及網絡配置等方面的命令。 一…

應用層協議【HTTP和HTTPS】

1.概念 1.1 協議 協議是指在計算機通信和網絡通信中&#xff0c;為了實現數據交換而建立的一套規則、約定或者標準。它定義了通信雙方之間的通信格式、傳輸方式、數據的含義、錯誤處理等細節&#xff0c;從而確保通信的可靠性、有效性和安全性。 >1在計算機網絡中&#x…

Python簡易圖書管理系統重構

在本篇課文中&#xff0c;我們將使用Python語言結合MySQL數據庫&#xff0c;從零開始構建一個簡單的圖書管理系統。該系統旨在幫助圖書館管理員輕松管理圖書的借閱、歸還以及查詢圖書信息等日常操作。我們將分步介紹需求分析、數據庫設計、環境搭建、功能實現等關鍵環節&#x…

注冊講堂 | 體外診斷試劑分類目錄的變化

5月11日&#xff0c;千呼萬喚的《體外診斷試劑分類目錄》&#xff08;2024年第58號&#xff09;終于發布&#xff01; 前世今生 2013年&#xff1a;《6840 體外診斷試劑分類子目錄&#xff08;2013版&#xff09;》&#xff08;以下簡稱2013版目錄&#xff09; 2017年&#xff…

蘋果永久版安裝PD虛擬機:Parallels Desktop 19 一鍵激活版

Parallels Desktop 19是一款功能強大的虛擬機軟件&#xff0c;專為Mac用戶設計&#xff0c;允許用戶在同一臺Mac電腦上同時運行Windows、Linux等多個操作系統&#xff0c;而無需額外的硬件設備。 下載地址&#xff1a;https://www.macz.com/mac/9581.html?idOTI2NjQ5Jl8mMjcuM…

Kubernetes入門:核心概念

集群架構與組件 一個kubernetes集群主要是由控制節點(master)、工作節點(node)構成&#xff0c;每個節點上都會安裝不同的組件。 master&#xff1a;集群的控制平面&#xff0c;負責集群的決策 ( 管理 ) api-server : 資源操作的唯一入口&#xff0c;接收用戶輸入的命令&…

vue3 項目中 前端實現下載模板 csv文件

做項目時遇到讓前端實現模板下載功能&#xff0c;第一次碰到這種需求&#xff0c;記錄一下。 下載csv 模板&#xff1a; <el-button type"primary" click"download(data/CSVXX.csv)">下載模板</el-button> const download (url) > {con…

文本控件Text Control示例: 將圖像插入 TX 的各種方法

TX Text Control 是一款功能類似于 MS Word 的文字處理控件&#xff0c;包括文檔創建、編輯、打印、郵件合并、格式轉換、拆分合并、導入導出、批量生成等功能。廣泛應用于企業文檔管理&#xff0c;網站內容發布&#xff0c;電子病歷中病案模板創建、病歷書寫、修改歷史、連續打…

在Linux上面部署ELK

注明&#xff1a;一下的軟件需要自己準備 一、準備環境&#xff1a; 1.兩臺elasticsearch主機4G內存 2.兩臺elasticsearch配置主機名node1和node2(可以省略) #vim /etc/hostname #reboot 3. 兩臺elasticsearch配置hosts文件 #vim /etc/hosts 192.168.1.1 node1 192…

RTMP低延遲推流

人總是需要壓力才能進步, 最近有個項目, 需要我在RK3568上, 推流到公網, 最大程度的降低延遲. 廢話不多說, 先直接看效果: 數據經過WiFi發送到Inenter的SRS服務器, 再通過網頁拉流的. 因為是打金任務, 所以逼了自己一把, 把RTMP推流好好捋一遍. 先說說任務目標, 首先是MPP編碼…

【Altium】AD-檢查原理圖中元器件未連接的Passive Pin

1、 文檔目標 如何讓原理圖編譯時找出元器件上未連接的Passive Pin 2、 問題場景 當引腳屬性&#xff08;Pin type&#xff09;為passive時&#xff0c;原理圖編譯的默認規則是不會去檢查它們是否有連接的。在實際設計過程中&#xff0c;經常會有導線虛連&#xff0c;漏連的事…

醫療傳感器種類不斷增多 市場規模逐漸擴大

醫療傳感器種類不斷增多 市場規模逐漸擴大 醫療傳感器是將人體的生理信息轉換為電信息的變換裝置。醫療傳感器具有高靈敏度、高精度、實時監測等優點&#xff0c;可以檢測佩戴者的心率、呼吸頻率、活動量等&#xff0c;從而更加準確地了解身體情況。   經過多年發展&#…

【極簡】docker常用操作

鏡像images是靜態的 容器container是動態的&#xff0c;是基于鏡像的&#xff0c;類似于一個進程。 查看docker images&#xff1a; docker images 或者docker image ls 查看docker container情況&#xff1a;docker ps -a&#xff0c;-a意思是--all 運行一個container: doc…

MySQL not in不等于找不到null的數據

在使用MySQL的NOT IN語句時&#xff0c;如果找不到NULL值&#xff0c;可能是因為NULL值在比較中具有特殊性質。NULL值不等于任何其他值&#xff0c;包括它自己。因此&#xff0c;使用NOT IN語句時&#xff0c;如果列表中包含NULL值&#xff0c;則查詢不會返回任何結果。 解決此…

有意思的數組

var nums [1,2,3,6] const nums1 [6, 8, 7, 10, 9];/* 數組合并————push */ var n nums.push(...nums1); // 將列表 nums1 拼接到 nums 之后 n //n會是nums的長度 > 9 nums //也push了 > (9) [1, 2, 3, 6, 6, 8, 7, 10, 9]/* 數組合并————concat*/ var arr0…

數字水印 | 奇異值分解 SVD 的 Python 代碼實現

&#x1f951;原理&#xff1a;數字水印 | 奇異值分解 SVD 的定義、原理及性質 &#x1f951;參考&#xff1a;Python 機器學習筆記&#xff1a;奇異值分解&#xff08;SVD&#xff09;算法 正文 對于一個圖像矩陣&#xff0c;我們總可以將其分解為以下形式&#xff1a; 通過…

使用API有效率地管理Dynadot域名,默認將域名隱形轉發至其他界面

關于Dynadot Dynadot是通過ICANN認證的域名注冊商&#xff0c;自2002年成立以來&#xff0c;服務于全球108個國家和地區的客戶&#xff0c;為數以萬計的客戶提供簡潔&#xff0c;優惠&#xff0c;安全的域名注冊以及管理服務。 Dynadot平臺操作教程索引&#xff08;包括域名郵…

英譯漢早操練-(十九)

hello,are you OK? 生活如此美好&#xff0c;周四了&#xff0c;你還好嗎&#xff1f;堅持了快一周了&#xff0c;是不是最后沖刺一把就開啟周末的美好生活了。 今天我們學習這篇經濟學人文章&#xff1a; 題目是&#xff1a;Banks, at least, are making money from a turbul…

【大模型微調】一文掌握7種大模型微調的方法

本篇文章深入分析了大型模型微調的基本理念和多樣化技術&#xff0c;細致介紹了LoRA、適配器調整(Adapter Tuning)、前綴調整(Prefix Tuning)等多個微調方法。詳細討論了每一種策略的基本原則、主要優點以及適宜應用場景&#xff0c;使得讀者可以依據特定的應用要求和計算資源限…