性能優化 - 案例篇:11種優化接口性能的通用方案

文章目錄

    • Pre
    • 1. 加索引:最低成本,最大收益
      • 常見問題:
      • 工具命令:
      • 建議:
    • 2. SQL 優化:比加索引再進階一步
      • 常見 5 類問題:
      • 實用建議:
    • 3. 遠程調用:從串行改并行,性能翻倍不止
      • 場景復現:
      • 優化:并行調用
      • 建議:
    • 4. 數據異構:跨服務請求太慢?同步一份!
      • 缺點:
    • 5. 避免重復調用
      • 案例 1:循環查數據庫
        • 優化寫法
      • 案例 2:死循環自旋
    • 6. 異步處理
      • 什么情況適合異步?
      • 推薦工具:
      • 注意:
    • 7. 鎖粒度控制:避免全表級鎖
      • 優化方式:
    • 8. 分頁優化
      • 大偏移問題:
      • 推薦:
    • 9. 加緩存:請求再多,讀緩存照樣穩
      • 場景:
      • 推薦策略:
      • 注意:
    • 10. 分庫分表
      • 適用場景:
      • 常見方案:
      • 注意:
    • 11. 輔助功能控制:接口不是萬金油
    • 總結:性能優化是一門系統工程

在這里插入圖片描述


Pre

性能優化 - 理論篇:常見指標及切入點

性能優化 - 理論篇:性能優化的七類技術手段

性能優化 - 理論篇:CPU、內存、I/O診斷手段

性能優化 - 工具篇:常用的性能測試工具

性能優化 - 工具篇:基準測試 JMH

性能優化 - 案例篇:緩沖區

性能優化 - 案例篇:緩存

性能優化 - 案例篇:數據一致性

性能優化 - 案例篇:池化對象_Commons Pool 2.0通用對象池框架

性能優化 - 案例篇:大對象的優化

性能優化 - 案例篇:使用設計模式優化性能

性能優化 - 案例篇:并行計算

性能優化 - 案例篇:多線程鎖的優化

性能優化 - 案例篇:CAS、樂觀鎖、分布式鎖和無鎖

性能優化 - 案例篇: 詳解 BIO NIO AIO

性能優化 - 案例篇: 19 條常見的 Java 代碼優化法則

性能優化 - 案例篇:JVM垃圾回收器

性能優化 - 案例篇:JIT


性能優化不是一蹴而就的,它是一次“認知 + 實踐”的雙向奔赴。

你是不是也遇到過這樣的場景:

  • 某核心接口,TPS(每秒事務數)一上來就拉垮;
  • 一個無害的查詢,突然把數據庫搞宕了;
  • 接口明明邏輯簡單,但響應就是卡成 PPT。

接下來我將總結出的 11 條接口性能優化法則,其中不少優化點只需幾行代碼,就能把接口響應從 幾秒 → 毫秒


1. 加索引:最低成本,最大收益

有沒有用索引?用了索引有沒有生效?MySQL 選對了索引嗎?

這三個問題必須要會回答。

常見問題:

  • WHERE 條件沒加索引;
  • ORDER BY 字段無索引或順序不匹配;
  • 字段上存在函數、類型不一致導致索引失效;
  • 多個索引沖突,MySQL 選錯了路徑。

工具命令:

SHOW INDEX FROM `table_name`;
EXPLAIN SELECT * FROM `table_name` WHERE cloumn= 1;

建議:

  • 別忘了聯合索引的最左前綴原則;
  • 必要時用 FORCE INDEX
  • 注意:添加、刪除索引都要評估業務負載,避免高峰期操作。

2. SQL 優化:比加索引再進階一步

索引優化完了,執行慢?那就看 SQL 本身。

常見 5 類問題:

  1. SELECT *(無腦全查)
  2. IN 太長或嵌套子查詢
  3. 關聯字段未加索引
  4. 過多 JOIN + 復雜嵌套
  5. 分頁偏移過大(OFFSET)

實用建議:

  • 明確列名,不要 SELECT *
  • 拆子查詢,用臨時表換 IN;
  • 使用 LIMIT 時避免大偏移(“延遲分頁”);
  • COUNT(*) 太大可用緩存兜底。

