国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

我用兩個方法就將接口響應時間從2s優化到了100ms

開發 數據庫
在本文中,我們深入探討了接口性能優化的多種策略,從技術細節到實踐應用,講解了接口優化的j九種方式。

一、背景

事情的背景就是產品初期,需求急、周期短,同事在完成該需求時以結果導向為主,先實現需求。

就在最近,測試時發現該接口的響應為 2s 多,頁面中可以感覺到明顯的延遲,所以有了本文,提升一下接口響應速度。

在工作中一定要有產品思維,站在用戶的角度,怎么做才能更好。只有當自己站在一個更高的層面,才不會讓你受制于當下,并助你突破現狀。

先說一下目前的代碼邏輯,概括一下就是最外層一個循環,然后循環里面查詢數據庫,而且是一次循環最少 4 次數據庫查詢。

  • 根據查詢條件獲取一個總的 list。
  • 遍歷該 list,讀取每個對象中的屬性值。
  • 根據每個對象屬性值再去數據庫中獲取該子對象。
  • 封裝返回數據。

上述代碼是根據實際業務改造的,實際業務還是個嵌套的循環,就拿上圖中的代碼為例,如果讓你來優化,你想選擇哪些優化方式呢?歡迎評論區交流一下。

二、接口優化

先說下我對于接口提升響應速度解決思路吧。首先想到的是定位代碼哪個位置慢,其次慢的原因是什么,最后選擇合適的方案解決問題。

  • 使用 Arthas 定位代碼處理慢的點。
  • 選擇適合的優化方案。
  • 測試優化結果。

對于 Arthas 不了解的可以自己擴展學一下,這里不做過多介紹,只說一句,這是個在線解決生產問題的 Java 診斷工具。

1.定位

對于這個 test 方法我是這樣做的,Idea 中有個 Arthas 插件,所以我們直接在 Idea 中復制對應的命令,粘貼到 Arthas 中進行監控,此處使用的是 trace 命令。

test 方法名位置,右鍵選擇 Arthas Command 中的 Trace 或者 Trace Multiple Class Method Trace -E 命令進行復制。

將該命令粘貼到 Arthas 的終端之后,發起對該接口的請求,即可看到每一行代碼花費的時間,此處我拿一個其他接口來做示例,參考如下:

在這個圖片中,我們重點關注紅框起來的位置,此處打印了該處代碼處理時間的占比,占比越高處理時長越長。所以我們只需要關注一下大頭,也就是占比多的代碼位置進行優化,該接口的響應速度肯定可以提升。

上圖中代碼位置已經脫密處理,在實際的接口調用棧打印中,每一行輸出的末尾都會有代碼所在行數。

2.分析

通過上圖中使用 Arthas 工具的定位,已經知道了方法中哪一塊是處理比較慢的,現在只需要梳理業務邏輯,進行優化即可了。

就以文章開頭的 test 方法舉例,我的優化方案如下:

  • 循環遍歷時多次查詢數據庫進行合并,盡量減少數據庫鏈接查詢次數,調用數據庫查詢代碼移動到循環外。
  • 根據遍歷的對象屬性獲取數據庫中對應信息時,改為 in 查詢,多條 SQL 合并為一條 SQL。
  • 根據查詢 SQL 中使用的參數,創建對應的索引,并確保索引生效。

所以簡單概括優化方案就是:使用 IN 查詢、避免循環查詢數據庫、增加索引三種方式。

修改之后的代碼結構如下:

  • 根據查詢條件獲取基礎對象。
  • 取出 list 中某一個值例如 aid,生成新 list,當作下一次查詢的查詢條件。
  • 封裝對應數據。

最后就是根據查詢條件增加索引,這個本文就不再詳細說明了。

3.小結

通過使用 In 查詢,減少循環中調用數據庫,創建索引等手段,再次請求同一個接口,實現了 2s 到 100ms 的優化。其中索引加入之后,速度快了一倍達到 1s 左右,再通過業務邏輯重構最終實現 100ms 的接口響應速度。

留個討論題,上面優化完成的代碼再讓你進行優化,你還可以在哪些方面進行優化呢,或者說上面代碼可能會留下哪些坑呢?

三、接口常用優化方式

上述的優化方式可以總結為加索引,業務代碼重構兩個方式。其中減少循環調用數據庫是業務代碼重構的內容之一。

數據庫層面,加索引需要注意的是索引是否生效,是否選錯索引等,如果你對 SQL 優化感興趣,點個關注,后續更新一篇 SQL 優化的小技巧。

