海量數(shù)據(jù)解決方案,知多少?
1:緩存和頁面靜態(tài)化
數(shù)據(jù)量大這個問題最直接的解決方案就是使用緩存,緩存就是將從數(shù)據(jù)庫中獲取的結(jié)果暫時保存起來,在下次使用的時候無需重新到數(shù)據(jù)庫中獲取,這樣可以大大降低數(shù)據(jù)庫的壓力。緩存的使用方式可以分為通過程序直接保存到內(nèi)存中和使用緩存框架兩種方式。程序直接操作主要是使用Map,尤其是ConcurrentHashMap,而常用的緩存框架有Ehcache、Memcache和Redis等。緩存使用過程中最重要問題是什么時候創(chuàng)建緩存和緩存的失效機制。緩存的失效可以定期失效,也可以在數(shù)據(jù)發(fā)生變化的時候失效,如果按數(shù)據(jù)發(fā)生變化讓緩存失效,還可以分粗粒度失效和細粒度失效。不過緩存也不是什么情況都適用,它主要用于數(shù)據(jù)變化不是很頻繁的情況。
跟緩存相似的另外一種技術(shù)叫頁面靜態(tài)化,它在原理上跟緩存非常相似,緩存是將從數(shù)據(jù)庫中獲取到的數(shù)據(jù)(當然也可以是別的任何可以序列化的東西)保存起來,而頁面靜態(tài)化是將程序最后生成的頁面保存起來,使用頁面靜態(tài)化后就不需要每次調(diào)用都重新生成頁面了,這樣不但不需要查詢數(shù)據(jù)庫,而且連應(yīng)用程序處理都省了,所以頁面靜態(tài)化同時對數(shù)據(jù)量大和并發(fā)量高兩大問題都有好處。頁面靜態(tài)化可以在程序中使用模板技術(shù)生成,如常用的Freemarker和Velocity都可以根據(jù)模板生成靜態(tài)頁面,另外也可以使用緩存服務(wù)器在應(yīng)用服務(wù)器的上一層緩存生成的頁面,如可以使用Squid,另外Nginx也提供了相應(yīng)的功能。
2:數(shù)據(jù)庫優(yōu)化
數(shù)據(jù)庫優(yōu)化的方法非常多,常用的有表結(jié)構(gòu)優(yōu)化、SQL語句優(yōu)化、分區(qū)和分表、索引優(yōu)化、使用存儲過程代替直接操作等,另外有時候合理使用冗余也能獲得非常好的效果。
(1)SQL優(yōu)化
SQL優(yōu)化有一個通用的做法就是,首先要將涉及大數(shù)據(jù)的業(yè)務(wù)的SQL語句執(zhí)行時間詳細記錄下來,其次通過仔細分析日志(同一條語句對不同條件的執(zhí)行時間也可能不同,這點也需要仔細分析)找出需要優(yōu)化的語句和其中的問題,然后再有的放矢地優(yōu)化。
(2)分區(qū)和分表
當數(shù)據(jù)量變多的時候,如果可以分區(qū)或者分表,那將起到非常好的效果。當一張表中的數(shù)據(jù)量變多的時候操作速度就慢了,所以很容易想到的就是將數(shù)據(jù)分到多個表中保存,但是這么做之后操作起來比較麻煩,想操作(增刪改查)一個數(shù)據(jù)還需要先找到對應(yīng)的表,如果涉及多個表還得跨表操作。其實在常用的數(shù)據(jù)庫中可以不分表而達到跟分表類似的效果,那就是分區(qū)。分區(qū)就是將一張表中的數(shù)據(jù)按照一定的規(guī)則分到不同的區(qū)來保存,這樣在查詢數(shù)據(jù)時如果數(shù)據(jù)的范圍在同一個區(qū)內(nèi)那么可以只對一個區(qū)的數(shù)據(jù)進行操作,這樣操作的數(shù)據(jù)量更少,速度更快,而且這種方法對程序是透明的,程序不需要做任何改動。
(3)索引優(yōu)化
索引的大致原理是在數(shù)據(jù)發(fā)生變化(增刪改)的時候就預(yù)先按指定字段的順序排列后保存到一個類似表的結(jié)構(gòu)中,這樣在查找索引字段為條件的記錄時就可以很快地從索引中找到對應(yīng)記錄的指針并從表中獲取到記錄,這樣速度就快多了。不過索引也是一把雙刃劍,它在提高查詢速度的同時也降低了增刪改的速度,因為每次數(shù)據(jù)的變化都需要更新相應(yīng)的索引。不過合理使用索引對提升查詢速度的效果非常明顯,所以哪些字段使用索引、使用什么類型的索引都需要仔細琢磨,并且最好再做一些測試。
(4)存儲過程
在操作過程復雜而且調(diào)用頻率高的業(yè)務(wù)中,可以通過使用存儲過程代替直接操作來提高效率,因為存儲過程只需要編譯一次,而且可以在一個存儲過程里面做一些復雜的操作。
3:分離活躍數(shù)據(jù)
通過一個定期處理的任務(wù)將不活躍的用戶轉(zhuǎn)移到別的數(shù)據(jù)表中,在主要操作的數(shù)據(jù)表中只保存活躍用戶,查詢時先從默認表中查找,如果找不到再從不活躍用戶表中查找,這樣就可以提高查詢的效率
4:批量讀取和延遲修改
批量讀取和延遲修改的原理是通過減少操作的次數(shù)來提高效率,如果使用得恰當,效率將會呈數(shù)量級提升。
如果每保存一條記錄都查詢一次數(shù)據(jù)庫,那么對每個需要檢查的字段,都需要查詢與要保存的記錄條數(shù)相同次數(shù)的數(shù)據(jù)庫,這時可以先將所有要保存的數(shù)據(jù)的相應(yīng)字段讀取到一個變量中,然后使用in語句統(tǒng)一查詢一次數(shù)據(jù)庫,這樣就可以將n(要保存記錄的條數(shù))次查詢變?yōu)橐淮尾樵兞恕3诉@種對同一個請求中的數(shù)據(jù)批量讀取,在高并發(fā)的情況下還可以將多個請求的查詢合并到一次進行。
延遲修改主要針對高并發(fā)而且頻繁修改(包括新增)的數(shù)據(jù),如一些統(tǒng)計數(shù)據(jù)。這種情況可以先將需要修改的數(shù)據(jù)暫時保存到緩存中,然后定時將緩存中的數(shù)據(jù)保存到數(shù)據(jù)庫中,程序在讀取數(shù)據(jù)時可以同時讀取數(shù)據(jù)庫中和緩存中的數(shù)據(jù)。
這種方式下如果保存緩存的機器出現(xiàn)了問題將可能會丟失數(shù)據(jù),所以如果是重要的數(shù)據(jù)就需要做一些特殊處理。
5:讀寫分離
讀寫分離的本質(zhì)是對數(shù)據(jù)庫進行集群,這樣就可以在高并發(fā)的情況下將數(shù)據(jù)庫的操作分配到多個數(shù)據(jù)庫服務(wù)器去處理從而降低單臺服務(wù)器的壓力一般情況下是將寫操作交給專門的一臺服務(wù)器處理,這臺專門負責寫的服務(wù)器叫做主服務(wù)器。當主服務(wù)器寫入(增刪改)數(shù)據(jù)后從底層同步到別的服務(wù)器(從服務(wù)器),讀數(shù)據(jù)的時候到從服務(wù)器讀取,從服務(wù)器可以有多臺,這樣就可以實現(xiàn)讀寫分離.
6:分布式數(shù)據(jù)庫
分布式數(shù)據(jù)庫是將不同的表存放到不同的數(shù)據(jù)庫中然后再放到不同的服務(wù)器。這樣在處理請求時,如果需要調(diào)用多個表,則可以讓多臺服務(wù)器同時處理,從而提高處理速度。
數(shù)據(jù)庫集群(讀寫分離)的作用是將多個請求分配到不同的服務(wù)器處理,從而減輕單臺服務(wù)器的壓力,而分布式數(shù)據(jù)庫是解決單個請求本身就非常復雜的問題,它可以將單個請求分配到多個服務(wù)器處理,使用分布式后的每個節(jié)點還可以同時使用讀寫分離,從而組成多個節(jié)點群。
7:NOSQL和Hadoop
NoSQL是近年來發(fā)展非常迅速的一項技術(shù),它的核心就是非結(jié)構(gòu)化。我們一般使用的數(shù)據(jù)庫(SQL數(shù)據(jù)庫)都是需要先將表的結(jié)構(gòu)定義出來。NoSQL就是突破了這些條條框框,可以非常靈活地進行操作,另外因為NoSQL通過多個塊存儲數(shù)據(jù)的特點,其操作大數(shù)據(jù)的速度也非常快。
Hadoop是專門針對大數(shù)據(jù)處理的一套框架,隨著近年來大數(shù)據(jù)的流行Hadoop也水漲船高,出世不久就紅得發(fā)紫。Hadoop對數(shù)據(jù)的處理是先對每一塊的數(shù)據(jù)找到相應(yīng)的節(jié)點并進行處理,然后再對每一個處理的結(jié)果進行處理,最后生成最終的結(jié)果。比如,要查找符合條件的記錄,Hadoop的處理方式是先找到每一塊中符合條件的記錄,然后再將所有獲取到的結(jié)果合并到一起,這樣就可以將同一個查詢分到多個服務(wù)器處理,處理的速度也就快了,這一點傳統(tǒng)的數(shù)據(jù)庫是做不到的。
全網(wǎng)數(shù)據(jù)(www.fuypicc.com)注冊資金1000萬隸屬于深圳市全網(wǎng)數(shù)據(jù)科技有限公司旗下品牌,是國內(nèi)最專業(yè)的IDC服務(wù)應(yīng)用提供商之一,是工信部認定的綜合電信業(yè)務(wù)服務(wù)商,依托中國電信,中國聯(lián)通,中國移動三大運營商形成三網(wǎng)合一,主營運營的數(shù)據(jù)中心包含:深圳,廣州,北京,上海,東莞,中山,佛山,香港,美國 等地專業(yè)級數(shù)據(jù)中心。
服務(wù)范圍:云主機/服務(wù)器托管/服務(wù)器租用/機柜租用/帶寬批發(fā)/CDN加速/專線上網(wǎng)/VPN等服務(wù)。
全網(wǎng)互聯(lián)擁有專業(yè)的技術(shù)團隊為您提供完美解決方案和數(shù)據(jù)中心服務(wù),用心服務(wù),放心托付。
提供全年無休365*7*24小時售后在線技術(shù)服務(wù),用戶至上,用心服務(wù)每一位用戶,您可以把您的應(yīng)用放心的交給我們。
聯(lián)系電話:0755-88820932