對於高並發問題,我認為總的來說可以分為三個方面:前端,服務器,數據庫。
前端:web線程連接數不足
后台:服務器網絡帶寬不足
數據庫:數據庫連接查詢速度上不去
針對於這三方面來說要各有針對性的優化方法
(對於高並發問題,只有不斷優化,而不存在絕對的並發安全)
前端:實現負載均衡,配置前置代理服務器,如NGINX,Apache等;
后台:增加網絡帶寬,DNS域名解析分發多台服務器;
數據庫:對數據處查詢進行優化,實現讀寫分離
個人對處理高並發問題的一些理解:
對於處理高並發問題,順序應該是 代碼 > 軟件 > 硬件 因為成本消耗是逐步提升的而且差距非常大,所以應該先從程序代碼來優化在逐步考慮軟件以及硬件。
下面具體來說一些高並發常需處理的問題:
代碼方面(其實有很多細節可以做到優化代碼,我只舉幾個例子)
比如
不要頻繁的new對象,對於整個應用中,只需存在一個實例的類要采用單例模式,不要用String 進行字符串連接,而使用StringBuffer或StringBuilder;
盡管Exception可以控制方法的退出,但Exception要保留stacktrace消耗性能;
盡量少使用instanceof作為條件判斷,盡量使用‘比’作為條件;
在使用類的時候盡量選取效率高的類,比如ArrayList就比Vector要好。
盡量多使用緩存機制,多花點內存做緩存可以大量減少與數據庫的交互提高性能;
前端使用靜態頁面,減少容器的解析;
優化數據庫結構,多做索引提高效率;
統計功能盡量做緩存,每天定時統計相關的報表,避免必要時統計
………
硬件提升:搭建服務器集群,數據庫集群,實現讀寫分離等等
正如短板決定水桶的盛水量,我們應該知道並發瓶頸到底出現在哪一方面,才能做出針對行的優化,所以我們可以利用一些類似於jprofiler工具來找出並發瓶頸再進行處理
