感覺面試過程中一定會問到的問題有三個,多線程,JVM,高并發!
盡管工作過程中基本不用這三個要命的東西!還是阻擋不了面試官的趨之若鶩,下面就圍繞其中一個---高并發,來說下自己的理解!
何謂并發?同時處理操作!
何謂高并發?同時處理很多操作!
什么操作呢?頁面請求:一個簡單的頁面請求可能包含了很多內容,比如驗證登錄,靜態頁面加載,動態數據加載(涉及到訪問數據庫,緩存等等),圖片加載,線程的啟動和銷毀!每一個操作都需要花費時間,總得加起來可能只有200ms,但是如果你的服務器處理能力只能是一個請求級別的,那么100萬個請求,你就需要20萬秒,大概是幾天的時間!
當然實際生活中我們沒有這么水的服務器,換句話說,我們可以通過選擇好的服務器來提高我們的并發能力!也就是說硬件的指數型升級能讓我們應付高并發,但是事與愿違,如果處理一個請求占用的是100k內存,那么100萬請求就需要100萬M,也就是差不多100G的內存!這無疑是現實生活中還沒有的!
而且單機服務器容易受到網絡,斷電等多方面原因的影響!所以一個分布式集群就是我們處理高并發最有效的方法!
在此之前,我們先來熟悉幾個關于高并發的關鍵參數!
QPS:每秒處理的請求數量!
響應時間:處理一個請求需要的時間!
吞吐量:單位時間內的處理請求數量!
最大并發數:同一時間能支持的最大請求數!
從這些指標來看,我們提高并發量有兩種方式:提高處理速度和減少處理時間!
一般來說有下面這些常規辦法:
1,更多的靜態資源:將代碼中的大量枚舉(容器加載時寫入map,放入本地緩存),數據庫中的定義表(定時任務放入緩存),固定配置,HTML文件等靜態化處理,緩存起來!
2,圖片服務器:一般來說,圖片在一個頁面上屬于數據量比較大的東西,盡量避免動態數據和圖片的順序渲染,使用圖片服務器分離數據和圖片!
3,優化代碼:盡量避免多層循環,避免多次訪問數據庫,使用多線程提高cpu使用率和執行速度,使用java8的流式處理和并行處理提高速度!
4,數據庫:采用分庫分表,mysql5.7之后,據說可以支持秒級百萬級數據查詢。速度相當之快,使用八庫1024表,可以滿足數據庫一秒數百萬的并發!同時可以開啟緩存,寫入存儲過程等加快訪問時間!分庫分表之后還可以根據分表字段使用聯合查詢,避免了大多數數據庫架構分布式之后不能聯合查詢的缺點!
5,使用內存型數據存儲:使用redis等內存緩存可以提高讀寫速度,在數據落庫之前快速讀寫數據,使用mongodb等作為大字段,多字節的key value保存方式,防止關系型數據庫的不足!
6,負載均衡:使用nginx等負載均衡中間件,將請求分布到不同的機器上,避免單個應用持續的處理引起血崩!
總之,高并發是一項程序員必不可少缺的技術,也是面試必問的知識點,只有直面它,解決它才能對技術有更深的認識!
高并發的路上踩了很多坑,以后再記錄下這些坑,和大家共勉!