介面效能優化的一些總結 效能優化之介面優化 各種API效能
技術標籤:專案實戰SpringCloudspringjavaspring
介面效能優化
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條