除了加索引,當數據量起來之后,常用的優化方式還有分庫分表、數據異構、緩存。

1.分庫分表

當系統發展到一定程度之后,用戶的并發量大,會帶來大量的數據庫請求,占用大量的數據庫連接,同時會帶來磁盤IO等方面的問題。

并且隨著系統的長時間使用,產生的數據越來越多,造成單表數據量過大,最終造成查詢緩慢,即使加了索引查詢速度也非常耗時,此時我們就可以使用分庫分表的方式進行數據庫層的優化。

分庫分表大部分同學應該都聽過了,這里大概介紹一下。(點個關注,后續深入分析一下分庫分表)

  • 分庫分表有水平與垂直之分,垂直就是業務方向的拆分,水平就是數據方向。
  • 分庫解決的是數據庫連接資源不足的問題。
  • 分表解決的是單表數據量過大,SQL 語句即使走了索引查詢也非常耗時的問題。
  • 在某些業務場景中,用戶并發量大,但是保存的數據量很少時,可以只分庫,不分表。
  • 用戶并發量不大,但是保存的數據量很多,可以只分表,不分庫。
  • 當用戶并發量大,數據量也很多時,可以考慮分庫分表。

圖中將用戶庫分為3個,在請求到來的時候,可以根據用戶ID進行路由到某一個庫,然后再定位到某張表。路由規則是可以自己定義的。

2.數據異構

數據異構相當于數據進行冗余,在業務接口中,一般返回前端的數據是需要進行多個數據進行封裝的。舉個例子,用戶信息返回,在返回時封裝用戶的部門信息,角色信息一起返回。

現在我們在封裝好上述數據之后,存入 Redis中,只需要讀取一次Redis即可。

3.緩存

緩存相當于把當前請求的響應結果進行緩存,再次讀取時只需要讀取緩存,無需復雜的業務邏輯。比如菜單樹這種數據。

不管是數據異構還是加緩存,都有可能產生數據不一致問題,而MySQL 與Redis如何保持數據一致可以參考之前寫的這篇MySQL與Redis緩存一致性的實現與挑戰。

除了上述的數據方面進行優化外,還可以對代碼進行業務邏輯的重構,或者說是在代碼層面進行優化。常用的方式有異步、避免大事務、減小鎖粒度等。

4.異步

異步的方式有很多,使用@Async注解,線程池或者MQ都可以實現異步。我們關注的重點是哪些業務可以使用異步處理,在業務邏輯處理中,保留核心業務邏輯,非核心業務邏輯異步處理。

在上面這個接口邏輯中,可以發現除了核心業務外,遠程調用,記錄日志都可以放入到異步線程中執行,這樣就無需主線程等待。不過對于遠程調用有的需要返回結果,核心業務需要返回結果支持的另說,這些細節需要好好設計一番了。

5.避免大事務

在使用 @Transaction 注解時,需要注意避免在類上使用該注解,在方法上使用該注解時也要注意方法邏輯不要過于復雜。

大事務可能引發問題如下:

  • 死鎖。
  • 接口超時。
  • 并發情況下數據庫連接池資源耗盡。
  • 回滾時間長。

為了避免大事務的產生,在開發時可以注意以下幾點。

  • select 查詢方法拿到事務外。
  • 避免在事務中進行遠程調用。
  • 事務中避免一次處理太多數據,可以拆分為多個小事務。
  • 個別功能可以異步處理或者非事務運行。

6.減小鎖粒度

有的場景中,需要進行加鎖操作,防止多線程并發修改,造成數據異常。

但是鎖要是加的不好,還不如不加,如果鎖的粒度太粗,非常影響接口性能。

(1) synchronized

Java 中的關鍵字加鎖,可以寫在方法上或者代碼塊上,舉個例子講一下如何減小鎖粒度。

public synchronized saveFile(String filePath) {
    mkdir(filePath);
    uploadFile(filePath);
    saveMessage(filePath);
}

這里加鎖是為了防止多次觸發創建文件報錯,影響業務。

上傳文件的操作中,隨著文件越來越大,耗費的時間也越長。(此處分片上傳不考慮)

這三個過程放入一個方法中,當前鎖定的就是這三個操作。

所以我們修改一下代碼。

public void saveFile(String filePath) {
    synchronized(this) {
      if(!exists(filePath)) {
          mkdir(filePath);
       }
    }
    uploadFile(filePath);
    saveMessage(filePath);
}

