海量資料和高併發的解決方案

java後端技術發表於2019-04-02

一、快取和頁面靜態化

快取

快取的使用方式可以分為通過程式直接儲存到記憶體中和使用快取框架兩種方式。程式直接主要是使用Map,尤其是ConcurrentHashMap;而常用的快取框架有Ehcache、Memcache和Redis等。

頁面靜態化

快取是將從資料庫中獲取到的資料儲存起來,而頁面靜態化是將程式最後生成的頁面儲存起來,使用頁面靜態化後就不需要每次呼叫都重新生成頁面了,不但不需要查詢資料庫,而且連應用程式處理都省了。 所以,頁面靜態化同時對資料量大和併發量高兩大問題都有好處。 頁面靜態化可以在程式中使用模板技術生成,如Freemarker和Velocity都可以根據模板生成靜態頁面,另外也可以使用快取伺服器在應用伺服器的上一層快取生成的頁面,如可以使用Squid,另外Nginx也提供了相應的功能。

二、資料庫優化

資料庫的優化方法非常多,常用的有如下: 表結構優化

SQL語句優化

分割槽和分表

索引優化

使用儲存過程代替直接操作

使用合理的冗餘

三、分離活躍資料

通過一個定期處理的任務,將不活躍的使用者轉移到別的資料表中

四、批量讀取和延遲修改

批量讀取和延遲修改的原理是通過減少操作的次數來提高效率,如果使用得恰當,效率將會呈數量級提升。

批量讀取是將多次查詢合併到一次中進行。有效的減少查詢資料庫的次數,這種型別可以用非同步請求來處理。 延遲個性主要針對高併發而且頻繁修改的資料,如一些統計資料。這種情況可以先將需要修改的資料暫時儲存到快取中,然後定時將快取中的資料儲存到資料庫中,程式在讀取資料時可以同時讀取資料庫中和快取中的資料。通常用於儲存不那麼重要的資料。

五、讀寫分離

讀寫分離的本質是對資料庫進行叢集,這樣就可以在高併發的情況下將資料庫的操作分配到多個資料庫伺服器去處理,從而降低單臺伺服器的壓力。但需要保證每臺伺服器所儲存的資料都需要一致,資料同步。

六、分散式資料庫

分散式資料庫是將不同的表存放到不同的資料庫中,然後再放到不同的伺服器。這樣在處理請求時,如果需要呼叫多個表,則可以讓多臺伺服器同時處理,從而提高處理速度。

分散式與叢集的區別:

1.分散式需要呼叫多臺伺服器協同工作,處理單個請求;而叢集是應用高併發,將多個請求分攤到不同的伺服器進行處理。 2.叢集是每個節點都有處理一個請求有一完整的方法和機制,而分散式是把一個請求的不同業務,不同業務邏輯方法放到不同的節點,任何一個節點不能處理一個完整的請求任務。

七、NoSQL和Hadoop

高併發的解決方案

前端:非同步請求+資源靜態化+cdn

後端:請求佇列+輪詢分發+負載均衡+共享快取

資料層:redis快取+資料分表+寫佇列

儲存:raid陣列+熱備

網路:dns輪詢+DDOS攻擊防護

相關文章