3. 遠程調用:從串行改并行,性能翻倍不止

場景復現:

某接口需要:

  • 用戶服務:昵稱、頭像、等級
  • 積分服務:積分
  • 成長值服務:成長值

如果這樣寫:

A → 用戶服務(200ms)  
A → 積分服務(150ms)  
A → 成長值服務(180ms)  
總耗時:530ms

優化:并行調用

CompletableFuture.allOf(userFuture, bonusFuture, growthFuture
).join();

三路并發,總耗時 = 最長的一次,約 200ms。

建議:

  • 使用自定義線程池,避免高并發下線程爆炸;
  • 注意業務合并時機和異常兜底。

4. 數據異構:跨服務請求太慢?同步一份!

高并發接口建議使用緩存異構數據,減少遠程依賴。

  • 用戶信息 Redis 緩存結構:
{"userId": 123,"nickname": "Artisan","score": 87,"growth": 42
}
  • 更新策略:

    • 數據變更后同步更新 Redis;
    • 可選:異步 MQ 通知,或雙寫機制。

缺點:

  • 一致性需關注;
  • 數據過期和失效策略要設計清晰。

5. 避免重復調用

案例 1:循環查數據庫

// 低效寫法
for (User u : list) {userMapper.getUserById(u.getId());
}
優化寫法
List<Long> ids = list.stream().map(User::getId).collect(toList());
userMapper.getUserByIds(ids);

減少 N 次 DB 請求 → 只要 1 次。

案例 2:死循環自旋

while (true) {if (flag) break;
}
  • 慎用!在并發條件不明的場景下容易讓 CPU 打滿;
  • 推薦用 LockSupport.park()CountDownLatch 等并發工具類。

6. 異步處理

什么情況適合異步?

  • 寫操作完成后通知其他服務;
  • 接口響應不需要等待的操作。

推薦工具:

  • @Async
  • CompletableFuture
  • 消息隊列(RocketMQ/Kafka)

注意:

  • 異步任務一定要兜底(失敗重試、冪等保障);
  • 核心鏈路要保障同步結果,不建議異步。

7. 鎖粒度控制:避免全表級鎖

比如訂單取消邏輯:

synchronized(lock) {cancelOrder();
}

這種是“粗粒度鎖”。

優化方式:

  • 基于訂單號加鎖(細粒度)
  • Redis 分布式鎖(Redisson)
  • 樂觀鎖:加版本號 version

8. 分頁優化

分頁是最常見的接口之一,但最容易踩坑。

大偏移問題:

SELECT * FROM order LIMIT 100000, 20;

掃描 10w 行,慢得要命!

推薦:

  • 延遲分頁:記錄上次最大 id
  • 游標分頁:基于上次的主鍵分頁
SELECT * FROM order WHERE id > lastId ORDER BY id LIMIT 20;

9. 加緩存:請求再多,讀緩存照樣穩

場景:

  • 熱門xx詳情
  • 用戶畫像、配置數據
  • 訪問頻率高但更新低的數據

推薦策略:

  • Redis String/Hash
  • 結合 Guava Cache 做本地一級緩存
  • 使用 CacheAside 模式:先查緩存 → 緩存失效再查庫

注意:

  • 緩存過期 + 主動刷新;
  • 防止緩存雪崩/穿透/擊穿(布隆過濾器 + 限流)。

10. 分庫分表

適用場景:

  • 單表數據超千萬;
  • 讀寫壓力過大。

常見方案:

  • 垂直拆分:按業務分庫
  • 水平拆分:按 ID 取模、按時間分表
  • 中間件:ShardingSphere、MyCat

注意:

  • JOIN 語句需要格外處理;
  • 跨分片分頁/排序要小心。

11. 輔助功能控制:接口不是萬金油

很多接口包含了不必要的邏輯,尤其是在企業后臺管理系統中:

  • 復雜日志打印;
  • 權限、數據范圍過濾;
  • 多租戶、國際化處理;
  • 無用字段/參數傳遞。

建議:

  • 精簡接口:核心功能優先返回;
  • 將輔助功能放到獨立服務或中間件;
  • 用 AOP + 過濾器統一處理非業務邏輯。

總結:性能優化是一門系統工程

