1. 程式人生 > 其它 >介面效能優化的一些總結 效能優化之介面優化 各種API效能

介面效能優化的一些總結 效能優化之介面優化 各種API效能

技術標籤:專案實戰SpringCloudspringjavaspring

介面效能優化

參考部落格1

參考部落格2

504錯誤碼 :程式碼執行時間過長,超過nginx配置的15秒

監控介面工具 Kibana

優化方法總結

下面列舉的是一些方案,但是一般需要舉例具體的場景

熱點問題找到了,接下來就是就是對症下藥,下面總結一些常見的優化方案

1.將迴圈體內的IO、對資料庫的操作移出來,放在迴圈外去重批量執行,避免重複發起呼叫

2.資料庫慢查詢、SQL優化、索引

3.基礎、頻繁查詢的方法,可以把執行結果放入快取中

4.序列的遠端呼叫可以改為並行 。(慎用,請求高峰期會造成記憶體暴漲,同時導致上下文丟失)

5.非主流業務,像傳送系統訊息、增刪會員積分資訊,改為傳送訊息到佇列(MQ),非同步消費

6.網路波動問題(甩鍋)

優化實戰

1.資料量比較大,批量操作資料入庫 (Mybatis 批量插入、更新)

//for迴圈單筆入庫
for(TransDetail detail:list){
  insert(detail);  
}
// 批量入庫,mybatis demo實現
<insert id="insertBatch" parameterType="java.util.List">
insert into trans_detail( id,amount,
payer,payee) values <foreach collection="list" item="item" index="index" separator=",">( #{item.id}, #{item.amount}, #{item.payer},#{item.payee} ) </foreach> </insert>

在這裡插入圖片描述

解析

  • 批量插入效能更好,更加省時間,為什麼呢?

    打個比喻:假如你需要搬一萬塊磚到樓頂,你有一個電梯,電梯一次可以放適量的磚(最多放500), 你可以選擇一次運送一塊磚,也可以一次運送500,你覺得哪種方式更方便,時間消耗更少?

2.耗時操作考慮非同步處理

場景:使用者註冊成功後,會有郵件、或者簡訊提醒,這個可以使用MQ,傳送到佇列,非同步消費(注意有一點要不影響主流程功能)。

3.恰當使用快取

查詢比較頻繁的熱點資料放入redis、JVM、Memcached,頻繁修改的資料不要放!

4.優化程式邏輯、程式碼

場景:轉賬邏輯,優化前,會對DB進行兩次查詢操作

punlic void process(Req req){
  //檢驗引數,包括聯行號(前端傳來的payeeBankNo可以為空,但是如果後端沒匹配到,會拋異常)
   checkTransParams(Req req);
   //Save DB
  saveTransDetail(req); 
}

void checkTransParams(Req req){
    //check Amount,and so on.
    checkAmount(req.getamount);
    //check payeebankNo
    if(Utils.isEmpty(req.getPayeeBankNo())){
        String payeebankNo = getPayeebankNo(req.getPayeeAccountNo);
        if(Utils.isEmpty(payeebankNo){
            throws Exception();
        }
    }
}

int saveTransDetail(req){
    String payeebankNo = getPayeebankNo(req.getPayeeAccountNo);
    req.setPayeeBankNo(payeebankNo);
    insert(req);
    ...
}

優化後,對資料庫進行一次查詢操作

void checkTransParams(Req req){
    //check Amount,and so on.
    checkAmount(req.getamount)//check payeebankNo
    if(Utils.isEmpty(req.getPayeeBankNo()){
        String payeebankNo = getPayeebankNo(req.getPayeeAccountNo);
        if(Utils.isEmpty(payeebankNo){
            throws Exception();
        }
    }
    //查詢到有聯行號,直接設定進去啦,這樣等下入庫不用再插入多一次
    req.setPayeeBankNo(payeebankNo);
}

int saveTransDetail(req){
    insert(req);
    ...
}

如優化if複雜的邏輯條件,考慮是否可以調整順序,或者for迴圈,是否重複例項化物件等等,這些適當優化,都是可以讓你的程式碼跑得更快的

5.SQL優化

隔離級別 mysql 預設的是repeatable read

read uncommitted 事務A能夠讀到事務B未提交的資料 髒讀

read committed 事務A只能讀事務B已提交的資料,不能保證同一個事務多次讀取的資料是一致的

repeatable read 保證同一個事務讀取的事務是一致的 幻讀

serialazible 事務之間是序列化執行的

  • 加索引 Mysql 資料庫預設索引,索引失效
  • 避免返回不必要的資料
  • 優化sql結構 資料量大小不同的表位置不同
  • 分庫分表 垂直分表 水平分表
  • 讀寫分離

6.壓縮傳輸內容

7.考慮使用檔案/MQ等其他方式暫存,非同步再落地DB

8.跟PM討論需求

eg:連麥資訊顯示,PM要求頁面顯示所有的連麥資訊,但是可以一次顯示5條