java高併發,如何解決,什麼方式解決

明明1202發表於2015-11-13

之前我將高併發的解決方法誤認為是執行緒或者是佇列可以解決,因為高併發的時候是有很多使用者在訪問,導致出現系統資料不正確、丟失資料現象,所以想到 的是用佇列解決,其實佇列解決的方式也可以處理,比如我們在競拍商品、轉發評論微博或者是秒殺商品等,同一時間訪問量特別大,佇列在此起到特別的作用,將 所有請求放入佇列,以毫秒計時單位,有序的進行,從而不會出現資料丟失系統資料不正確的情況。

今天我經過查資料,高併發的解決方法有倆種,一種是使用快取、另一種是使用生成靜態頁面;還有就是從最基礎的地方優化我們寫程式碼減少不必要的資源浪費:(

1.不要頻繁的new物件,對於在整個應用中只需要存在一個例項的類使用單例模式.對於String的連線操作,使用StringBuffer或者StringBuilder.對於utility型別的類通過靜態方法來訪問。

2. 避免使用錯誤的方式,如Exception可以控制方法推出,但是Exception要保留stacktrace消耗效能,除非必要不要使用 instanceof做條件判斷,儘量使用比的條件判斷方式.使用JAVA中效率高的類,比如ArrayList比Vector效能好。)

首先快取技術我一直沒有使用過,我覺得應該是在使用者請求時將資料儲存在快取中,下次請求時會檢測快取中是否有資料存在,防止多次請求伺服器,導致伺服器效能降低,嚴重導致伺服器崩潰,這只是我自己的理解,詳細的資料還是需要在網上收集;

使用生成靜態頁面我想大家應該不模式,我們見過很多網站當在請求的時候頁面的後最已經變了,如“http://developer.51cto.com/art/201207/348766.htm”該頁面其實是一個伺服器請求地址,在轉換成htm後,訪問速度將提升,因為靜態頁面不帶有伺服器元件;在這裡我就多多介紹一下:

一、什麼是頁面靜態化:

簡 單的說,我們如果訪問一個連結 ,伺服器對應的模組會處理這個請求,轉到對應的jsp介面,最後生成我們想要看到的資料。這其中的缺點是顯而易見的:因為每次請求伺服器都會進行處理,如 果有太多的高併發請求,那麼就會加重應用伺服器的壓力,弄不好就把伺服器 搞down 掉了。那麼如何去避免呢?如果我們把對 test.do 請求後的結果儲存成一個 html 檔案,然後每次使用者都去訪問 ,這樣應用伺服器的壓力不就減少了?

那麼靜態頁面從哪裡來呢?總不能讓我們每個頁面都手動處理吧?這裡就牽涉到我們要講解的內容了,靜態頁面生成方案… 我們需要的是自動的生成靜態頁面,當使用者訪問 ,會自動生成 test.html ,然後顯示給使用者。

二、下面我們在簡單介紹一下要想掌握頁面靜態化方案應該掌握的知識點:

1、 基礎- URL Rewrite

什麼是 URL Rewrite 呢 ? URL 重寫。用一個簡單的例子來說明問題:輸入網址 ,但是實際上訪問的卻是 abc.com/test.action,那我們就可以說 URL 被重寫了。這項技術應用廣泛,有許多開源的工具可以實現這個功能。

2、 基礎- Servlet web.xml

如果你還不知道 web.xml 中一個請求和一個 servlet 是如何匹配到一起的,那麼請搜尋一下 servlet 的文件。這可不是亂說呀,有很多人就認為 /xyz/*.do 這樣的匹配方式能有效。

如果你還不知道怎麼編寫一個 servlet ,那麼請搜尋一下如何編寫 servlet.這可不是說笑呀,在各種整合工具漫天飛舞的今天,很多人都不會去從零編寫一個 servlet了。

三、基本的方案介紹

java高併發,如何解決,什麼方式解決 - 我學坊 - 勵志-我學坊
其中,對於 URL Rewriter的部分,可以使用收費或者開源的工具來實現,如果 url不是特別的複雜,可以考慮在 servlet 中實現,那麼就是下面這個樣子:

 

java高併發,如何解決,什麼方式解決 - 我學坊 - 勵志-我學坊
 
總 結:其實我們在開發中都很少考慮這種問題,直接都是先將功能實現,當一個程式設計師在幹到1到2年,就會感覺光實現功能不是最主要的,安全效能、質量等等才是 一個開發人員最該關心的。今天我所說的是高併發,我的解決思路是,1、採用分散式應用設計2、分散式快取資料庫3、程式碼優化

相關文章