1. 程式人生 > >程式設計中大量資料的解決辦法

程式設計中大量資料的解決辦法

一、前言

在中小型企業開發的時候,對應的伺服器端往往只有一臺主機(例如:阿里雲伺服器),上面儲存了應用程式和資料庫,當資料過大的時候就會程式崩潰,甚至記憶體溢位,資料庫直接宕機,處理方法是應用程式和資料庫放在不同的主機中。


二、處理方法

2.1 快取

使用快取技術(當資料變化不會很頻繁的情況,快取資料可能存在和真實資料不一致的情況),其又分為通過程式直接儲存到記憶體中和使用快取框架兩種方式

直接操作使用Map,尤其是ConcurrentHashMap;

常用的快取框架是Ehcache、Memcache和Redis等

快取使用主要注意:什麼時候建立快取(第一次獲取、程式啟動和快取失效後建立)和快取的失效機制(

可以定期失效,資料發生變化的時候失效)。

面試題:什麼時候建立快取、什麼時候快取失效?

2.2 頁面靜態化

將程式最後生成的頁面儲存起來,使用頁面靜態化後就不需要每次呼叫都重新生成頁面了,不但不需要查詢資料庫,而且連應用程式都省了,可以針對資料量大和併發量高的情況。

頁面靜態化技術如Freemarker和Velocity。

2.3 資料庫優化

常用的有表結構優化,SQL語句優化、分割槽和分表、索引優化、使用儲存過程代替直接操作,合理的使用冗餘。

2.4 分離活躍資料

比如,對網站來說,使用者很多時候就是這種資料,註冊使用者很多,但是活躍使用者卻不多,而不活躍的使用者中有的偶爾也會登入網站,因此還不能刪除。這時就可以通過一個定期處理的任務將不活躍的使用者轉移到別的資料表中,在主要操作的資料表中只儲存活躍使用者,查詢時先從預設表中查詢,如果找不到再從不活躍使用者表中查詢,這樣就可以提高查詢的效率。判斷活躍使用者可以通過最近登入時間,也可以通過指定時間段內登入次數。

2.5 批量讀取和延遲修改

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


批量讀取是將多次查詢合併到一次中進行,比如,在一個業務系統中需要批量匯入工人資訊,在導人前需要檢查工人的編碼是否已經在資料庫中、工人對應的部門資訊是否正確(在部門表中是否存在)、工人的工種資訊在工種表中是否存在等,如果每儲存一條記錄都查詢一次資料庫,那麼對每個需要檢查的欄位,都需要查詢與要儲存的記錄條數相同次數的資料庫,這時可以先將所有要儲存的資料的相應欄位讀取到一個變數中,然後使用in語句統一查詢一次資料庫,這樣就可以將n(要儲存記錄的條數)次查詢變為一次查詢了。除了這種對同一個請求中的資料批量讀取,在高併發的情況下還可以將多個請求的查詢合併到一次進行,如將3秒或5秒內的所有請求合併到一起統一查詢一次資料庫,這樣就可以有效減少查詢資料庫的次數,這種型別可以用非同步請求來處理。




延遲修改主要針對高併發而且頻繁修改(包括新增)的資料,如一些統計資料。這種情況可以先將需要修改的資料暫時儲存到快取中,然後定時將快取中的資料儲存到資料庫中,程式在讀取資料時可以同時讀取資料庫中和快取中的資料。這裡的快取和前面介紹的快取有本質的區別,前面的快取在使用過程中,資料庫中的資料一直是最完整的,但這裡資料庫中的。注意:資料可能會與真實資料不一致,同步即可。

2.6 讀寫分離(核心:資料庫資料同步和負載均衡)
讀寫分離的本質是對資料庫進行叢集,這樣就可以在高併發的情況下將資料庫的操作分配到多個數據庫伺服器去處理從而降低單臺伺服器的壓力,不過由於資料庫的特殊性——每臺伺服器所儲存的資料都需要一致,所以資料同步就成了資料庫叢集中最核心的問題。


如果多臺伺服器都可以寫資料那麼資料同步將變得非常複雜,所以一般情況下是將寫操作交給專門的一臺伺服器處理,這臺專門負責寫的伺服器叫做主伺服器。當主伺服器寫入(增刪改)資料後從底層同步到別的伺服器(從伺服器),讀資料的時候到從伺服器讀取,從伺服器可以有多臺,這樣就可以實現讀寫分離,並且將讀請求分配到多個伺服器處理。主伺服器向從伺服器同步資料時,如果從伺服器數量多,那麼可以讓主伺服器先向其中一部分從伺服器同步資料,第一部分從伺服器接收到資料後再向另外一部分同步。(大部分公司都是這樣,我上一家公司用的是Ignite和Orcale11g)微笑

簡單的資料詞步方式可以採川資料庫的熱備份功能,不過讀取到的資料可能會存在一定的滯後性,高階的方式需要使用專門的軟硬體配合。另外既然是叢集就涉及負載均衡問題,負載均衡和讀寫分離的操作一般採川專門程式處理,而且對應用系統來說是透明的。


2.6 分散式資料庫


分散式資料庫是將不同的表存放到不同的資料庫中然後再放到不同的伺服器這樣在處理請求吋,如果需要呼叫多個表,則可以讓多臺伺服器同時處理,從而提高處理速度。
資料庫叢集(讀寫分離)的作用是將多個請求分配到不同的伺服器處理,從時減輕單臺伺服器的壓力。


實際使用中分散式資料庫有很多複雜的問題需要解決,如事務處理、多表查詢等。分散式的另外一種使用的思路是將不同業務的資料表儲存到不同的節點,讓不同的業務呼叫不同的資料庫,這種用法其實是和叢集一樣起分流的作用,不過這種情況就不需要同步資料了。使用後面這種思路時架構還是和上面圖中的一樣,所以技術和架構只是一個IT工具,真正需要的是思路,也就是工具的使用方法。

2.7 NoSQL和Hadoop

NoSQL如MongDB

Hadoop對資料的處理是先對每一塊的資料找到相應的節點並進行處理,然後冉對每一個處理的結果進行處理,最後生成最終的結果。比如,要查詢符合條件的記錄,Hadoop的處理方式是先找到每一塊中符合條件的記錄,然後再將所有獲取到的結果合併到一起,這樣就可以將同一個查刖分到多個伺服器處理,處理的速度也就快了,這一點傳統的資料庫是做不到的。

題外話:bootstrap的視覺化佈局操作倒是挺有意思的偷笑

http://www.bootcss.com/p/layoutit/