化)
一、耗時統(tǒng)計在做接口的性能優(yōu)化時最重要的是知道時間消耗在哪里。優(yōu)先使用 Arthas 進(jìn)行耗時統(tǒng)計。不需要寫冗余代碼無侵入。https://blog.csdn.net/sinat_32502451/article/details/142960019可以用StopWatch進(jìn)行耗時統(tǒng)計。需要寫一些代碼。詳情見https://blog.csdn.net/sinat_32502451/article/details/148350451二、鏈路追蹤如果團(tuán)隊(duì)使用了Skywalking可以用來進(jìn)行鏈路追蹤耗時統(tǒng)計。時間主要消耗在哪些服務(wù)哪些方法通過traceId一看便知。Skywalking非常有用哪怕項(xiàng)目里沒有也可以積極推進(jìn)并接入Skywalking。三、性能監(jiān)控如果團(tuán)隊(duì)里面有用到一些性能監(jiān)控的工具比如Grafana、Prometheus。可以多看下接口的請求數(shù)、響應(yīng)時間、服務(wù)器的CPU、GcCount等。四、線程池多線程、異步如果多個任務(wù)之間不存在先后關(guān)系沒有強(qiáng)依賴可以使用線程池做多線程、異步。如果接口中存在多個任務(wù)可以考慮使用多線程。如果接口中有某個任務(wù)比較耗時可以考慮使用異步。CompletableFuture類能夠開多線程處理多個任務(wù)還能處理異步回調(diào)。還能將多個任務(wù)合并成一個設(shè)置阻塞時間。非常實(shí)用。詳情見https://blog.csdn.net/sinat_32502451/article/details/133955576線程池調(diào)優(yōu)詳情見https://blog.csdn.net/sinat_32502451/article/details/148350537五、MQMQ的使用場景: 異步解耦削峰。如果存在耗時的任務(wù)或功能對性能的要求比較高可以使用MQ做異步。線程池也可以異步處理但如果系統(tǒng)掛了線程池也會失效MQ則不會。MQ做異步還有重試機(jī)制。六、數(shù)據(jù)庫數(shù)據(jù)表加索引數(shù)據(jù)庫最常見的優(yōu)化就是加索引。索引能夠極大地提升數(shù)據(jù)表查詢的速度。常用的區(qū)分度高的字段可以嘗試加索引。如果經(jīng)常查詢的有多個字段可以考慮查詢條件是否符合最左匹配原則符合的話用復(fù)合索引。批量處理–數(shù)據(jù)表接口代碼在做批量處理時一定要注意不要在for循環(huán)中調(diào)用數(shù)據(jù)庫/緩存不僅性能極差還有連接數(shù)耗盡的可能。數(shù)據(jù)表的批量處理詳情見https://blog.csdn.net/sinat_32502451/article/details/148350849Explain接口中的sql比較慢時可以用 Explain查看執(zhí)行計劃做性能優(yōu)化。詳情見 https://segmentfault.com/a/1190000008131735分庫分表數(shù)據(jù)表的數(shù)據(jù)量大可以分庫分表。詳情見 https://blog.csdn.net/sinat_32502451/article/details/140732625七、緩存加緩存Redis緩存的處理速度遠(yuǎn)遠(yuǎn)快于數(shù)據(jù)庫/網(wǎng)絡(luò)這些IO。在做性能優(yōu)化時如果數(shù)據(jù)庫/網(wǎng)絡(luò)太慢經(jīng)常會用到Redis緩存。加緩存有幾點(diǎn)要注意1.如果在查詢時使用了緩存那么在更新(刪除、插入)之后必須處理緩存(一般是更新DB后刪除緩存)讓數(shù)據(jù)最終一致。2.實(shí)時數(shù)據(jù)頻繁更新的數(shù)據(jù)最好不要加緩存。3.如果不是頻繁更新的數(shù)據(jù)又沒法在數(shù)據(jù)變更時處理緩存比如調(diào)用其他系統(tǒng)的接口可以嘗試加較短時間的緩存比如1分鐘。詳情見 https://blog.csdn.net/sinat_32502451/article/details/139545057批量處理–緩存Redis的execute()可以在一次連接中處理多個命令。Redis的execute()詳情見https://blog.csdn.net/sinat_32502451/article/details/134366504Pipeline (管道) 可以一次性發(fā)送多條命令并在執(zhí)行完后一次性將結(jié)果返回。Redis的管理操作詳情見: https://blog.csdn.net/sinat_32502451/article/details/134366490數(shù)據(jù)預(yù)熱使用定時任務(wù)定時去查詢數(shù)據(jù)或者是通過前置過濾器提前預(yù)熱。查詢之后數(shù)據(jù)進(jìn)入緩存那么用戶再去查時速度就會快很多。這也是一種很常見的性能優(yōu)化方式。·八、服務(wù)器服務(wù)器的狀態(tài)服務(wù)器是否正常啟動。在調(diào)用接口時服務(wù)器的CPU、GcCount是否正常。九、優(yōu)化服務(wù)鏈路如果接口的服務(wù)鏈路比較復(fù)雜可以試著優(yōu)化服務(wù)鏈路。比如A服務(wù)中分別調(diào)用了B,C,D服務(wù)那可以試著將BCD服務(wù)的內(nèi)容合并到一個服務(wù)中只做一次調(diào)用。比如服務(wù)鏈路為 A-B-C-D可以試著縮短服務(wù)鏈路由 A-D這樣消耗的時間也會變短。十、去掉冗余邏輯如果接口復(fù)用了項(xiàng)目中其他的方法/代碼可以看是否有冗余的邏輯如果有冗余的考慮能否抽取可用邏輯去掉冗余的邏輯。