之前工作中,遇到一個(gè)504
超時(shí)問(wèn)題。原因是因?yàn)?a target="_blank">接口耗時(shí)過(guò)長(zhǎng),超過(guò)nginx
配置的10
秒。然后 真槍實(shí)彈搞了一次接口性能優(yōu)化,最后接口從11.3s
降為170ms
。本文將跟小伙伴們分享接口優(yōu)化的一些通用方案。
1. 批量思想:批量操作數(shù)據(jù)庫(kù)
優(yōu)化前:
//for循環(huán)單筆入庫(kù)
for(TransDetail detail:transDetailList){
insert(detail);
}
優(yōu)化后:
batchInsert(transDetailList);
打個(gè)比喻:
打個(gè)比喻:假如你需要搬一萬(wàn)塊磚到樓頂,你有一個(gè)電梯,電梯一次可以放適量的磚(最多放
500
), 你可以選擇一次運(yùn)送一塊磚,也可以一次運(yùn)送500
,你覺(jué)得哪種方式更方便,時(shí)間消耗更少?
2. 異步思想:耗時(shí)操作,考慮放到異步執(zhí)行
耗時(shí)操作,考慮用 異步處理 ,這樣可以降低接口耗時(shí)。
假設(shè)一個(gè)轉(zhuǎn)賬接口,匹配聯(lián)行號(hào),是同步執(zhí)行的, 但是它的操作耗時(shí)有點(diǎn)長(zhǎng) ,優(yōu)化前的流程:
為了降低接口耗時(shí),更快返回,你可以把匹配聯(lián)行號(hào)移到 異步處理 ,優(yōu)化后:
- 除了轉(zhuǎn)賬這個(gè)例子,日常工作中還有很多這種例子。比如: 用戶注冊(cè)成功后,短信郵件通知,也是可以異步處理的 ~
- 至于異步的實(shí)現(xiàn)方式, 你可以用線程池,也可以用消息隊(duì)列實(shí)現(xiàn) 。
3. 空間換時(shí)間思想:恰當(dāng)使用緩存。
在適當(dāng)?shù)臉I(yè)務(wù)場(chǎng)景,恰當(dāng)?shù)厥褂镁彺妫强梢源蟠筇岣呓涌谛阅艿?。緩存其?shí)就是一種 空間換時(shí)間的思想 ,就是你把要查的數(shù)據(jù),提前放好到緩存里面,需要時(shí), 直接查緩存,而避免去查數(shù)據(jù)庫(kù)或者計(jì)算的過(guò)程 。
這里的緩存包括:Redis
緩存,JVM
本地緩存,memcached
,或者Map
等等。我舉個(gè)我工作中,一次使用緩存優(yōu)化的設(shè)計(jì)吧,比較簡(jiǎn)單,但是思路很有借鑒的意義。
那是一次轉(zhuǎn)賬接口的優(yōu)化, 老代碼 ,每次轉(zhuǎn)賬,都會(huì)根據(jù)客戶賬號(hào),查詢數(shù)據(jù)庫(kù),計(jì)算匹配聯(lián)行號(hào)。
因?yàn)槊看?都查數(shù)據(jù)庫(kù),都計(jì)算匹配,比較耗時(shí) ,所以 使用緩存 ,優(yōu)化后流程如下:
4. 預(yù)取思想:提前初始化到緩存
預(yù)取思想很容易理解,就是 提前把要計(jì)算查詢的數(shù)據(jù),初始化到緩存 。如果你在未來(lái)某個(gè)時(shí)間需要用到某個(gè)經(jīng)過(guò)復(fù)雜計(jì)算的數(shù)據(jù), 才實(shí)時(shí)去計(jì)算的話,可能耗時(shí)比較大 。這時(shí)候,我們可以采取預(yù)取思想, 提前把將來(lái)可能需要的數(shù)據(jù)計(jì)算好,放到緩存中 ,等需要的時(shí)候,去緩存取就行。這將大幅度提高接口性能。
我記得以前在第一個(gè)公司做視頻直播的時(shí)候,看到我們的直播列表就是用到 這種優(yōu)化方案 。就是啟動(dòng)個(gè)任務(wù), 提前把直播用戶、積分等相關(guān)信息,初始化到緩存 。
5. 池化思想:預(yù)分配與循環(huán)使用
大家應(yīng)該都記得, 我們?yōu)槭裁葱枰褂镁€程池 ?
線程池可以幫我們管理線程,避免增加創(chuàng)建線程和銷毀線程的資源損耗。
如果你每次需要用到線程,都去創(chuàng)建,就會(huì)有增加一定的耗時(shí),而線程池可以重復(fù)利用線程,避免不必要的耗時(shí)。 池化技術(shù)不僅僅指線程池,很多場(chǎng)景都有池化思想的體現(xiàn),它的本質(zhì)就是 預(yù)分配與循環(huán)使用 。
比如TCP
三次握手,大家都很熟悉吧,它為了減少性能損耗,引入了Keep-Alive長(zhǎng)連接
,避免頻繁的創(chuàng)建和銷毀連接。當(dāng)然,類似的例子還有很多,如數(shù)據(jù)庫(kù)連接池、HttpClient
連接池。
我們寫代碼的過(guò)程中, 學(xué)會(huì)池化思想 ,最直接相關(guān)的就是使用線程池而不是去new
一個(gè)線程。
-
接口優(yōu)化
+關(guān)注
關(guān)注
0文章
4瀏覽量
1344
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論