修改之后鎖定范圍僅限于創建文件夾,對于上傳文件這種耗時的操作將不再持有鎖,提升接口性能。

(2) Redis 分布式鎖

使用 Redis 實現分布式鎖與 Synchronized 類似,在編寫代碼時盡量控制鎖的范圍,鎖的粒度越小越好。

Redis 實現分布式鎖雖說好用,但是還有8個坑,如果你還不知道可以看下之前寫的這篇文章。

Redis 實現分布式鎖的8大坑

(3) 數據庫鎖

MySQL 為例,鎖有表鎖、行鎖之分,這里主要說這兩種鎖。

表鎖:加鎖快,鎖的粒度最大,發生沖突的概率最高,并發度最低。

行鎖:加鎖慢,會出現死鎖現象,但是鎖的粒度小,發生鎖沖突的概率低,并發度也是最高的。

所以在數據庫鎖的優化方向上,優先行鎖,其次表鎖。

有的同學可能會說還有間隙鎖等等,那些本文就不再多說了,大部分場景下使用行鎖,盡量不使用表鎖即可。

四、總結

在本文中,我們深入探討了接口性能優化的多種策略,從技術細節到實踐應用,講解了接口優化的9種方式:

  1. 加索引。
  2. 禁止嵌套for循環。
  3. 分庫分表。
  4. 數據異構。
  5. 緩存。
  6. 異步。
  7. 避免大事務。
  8. 減小鎖粒度。
  9. 優化SQL。

通過這些優化措施,我們可以顯著提高接口的響應速度和系統的整體性能,為用戶提供更流暢的體驗。

責任編輯:趙寧寧 來源: 醉魚Java
相關推薦

2024-10-28 07:00:00

分頁查詢優化索引數據歸檔

2024-06-04 10:37:06

2024-11-29 07:42:47

2022-09-20 10:41:32

接口優化網絡

2024-06-13 09:17:41

2023-05-14 17:16:22

分類樹SpringBoot

2024-09-29 08:21:06

2020-09-01 11:10:39

數據庫鏈接池HikariCP

2019-01-02 09:10:56

2023-12-25 08:24:03

雙異步數據庫Excel

2020-08-06 11:25:29

數據庫鏈接池線程

2024-06-05 11:23:14

2025-11-04 01:45:00

2025-01-15 00:00:10

2020-07-21 08:18:16

響應測試系統

2022-06-30 19:40:36

查詢接口索引優化

2025-11-27 01:45:00

2022-08-14 14:32:06

接口優化

2025-12-12 02:00:00

OpenFeign網絡TCP

2024-04-29 08:00:00

MongoDB索引
點贊
收藏

51CTO技術棧公眾號