接口優化,不是追求“代碼完美”,而是要用盡可能少的改動,達到可接受的性能表現

提到的這 11 點優化手段,從數據庫 → 接口邏輯 → 緩存中間件 → 分布式架構全面覆蓋,幾乎涵蓋了主流系統中所有性能問題的“對癥下藥”。

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/85218.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/85218.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/85218.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Kafka - 并發消費拉取數據過少故障分析

文章目錄 背景與問題描述原理與原因分析參數優化思路示例配置驗證與監控實踐注意事項與風險總結 背景與問題描述 場景描述 使用 Spring Boot Spring Kafka&#xff0c;注解 KafkaListener(topics..., id..., ...)&#xff0c;批量監聽&#xff08;方法簽名為 public void doHa…

開源 Arkts 鴻蒙應用 開發(二)封裝庫.har制作和應用

文章的目的為了記錄使用Arkts 進行Harmony app 開發學習的經歷。本職為嵌入式軟件開發&#xff0c;公司安排開發app&#xff0c;臨時學習&#xff0c;完成app的開發。開發流程和要點有些記憶模糊&#xff0c;趕緊記錄&#xff0c;防止忘記。 相關鏈接&#xff1a; 開源 Arkts …

Qt基礎相關

模態對話框和非模態對話框 在一個頁面進行交互時彈出的一個新頁面&#xff0c;新頁面不堵塞舊頁面的交互&#xff0c;這就是非模態對話框。 模態對話框 模態對話框就是當該對話框彈出后會阻塞其他窗口的響應事件&#xff0c;必須先關閉該對話框&#xff0c;其他窗口才會繼續…

《匯編語言:基于X86處理器》第2章 x86處理器架構

本章重點是與 x86 匯編語言相關的底層硬件。有說法認為&#xff0c;匯編語言是直接與機器交流的理想軟件工具。如果是真的&#xff0c;那么匯編程序員就必須非常熟悉處理器的內部結構與功能。本章將討論指令執行時處理器內部發生的一些基本操作&#xff0c;以及操作系統如何加載…

最小生成樹算法的解題思路與 C++ 算法應用

一、最小生成樹算法針對問題類型及概述 先來簡要陳述一下樹的概念&#xff1a;一個由 N N N 個點和 N ? 1 N-1 N?1 條邊組成的無向連通圖。由此&#xff0c;我們可以得知生成樹算法的概念&#xff1a;在一個 N N N 個點的圖中找出一個由 N ? 1 N-1 N?1 條邊組成的樹。…

