面試官:如何提升項目并發性能?
在面試中,并發模塊是一定會問到的知識點。而問到并發模塊,如何提升項目并發性能?又是一個高頻的面試題。
但這道面試題大部分同學都回答不好,且沒有清晰的回答邏輯鏈,所以接下來這篇文章咱們給大家系統的梳理一下如何回答這個問題?
1.概述
想要提升項目并發性能其實不難,只需要記住三個字即可:代、中、架。
什么意思呢?請看這幅圖:

2.代碼層面
(1)使用并發編程和異步編程
想象一下餐廳只有一個服務員是什么場景?客人點餐、上菜、結賬全都得排隊。如果多幾個服務員,效率就完全不同了。代碼也是如此,使用多線程處理任務,相當于增加了多個“服務員”。
異步編程就更進一步了——服務員接到點單后,不是站在原地等廚師做菜,而是先去服務其他客人,等菜好了再過來。
Java 中的 CompletableFuture、Spring 的 @Async 注解、線程池、動態線程池都能實現這種效果。
(2)無鎖編程
這就好比十字路口的管理方式。用鎖機制像紅綠燈——即使沒有車,其他方向也得等著。無鎖編程則像轉盤,大家按照規則自行通過,效率更高。Java 中的 Atomic 類就是無鎖編程的典型代表。
(3)鎖的優化
如果非得用鎖,也要講究方式:
- 減少鎖粒度:不要把整個倉庫都鎖上,只鎖某個貨架就行。
- 讀寫鎖:多個讀者可以同時讀,寫者才需要獨占。
- 樂觀鎖:先假設不會沖突,操作完再檢查,如果沖突了重試。
3.中間件:用好工具事半功倍
(1)添加緩存多級緩存
緩存就像把常用工具放在手邊,而不是每次都去倉庫取。Redis、Memcached 都是常用的緩存中間件。
有一次,我們把商品信息加了緩存,接口響應時間直接從 200ms 降到 20ms,提升了 10 倍!
多級緩存

使用多級緩存可以從離用戶請求最近的地方優先獲取緩存信息,從而保證了更高的查詢效率,多級緩存包括以下這些:
- 分布式緩存:例如,Redis、MemCached 等。
- 本地緩存:例如,Caffeine、Google Guava Cache、Spring Cache、Ehcache 等。
- Nginx 緩存:在 Nginx 中配置并開啟緩存功能。
- CDN 緩存:是一種通過在離用戶更近的位置存儲數據副本,以提供更快速、高效地內容交付的技術。CDN緩存使用分布式網絡和邊緣節點來緩存和分發靜態和動態內容,以減少用戶請求的響應時間和帶寬消耗。
- 瀏覽器緩存:它的實現主要依靠 HTTP 協議中的緩存機制,當瀏覽器第一次請求一個資源時,服務器會將該資源的相關緩存規則(如 Cache-Control、Expires 等)一同返回給客戶端,瀏覽器會根據這些規則來判斷是否需要緩存該資源以及該資源的有效期。
(2)優化連接中間件
數據庫連接池、HTTP 連接池等都需要優化配置。就像高速公路的收費站,如果收費窗口太少,即使道路再寬也會堵車。
4.架構層面
(1)負載均衡
單臺服務器性能再強也有極限。負載均衡相當于銀行開設多個窗口,將客戶分流到不同的柜臺。Nginx、LVS 等都是常用的負載均衡器。
(2)微服務動態擴容
微服務架構下,我們可以針對訪問量大的服務單獨擴容。比如訂單服務壓力大,就只給訂單服務增加實例,而不是擴展整個應用。
(3)集群和數據分片
當數據量巨大時,單數據庫會成為瓶頸。分庫分表就像把一個大圖書館分成多個小閱覽室,每個房間存放不同類別的書籍,提高檢索效率。
5.擴展:監控與持續優化
光做優化不夠,還需要知道優化效果如何。使用 SkyWalking、Pinpoint 等工具可以監控系統性能,找出熱點方法;Arthas 可以在線診斷運行中的程序。
這就好比給系統做體檢,只有定期檢查才能及時發現潛在問題并解決問題。
小結
提升系統并發能力是一個系統工程,需要從代碼細節到架構設計全面考慮:
- 代碼層面:善用多線程、異步和無鎖編程
- 中間件:合理使用緩存和連接池
- 架構層面:通過負載均衡、微服務和分庫分表水平擴展
- 持續監控:找出瓶頸,持續優化
記住,沒有一勞永逸的解決方案,只有適合當前業務場景的最優解。不同的項目階段,需要采取不同的優化策略。
