欧美日韩一级片在线观看| 久久久久久精| a级大胆欧美人体大胆666| 国产精品久久久久久久久久久免费看 | 久久99精品国产99久久6尤物| 国产偷倩在线播放| 欧美日韩一区二区在线观看| 中文在线二区| 午夜日韩在线观看| 无限国产资源| 亚洲精品日日夜夜| 激情小说激情视频| 国产精品乱码一区二三区小蝌蚪| 欧美女人性生活视频| 成人免费观看av| 一区一区视频| 久久久久99| 欧美日本韩国在线| 日产欧产美韩系列久久99| 日韩久久久久久久久久久久久| 亚洲一区日韩在线| 天堂精品视频| 久久精品国产网站| 国产日韩第一页| 国产成人福利片| 九色在线视频观看| 欧美国产97人人爽人人喊| 九色丨porny丨| 亚洲va在线va天堂| 青梅竹马是消防员在线| 欧美性videosxxxxx| 在线毛片网站| 日韩av一卡二卡| 永久免费观看精品视频| 91高清视频在线免费观看| 欧美女王vk| 亚洲综合av影视| 日韩制服丝袜先锋影音| 激情六月天婷婷| 中文在线资源观看网站视频免费不卡| av电影免费| 欧美性色综合网| 大桥未久在线视频| 欧美日韩xxx| 9191国语精品高清在线| 亚洲国产激情一区二区三区| aaa欧美色吧激情视频| 三级a三级三级三级a十八发禁止| 亚洲高清免费在线| 国产蜜臀av在线播放| 欧美刺激性大交免费视频| 成人综合久久| 一区二区精品在线观看| 久久久久久久久久美女| 亚亚洲欧洲精品| 欧美变态tickle挠乳网站| 亚洲国产另类 国产精品国产免费| 色婷婷综合久久久中字幕精品久久 | 亚洲xxxxxx| 亚洲国产小视频| 一区二区三区亚洲变态调教大结局| 97婷婷大伊香蕉精品视频| 66视频精品| 在线视频不卡一区二区| 国产精品国产三级国产| 无遮挡的视频在线观看 | 黄色在线看片| 久久久午夜视频| 亚洲黄色视屏| 久久精品99国产| 欧美写真视频网站| 国产精品亚洲综合在线观看| 2014亚洲精品| 91理论电影在线观看| 久久久久久久影视| 久久九九国产精品怡红院| 国产精品av一区二区| 欧美日韩国产精品激情在线播放| 色欧美片视频在线观看| 97精品资源在线观看| 黑人巨大精品欧美一区二区小视频| 成人国产精品视频| 免费在线观看av| 羞羞色国产精品| 美腿丝袜亚洲综合| 一级毛片在线视频| 欧美成人全部免费| 青青草97国产精品免费观看 | 国产婷婷视频在线| 国产+人+亚洲| 经典一区二区三区| 国产在线观看黄| 91精品国产高清久久久久久久久 | 中文字幕一区二区三区在线播放 | 久久国产精品 国产精品| 欧美国产综合一区二区| 黄网av在线| 国产精品theporn88| 国产精品区一区二区三区| xx欧美xxx| 日韩av一级大片| 欧美色播在线播放| 日韩中出av| 免费黄色特级片| 亚洲欧美综合v| 亚洲精品看片| 视频二区在线| 国产成人久久精品| 国产日韩精品一区二区三区 | 欧美一区二区视频观看视频| 校园春色另类视频| 少妇高潮喷水在线观看| 亚洲成人1234| 日韩黄色一级片| 欧美色视频免费| 国产噜噜噜噜噜久久久久久久久| 久久精品这里都是精品| 韩日一区二区| 久久久久久av无码免费网站下载| 日韩久久免费av| 制服诱惑一区二区| 中文字幕在线播放| 国产精品美女久久久久av福利| 懂色av一区二区三区| 国产成人1区| 成人xxx免费视频播放| 久久久久久久久国产精品| 91麻豆精品在线观看| 欧美一区在线观看视频| 亚洲色精品三区二区一区| 久久精品视频在线观看| 久久综合九色综合97婷婷女人 | 女人床在线观看| 日韩国产高清视频在线| 精品一区二区成人精品| 午夜羞羞小视频在线观看| 久久影院理伦片| 日韩欧美色电影| 久久精品国产亚洲高清剧情介绍| 激情国产在线| 婷婷五月综合缴情在线视频| 日韩在线小视频| 国产精品免费久久| 国产欧美日韩| 精品99又大又爽又硬少妇毛片| yy111111少妇影院日韩夜片| 欧美久久久久中文字幕| 久久 天天综合| 欧美少妇激情| 羞羞的视频免费| 成人免费大片黄在线播放| 欧美男生操女生| 国产白丝精品91爽爽久久| 秋霞午夜一区二区三区视频| www99xav| 91国产在线免费观看| 精品奇米国产一区二区三区| 国产不卡在线视频| 老汉色老汉首页av亚洲| 佐山爱痴汉视频一区二区三区 | 欧美性淫爽ww久久久久无| 久久国产高清| 成人精品三级| 国产日本韩国在线播放| 国产精品久久久久免费| 亚洲精品小视频| 中文字幕一区在线观看| 综合久久亚洲| 亚洲精品中文字幕| 69ww免费视频播放器| 狠狠爱一区二区三区| 日韩在线观看免费高清完整版| 国产精品国产a级| 国产欧美三级| 看片一区二区| 日韩午夜影院| 国产1区2区3区中文字幕| 日本午夜在线亚洲.国产| 日韩欧美区一区二| 亚洲欧洲精品成人久久奇米网| 国产精品久久久久毛片大屁完整版| 日韩成人在线电影| 美州a亚洲一视本频v色道| 18禁免费观看网站| 亚洲综合在线播放| 俺去亚洲欧洲欧美日韩| 在线观看91视频| 成人丝袜高跟foot| 99精品电影| 中文字幕av一区二区三区佐山爱| 男人免费av| 国产精品videossex国产高清 | 婷婷综合成人| 成人bbav| 最新亚洲伊人网| 无码人妻精品一区二区蜜桃网站| 成人免费xxxxx在线观看| 日韩中文av在线| 欧美色网一区二区| 国产精品久久久久久久久久免费看|