feign.FeignException$NotFound: [404 ] during [POST] to [http://ti/ti/v1/i/se

feign.FeignException$NotFound: [404 ] during [POST] to [http://ti/ti/v1/i/send 原因&#xff1a;多個地方注冊 FeignClient(name “ti”, path “/ti/v1/i/send/repeat”) 解決&#xff1a;刪除一個即可

Mac m1 通過docker鏡像安裝kafka

kafka依賴zookeeper&#xff0c;因此需要使用docker同時安裝zookeeper和kafka。 macOS的docker在容器和宿主之間無法通過ip直接通信&#xff0c;因此在安裝的時候需要特殊注意與ip相關的設置。當容器需要訪問宿主ip時&#xff0c;需要使用docker.for.mac.host.internal或者host…

01初始uni-app+tabBar+首頁

初始uni-apptabBar首頁 1. uni-app1.1 新建uni-app項目1.2 目錄結構1.3 把項目配置運行到微信開發者工具 2. tabBar3.1 首頁3.1 配置網絡請求3.2 輪播圖區域3.3 分類導航區域3.4 樓層區域 1. uni-app ? uni-app 是使用 Vue.js 開發前端應用的框架。開發者編寫一套代碼&#x…

微信小程序,微信授權手機號碼

uniapp中index.vue: <template><view class"content"><button open-type"getPhoneNumber" getphonenumber"getPhoneNumber"type"primary">授權手機號登錄 </button></view></template><scrip…

數據結構 學習 圖 2025年6月14日 12點57分

搜索算法 深度優先搜索 一種用于遍歷或搜索樹或圖的算法。它沿著樹的深度遍歷樹的節點&#xff0c;盡可能深的搜索樹的分支。 DFS核心思想 深度優先&#xff1a;盡可能深地搜索樹的分支 回溯思想&#xff1a;當節點v的所在邊都已被探尋過&#xff0c;搜索將回溯到發現節點v的…

H3C路由器使用PBR 實現兩條互聯網專線互為備份

實驗拓撲 圖 1-1 注&#xff1a;如無特別說明&#xff0c;描述中的 R1 或 SW1 對應拓撲中設備名稱末尾數字為 1 的設備&#xff0c;R2 或 SW2 對應拓撲中設備名稱末尾數字為 2 的設備&#xff0c;以此類推&#xff1b;另外&#xff0c;同一網段中&#xff0c;IP 地址的主機位為…

深化信創生態布局!聚銘網絡與海量數據完成產品兼容性互認證

近日&#xff0c;聚銘網絡成功與海量數據完成了一系列產品的兼容性互認證&#xff0c;并獲得了由海量數據頒發的產品兼容互認證書。這一成就標志著雙方在技術整合方面邁出了重要一步。 經過全面嚴格的測試&#xff0c;聚銘網絡自主研發的安全系列產品&#xff0c;包括聚銘下一…

Unity AR+ 百度AI 實現 物體識別與對應英文翻譯

一、前言 我目前實現了拍照保存到手機的功能 我想進一步優化&#xff0c;實現通過手機攝像頭實時識別眼前的物體&#xff0c;顯示對應的英文的功能。 1.項目技術棧&#xff1a;Unity 2022.3.53 Vuforia 11 百度物體識別API 百度翻譯API 2.功能目標&#xff1a;使用手機攝像…

Vue.js第二節

計算屬性、事件綁定、條件判斷、遍歷循環 計算屬性&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0">…

從開源代碼入場無人機學術研究到商業化市場的全路徑指南-優雅草卓伊凡

從開源代碼入場無人機學術研究到商業化市場的全路徑指南-優雅草卓伊凡 引言&#xff1a;開源代碼在無人機研究中的重要性 優雅草卓伊凡在這里告訴大家&#xff0c;如果真的要開始進入無人機領域&#xff0c;我們需要一步步開始研究。目前先去看看開源無人機代碼是尤為重要的&…

window11中開啟ubuntu22.04子系統

一、啟用Windows子系統 打開控制面板 選擇程序然后點擊“啟用或關閉Windows功能” 勾選如下2項&#xff0c;點擊確定 二、安裝內核升級包 打開鏈接https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi下載內核升級包&#xff0c;打開后安裝、重啟電腦…

80Qt窗口_對話框

目錄 5. 對話框 5.1 對話框介紹 用例1&#xff1a; 用例2&#xff1a; 用例3&#xff1a; 用例4&#xff1a; 5.2 對話框的分類 5.2.1 模態對話框 5.2.2 ?模態對話框 5. 對話框 5.1 對話框介紹 對話框是 GUI 程序中不可或缺的組成部分。?些不適合在主窗?實現的功…

Pyenv 跟 Conda 還有 Poetry 有什么區別?各有什么不同?

pyenv、Conda 和 Poetry 是 Python 生態中常用的工具&#xff0c;但它們的核心功能和用途不同&#xff0c;通常可以結合使用。以下是它們的區別和特點&#xff1a; 1. pyenv 用途&#xff1a;管理多個 Python 解釋器版本。 核心功能&#xff1a; 安裝不同版本的 Python&#x…

數學符號和標識中英文列表(含義與示例)

數學符號和標識的參考&#xff0c;涵蓋了數學的各個主要分支&#xff0c;并提供清晰的定義和示例&#xff0c;方便快速查找和學習收藏。 目錄 基礎數學符號幾何符號代數符號線性代數符號概率與統計符號集合論符號邏輯符號微積分與分析符號數字與字母符號 特點 中英對照&…

「Java流程控制」switch結構

知識點解析 1.switch結構的核心概念 switch語句是一種多分支選擇結構,它根據表達式的值來選擇執行不同的代碼塊。與if-else結構相比,switch更適合處理離散的、有限個值的比較。 2.switch結構的基本語法 switch (表達式) {case 值1:// 代碼塊1[break;]case 值2:// 代碼塊…