本文轉(zhuǎn)自:http://blog.csdn.net/sunxianghuang/article/details/52331441
關(guān)系型數(shù)據(jù)庫(kù)與NoSql數(shù)據(jù)庫(kù)
Not Only SQL,其含義是:適合關(guān)系型數(shù)據(jù)庫(kù)的時(shí)候就是用關(guān)系型數(shù)據(jù)庫(kù),不適用的時(shí)候也沒(méi)必要非得使用關(guān)系型數(shù)據(jù)庫(kù)不可局冰,可以考慮使用更加合適的數(shù)據(jù)存儲(chǔ)。
為彌補(bǔ)關(guān)系型數(shù)據(jù)庫(kù)的不足泰演,各種各樣的NoSQL數(shù)據(jù)庫(kù)運(yùn)應(yīng)而生恬惯。
階層型數(shù)據(jù)庫(kù)
早期的數(shù)據(jù)庫(kù)稱為階層型數(shù)據(jù)庫(kù),數(shù)據(jù)的關(guān)系都是以簡(jiǎn)單的樹(shù)形結(jié)構(gòu)來(lái)定義的讯沈。程序也通過(guò)樹(shù)形結(jié)構(gòu)對(duì)數(shù)據(jù)進(jìn)行訪問(wèn)废亭。這種結(jié)構(gòu)国章,父記錄(上層的記錄)同時(shí)擁有多個(gè)子記錄(下層記錄),子記錄只有唯一的父記錄豆村。正因?yàn)槿绱艘菏蓿@種非常簡(jiǎn)單的構(gòu)造在碰到復(fù)雜數(shù)據(jù)的時(shí)候往往會(huì)造成數(shù)據(jù)的重復(fù)(同一數(shù)據(jù)在數(shù)據(jù)庫(kù)內(nèi)重復(fù)出現(xiàn)),出現(xiàn)數(shù)據(jù)冗余的問(wèn)題掌动。
階層型數(shù)據(jù)庫(kù)把數(shù)據(jù)通過(guò)階層結(jié)構(gòu)的方式表現(xiàn)出來(lái)四啰,雖然這樣的結(jié)構(gòu)有利于提高查詢效率,但與此相對(duì)應(yīng)的是粗恢,不理解數(shù)據(jù)結(jié)構(gòu)就無(wú)法進(jìn)行高效的查詢柑晒。當(dāng)然,在階層結(jié)構(gòu)發(fā)生變更的時(shí)候眷射,程序也需要進(jìn)行相應(yīng)的變更匙赞。
網(wǎng)絡(luò)型數(shù)據(jù)庫(kù)
前所述佛掖,階層型數(shù)據(jù)庫(kù)會(huì)帶來(lái)數(shù)據(jù)重復(fù)的問(wèn)題。為了解決這個(gè)問(wèn)題涌庭,就出現(xiàn)了網(wǎng)絡(luò)型數(shù)據(jù)庫(kù)芥被。它擁有同階層型數(shù)據(jù)庫(kù)相近的數(shù)據(jù)結(jié)構(gòu),同時(shí)各種數(shù)據(jù)又如同網(wǎng)狀交織在一起坐榆,因此而得名拴魄。
階層型數(shù)據(jù)庫(kù)只能通過(guò)父子關(guān)系來(lái)表現(xiàn)數(shù)據(jù)之間的關(guān)系。針對(duì)這一不足席镀,網(wǎng)絡(luò)型數(shù)據(jù)庫(kù)可以使子記錄同時(shí)擁有多個(gè)父記錄匹中,從而解決了數(shù)據(jù)冗余的問(wèn)題。
但是豪诲,在網(wǎng)絡(luò)型數(shù)據(jù)庫(kù)中顶捷,數(shù)據(jù)間比較復(fù)雜的網(wǎng)絡(luò)關(guān)系使得數(shù)據(jù)結(jié)構(gòu)的更新變得比較困難。另外屎篱,與階層型數(shù)據(jù)庫(kù)一樣焊切,網(wǎng)絡(luò)型數(shù)據(jù)庫(kù)對(duì)數(shù)據(jù)結(jié)構(gòu)有很強(qiáng)的依賴性,不理解數(shù)據(jù)結(jié)構(gòu)就無(wú)法進(jìn)行相應(yīng)的數(shù)據(jù)訪問(wèn)芳室。
關(guān)系型數(shù)據(jù)庫(kù)
最后要向大家介紹的是以科德提出的關(guān)系數(shù)據(jù)模型為基礎(chǔ)的關(guān)系型數(shù)據(jù)庫(kù)。關(guān)系型數(shù)據(jù)庫(kù)把所有的數(shù)據(jù)都通過(guò)行和列的二元表現(xiàn)形式表示出來(lái),給人更容易理解的直觀感受刹勃。網(wǎng)絡(luò)型數(shù)據(jù)庫(kù)存在著數(shù)據(jù)結(jié)構(gòu)變更困難的問(wèn)題,而關(guān)系型數(shù)據(jù)庫(kù)可以使多條數(shù)據(jù)根據(jù)值來(lái)進(jìn)行關(guān)聯(lián),這樣就使數(shù)據(jù)可以獨(dú)立存在,使得數(shù)據(jù)結(jié)構(gòu)的變更變得簡(jiǎn)單易行堪侯。
對(duì)于階層型數(shù)據(jù)庫(kù)和網(wǎng)絡(luò)型數(shù)據(jù)庫(kù),如果不理解相應(yīng)的數(shù)據(jù)結(jié)構(gòu)荔仁,就無(wú)法對(duì)數(shù)據(jù)進(jìn)行讀取伍宦,它們對(duì)數(shù)據(jù)結(jié)構(gòu)的依賴性很強(qiáng)。因此乏梁,它們往往需要專業(yè)的工程師使用特定的計(jì)算機(jī)程序進(jìn)行操作處理次洼。相反,關(guān)系型數(shù)據(jù)庫(kù)將作為操作對(duì)象的數(shù)據(jù)和操作方法(數(shù)據(jù)之間的關(guān)聯(lián))分離開(kāi)來(lái)遇骑,消除了對(duì)數(shù)據(jù)結(jié)構(gòu)的依賴性卖毁,讓數(shù)據(jù)和程序的分離成為可能。這使得數(shù)據(jù)庫(kù)可以廣泛應(yīng)用于各個(gè)不同領(lǐng)域落萎,進(jìn)一步擴(kuò)大了數(shù)據(jù)庫(kù)的應(yīng)用范圍亥啦。
關(guān)系型數(shù)據(jù)庫(kù)的優(yōu)勢(shì)
通用性及高性能
"關(guān)系型數(shù)據(jù)庫(kù)的性能絕對(duì)不低,它具有非常好的通用性和非常高的性能"练链。毫無(wú)疑問(wèn)翔脱,對(duì)于絕大多數(shù)的應(yīng)用來(lái)說(shuō)它都是最有效的解決方案。
突出的優(yōu)勢(shì)
關(guān)系型數(shù)據(jù)庫(kù)作為應(yīng)用廣泛的通用型數(shù)據(jù)庫(kù)媒鼓,它的突出優(yōu)勢(shì)主要有以下幾點(diǎn):
1届吁、保持?jǐn)?shù)據(jù)的一致性(事務(wù)處理)
2错妖、由于以標(biāo)準(zhǔn)化為前提,數(shù)據(jù)更新的開(kāi)銷(xiāo)很小(相同的字段基本上都只有一處)
3疚沐、可以進(jìn)行JOIN等復(fù)雜查詢
4暂氯、存在很多實(shí)際成果和專業(yè)技術(shù)信息(成熟的技術(shù))。
這其中濒旦,能夠保持數(shù)據(jù)的一致性是關(guān)系型數(shù)據(jù)庫(kù)的最大優(yōu)勢(shì)株旷。在需要嚴(yán)格保證數(shù)據(jù)一致性和處理完整性的情況下,用關(guān)系型數(shù)據(jù)庫(kù)是肯定沒(méi)有錯(cuò)的尔邓。但是有些情況不需要JOIN晾剖,對(duì)上述關(guān)系型數(shù)據(jù)庫(kù)的優(yōu)點(diǎn)也沒(méi)有什么特別需要,這時(shí)似乎也就沒(méi)有必要拘泥于關(guān)系型數(shù)據(jù)庫(kù)了梯嗽。
就像之前提到的那樣齿尽,關(guān)系型數(shù)據(jù)庫(kù)的性能非常高。但是它畢竟是一個(gè)通用型的數(shù)據(jù)庫(kù)灯节,并不能完全適應(yīng)所有的用途循头。具體來(lái)說(shuō)它并不擅長(zhǎng)以下處理:
1、大量數(shù)據(jù)的寫(xiě)入處理
2炎疆、為有數(shù)據(jù)更新的表做索引或表結(jié)構(gòu)(schema)變更
3卡骂、字段不固定的應(yīng)用
4、對(duì)簡(jiǎn)單查詢需要快速返回結(jié)果的處理
在數(shù)據(jù)讀入方面形入,由復(fù)制產(chǎn)生的主從模式(數(shù)據(jù)的寫(xiě)入由主數(shù)據(jù)庫(kù)負(fù)責(zé)全跨,數(shù)據(jù)的讀取由從數(shù)據(jù)庫(kù)負(fù)責(zé)),可以比較簡(jiǎn)單地通過(guò)增加從數(shù)據(jù)庫(kù)來(lái)實(shí)現(xiàn)規(guī)囊谒欤化浓若。但是,在數(shù)據(jù)的寫(xiě)入方面卻完全沒(méi)有簡(jiǎn)單的方法來(lái)解決規(guī)纳呤化問(wèn)題挪钓。讀寫(xiě)集中在一個(gè)數(shù)據(jù)庫(kù)上讓數(shù)據(jù)庫(kù)不堪重負(fù),大部分網(wǎng)站開(kāi)始使用主從復(fù)制技術(shù)來(lái)實(shí)現(xiàn)讀寫(xiě)分離耳舅,以提高讀寫(xiě)性能和讀庫(kù)的可擴(kuò)展性碌上。
例如,要想將數(shù)據(jù)的寫(xiě)入規(guī)钠只玻化绍赛,可以考慮把主數(shù)據(jù)庫(kù)從一臺(tái)增加到兩臺(tái),作為互相關(guān)聯(lián)復(fù)制的二元主數(shù)據(jù)庫(kù)來(lái)使用辑畦。確實(shí)這樣似乎可以把每臺(tái)主數(shù)據(jù)庫(kù)的負(fù)荷減少一半吗蚌,但是更新處理會(huì)發(fā)生沖突(同樣的數(shù)據(jù)在兩臺(tái)服務(wù)器同時(shí)更新成其他值),可能會(huì)造成數(shù)據(jù)的不一致纯出。為了避免這樣的問(wèn)題蚯妇,就需要把對(duì)每個(gè)表的請(qǐng)求分別分配給合適的主數(shù)據(jù)庫(kù)來(lái)處理敷燎,這就不那么簡(jiǎn)單了。
下圖為兩臺(tái)主機(jī)問(wèn)題:
另外箩言,也可以考慮把數(shù)據(jù)庫(kù)分割開(kāi)來(lái)硬贯,分別放在不同的數(shù)據(jù)庫(kù)服務(wù)器上,比如將這個(gè)表放在這個(gè)數(shù)據(jù)庫(kù)服務(wù)器上陨收,那個(gè)表放在那個(gè)數(shù)據(jù)庫(kù)服務(wù)器上饭豹。數(shù)據(jù)庫(kù)分割可以減少每臺(tái)數(shù)據(jù)庫(kù)服務(wù)器上的數(shù)據(jù)量,以便減少硬盤(pán)I/O(輸入/輸出)處理务漩,實(shí)現(xiàn)內(nèi)存上的高速處理拄衰,效果非常顯著。但是饵骨,由于分別存儲(chǔ)在不同服務(wù)器上的表之間無(wú)法進(jìn)行JOIN處理翘悉,數(shù)據(jù)庫(kù)分割的時(shí)候就需要預(yù)先考慮這些問(wèn)題。數(shù)據(jù)庫(kù)分割之后居触,如果一定要進(jìn)行JOIN處理妖混,就必須要在程序中進(jìn)行關(guān)聯(lián),這是非常困難的轮洋。
下圖為二元主數(shù)據(jù)庫(kù)問(wèn)題的解決辦法:數(shù)據(jù)庫(kù)分割
數(shù)據(jù)庫(kù)分割:不能進(jìn)行JOIN處理
為有數(shù)據(jù)更新的表做索引或表結(jié)構(gòu)(schema)變更
在使用關(guān)系型數(shù)據(jù)庫(kù)時(shí)制市,為了加快查詢速度需要?jiǎng)?chuàng)建索引,為了增加必要的字段就一定需要改變表結(jié)構(gòu)弊予。
為了進(jìn)行這些處理息堂,需要對(duì)表進(jìn)行共享鎖定,這期間數(shù)據(jù)變更(更新块促、插入、刪除等)是無(wú)法進(jìn)行的床未。如果需要進(jìn)行一些耗時(shí)操作(例如為數(shù)據(jù)量比較大的表創(chuàng)建索引或者是變更其表結(jié)構(gòu))竭翠,就需要特別注意:長(zhǎng)時(shí)間內(nèi)數(shù)據(jù)可能無(wú)法進(jìn)行更新。下表所示為共享鎖和排他鎖薇搁。
如果字段不固定斋扰,利用關(guān)系型數(shù)據(jù)庫(kù)也是比較困難的。有人會(huì)說(shuō)"需要的時(shí)候啃洋,加個(gè)字段就可以了"传货,這樣的方法也不是不可以,但在實(shí)際運(yùn)用中每次都進(jìn)行反復(fù)的表結(jié)構(gòu)變更是非常痛苦的宏娄。你也可以預(yù)先設(shè)定大量的預(yù)備字段问裕,但這樣的話,時(shí)間一長(zhǎng)很容易弄不清楚字段和數(shù)據(jù)的對(duì)應(yīng)狀態(tài)(即哪個(gè)字段保存哪些數(shù)據(jù))孵坚,所以并不推薦使用粮宛。下圖所示為使用預(yù)備字段的情況:
對(duì)簡(jiǎn)單查詢需要快速返回結(jié)果的處理
最后還有一點(diǎn)窥淆,這點(diǎn)似乎稱不上是缺點(diǎn),但不管怎樣巍杈,關(guān)系型數(shù)據(jù)庫(kù)并不擅長(zhǎng)對(duì)簡(jiǎn)單的查詢快速返回結(jié)果忧饭。這里所說(shuō)的"簡(jiǎn)單"指的是沒(méi)有復(fù)雜的查詢條件,而不是用JOIN的意思筷畦。因?yàn)殛P(guān)系型數(shù)據(jù)庫(kù)是使用專門(mén)的SQL語(yǔ)言進(jìn)行數(shù)據(jù)讀取的词裤,它需要對(duì)SQL語(yǔ)言進(jìn)行解析,同時(shí)還有對(duì)表的鎖定和解鎖這樣的額外開(kāi)銷(xiāo)鳖宾。這里并不是說(shuō)關(guān)系型數(shù)據(jù)庫(kù)的速度太慢吼砂,而只是想告訴大家若希望對(duì)簡(jiǎn)單查詢進(jìn)行高速處理,則沒(méi)有必要非用關(guān)系型數(shù)據(jù)庫(kù)不可攘滩。
在這種情況下帅刊,我想推薦大家使用NoSQL數(shù)據(jù)庫(kù)。但是像MySQL提供了利用HandlerSocket這樣的變通方法漂问,也是可行的赖瞒。雖然使用的是關(guān)系型數(shù)據(jù)庫(kù)mysql,但并沒(méi)有利用SQL而是直接進(jìn)行數(shù)據(jù)訪問(wèn)蚤假。這樣的方法是非忱敢快速的。
下圖所示為HandlerSocket的概要:
上節(jié)介紹了關(guān)系型數(shù)據(jù)庫(kù)的不足之處磷仰。為了彌補(bǔ)這些不足(特別是最近幾年)牧抽,NoSQL數(shù)據(jù)庫(kù)出現(xiàn)了。關(guān)系型數(shù)據(jù)庫(kù)應(yīng)用廣泛山涡,能進(jìn)行事務(wù)處理和JOIN等復(fù)雜處理雅宾。相對(duì)地,NoSQL數(shù)據(jù)庫(kù)只應(yīng)用在特定領(lǐng)域逢享,基本上不進(jìn)行復(fù)雜的處理罐监,但它恰恰彌補(bǔ)了之前所列舉的關(guān)系型數(shù)據(jù)庫(kù)的不足之處。
如前所述瞒爬,關(guān)系型數(shù)據(jù)庫(kù)并不擅長(zhǎng)大量數(shù)據(jù)的寫(xiě)入處理弓柱。原本關(guān)系型數(shù)據(jù)庫(kù)就是以JOIN為前提的,就是說(shuō)侧但,各個(gè)數(shù)據(jù)之間存在關(guān)聯(lián)是關(guān)系型數(shù)據(jù)庫(kù)得名的主要原因矢空。為了進(jìn)行JOIN處理,關(guān)系型數(shù)據(jù)庫(kù)不得不把數(shù)據(jù)存儲(chǔ)在同一個(gè)服務(wù)器內(nèi)(集中)禀横,這不利于數(shù)據(jù)的分散屁药。相反,NoSQL數(shù)據(jù)庫(kù)原本就不支持JOIN處理柏锄,各個(gè)數(shù)據(jù)都是獨(dú)立設(shè)計(jì)的者祖,很容易把數(shù)據(jù)分散到多個(gè)服務(wù)器上立莉。由于數(shù)據(jù)被分散到了多個(gè)服務(wù)器上,減少了每個(gè)服務(wù)器上的數(shù)據(jù)量七问,即使要進(jìn)行大量數(shù)據(jù)的寫(xiě)入操作蜓耻,處理起來(lái)也更加容易。同理械巡,數(shù)據(jù)的讀入操作當(dāng)然也同樣容易刹淌。
下面說(shuō)一點(diǎn)題外話,如果想要使服務(wù)器能夠輕松地處理更大量的數(shù)據(jù)讥耗,那么只有兩個(gè)選擇:一是提升性能有勾,二是增大規(guī)模。下面我們來(lái)整理一下這兩者的不同古程。
首先蔼卡,提升性能指的就是通過(guò)提升現(xiàn)行服務(wù)器自身的性能來(lái)提高處理能力。這是非常簡(jiǎn)單的方法挣磨,程序方面也不需要進(jìn)行變更雇逞,但需要一些費(fèi)用。若要購(gòu)買(mǎi)性能翻倍的服務(wù)器茁裙,需要花費(fèi)的資金往往不只是原來(lái)的2倍塘砸,可能需要多達(dá)5~10倍。這種方法雖然簡(jiǎn)單晤锥,但是成本較高掉蔬。下圖所示為提升性能的費(fèi)用與性能曲線:
另一方面,增大規(guī)模指的是使用多臺(tái)廉價(jià)的服務(wù)器來(lái)提高處理能力矾瘾。它需要對(duì)程序進(jìn)行變更女轿,但由于使用廉價(jià)的服務(wù)器,可以控制成本壕翩。另外蛉迹,以后只要依葫蘆畫(huà)瓢增加廉價(jià)服務(wù)器的數(shù)量就可以了。下圖所示為提升性能和增大規(guī)模:
不對(duì)大量數(shù)據(jù)進(jìn)行處理的話就沒(méi)有使用的必要嗎戈泼?
NoSQL數(shù)據(jù)庫(kù)基本上來(lái)說(shuō)為了"使大量數(shù)據(jù)的寫(xiě)入處理更加容易(讓增加服務(wù)器數(shù)量更容易)"而設(shè)計(jì)的。但如果不是對(duì)大量數(shù)據(jù)進(jìn)行操作的話赏僧,NoSQL數(shù)據(jù)庫(kù)的應(yīng)用就沒(méi)有意義嗎大猛?
答案是否定的。的確淀零,它在處理大量數(shù)據(jù)方面很有優(yōu)勢(shì)挽绩。但實(shí)際上NoSQL數(shù)據(jù)庫(kù)還有各種各樣的特點(diǎn),如果能夠恰當(dāng)?shù)乩眠@些特點(diǎn)驾中,它就會(huì)非常有用唉堪。具體的例子將會(huì)在第2章和第3章進(jìn)行介紹模聋,這些用途將會(huì)讓你感受到利用NoSQL的好處。
1唠亚、希望順暢地對(duì)數(shù)據(jù)進(jìn)行緩存(Cache)處理
2链方、希望對(duì)數(shù)組類(lèi)型的數(shù)據(jù)進(jìn)行高速處理
3、希望進(jìn)行全部保存
NoSQL數(shù)據(jù)庫(kù)存在著"鍵值存儲(chǔ)"灶搜、"文檔型數(shù)據(jù)庫(kù)"祟蚀、"列存儲(chǔ)數(shù)據(jù)庫(kù)"等各種各樣的種類(lèi),每種數(shù)據(jù)庫(kù)又包含各自的特點(diǎn)割卖。
NoSQL說(shuō)起來(lái)簡(jiǎn)單前酿,但實(shí)際上到底有多少種呢?我在提筆的時(shí)候鹏溯,到NoSQL的官方網(wǎng)站上確認(rèn)了一下罢维,竟然已經(jīng)有122種了。另外官方網(wǎng)站上也介紹了本書(shū)沒(méi)有涉及到的圖形數(shù)據(jù)庫(kù)和對(duì)象數(shù)據(jù)庫(kù)等各個(gè)類(lèi)別丙挽。不知不覺(jué)間肺孵,原來(lái)已經(jīng)出現(xiàn)了這么多的NoSQL數(shù)據(jù)庫(kù)啊。 本節(jié)將為大家介紹具有代表性的NoSQL數(shù)據(jù)庫(kù)取试。
這是最常見(jiàn)的NoSQL數(shù)據(jù)庫(kù)悬槽,它的數(shù)據(jù)是以key-value的形式存儲(chǔ)的。雖然它的處理速度非乘才ǎ快初婆,但是基本上只能通過(guò)key的完全一致查詢獲取數(shù)據(jù)。根據(jù)數(shù)據(jù)的保存方式可以分為臨時(shí)性猿棉、永久性和兩者兼具三種磅叛。
memcached屬于這種類(lèi)型。所謂臨時(shí)性就是 “數(shù)據(jù)有可能丟失”的意思萨赁。memcached把所有數(shù)據(jù)都保存在內(nèi)存中弊琴,這樣保存和讀取的速度非常快杖爽,但是當(dāng)memcached停止的時(shí)候敲董,數(shù)據(jù)就不存在了。由于數(shù)據(jù)保存在內(nèi)存中慰安,所以無(wú)法操作超出內(nèi)存容量的數(shù)據(jù)(舊數(shù)據(jù)會(huì)丟失)腋寨。
1、在內(nèi)存中保存數(shù)據(jù)
2化焕、可以進(jìn)行非程汛埽快速的保存和讀取處理
3、 數(shù)據(jù)有可能丟失
Tokyo Tyrant、Flare查刻、ROMA等屬于這種類(lèi)型键兜。和臨時(shí)性相反,所謂永久性就是“數(shù)據(jù)不會(huì)丟失”的意思穗泵。這里的key-value存儲(chǔ)不像memcached那樣在內(nèi)存中保存數(shù)據(jù)普气,而是把數(shù)據(jù)保存在硬盤(pán)上。與memcached在內(nèi)存中處理數(shù)據(jù)比起來(lái)火欧,由于必然要發(fā)生對(duì)硬盤(pán)的IO操作棋电,所以性能上還是有差距的。但數(shù)據(jù)不會(huì)丟失是它最大的優(yōu)勢(shì)苇侵。
1赶盔、在硬盤(pán)上保存數(shù)據(jù)
2、可以進(jìn)行非秤芘ǎ快速的保存和讀取處理(但無(wú)法與memcached相比)
3于未、數(shù)據(jù)不會(huì)丟失
Redis屬于這種類(lèi)型。redis有些特殊陡鹃,臨時(shí)性和永久性兼具烘浦,且集合了臨時(shí)性key-value存儲(chǔ)和永久性key-value存儲(chǔ)的優(yōu)點(diǎn)。Redis首先把數(shù)據(jù)保存到內(nèi)存中萍鲸,在滿足特定條件(默認(rèn)是15分鐘一次以上闷叉,5分鐘內(nèi)10個(gè)以上,1分鐘內(nèi)10000個(gè)以上的key發(fā)生變更)的時(shí)候?qū)?shù)據(jù)寫(xiě)入到硬盤(pán)中脊阴。這樣既確保了內(nèi)存中數(shù)據(jù)的處理速度握侧,又可以通過(guò)寫(xiě)入硬盤(pán)來(lái)保證數(shù)據(jù)的永久性。這種類(lèi)型的數(shù)據(jù)庫(kù)特別適合于處理數(shù)組類(lèi)型的數(shù)據(jù)嘿期。
1品擎、同時(shí)在內(nèi)存和硬盤(pán)上保存數(shù)據(jù)
2、可以進(jìn)行非潮感欤快速的保存和讀取處理
3萄传、保存在硬盤(pán)上的數(shù)據(jù)不會(huì)消失(可以恢復(fù))
4、適合于處理數(shù)組類(lèi)型的數(shù)據(jù)
MongoDB蜜猾、CouchDB屬于這種類(lèi)型秀菱。它們屬于NoSQL數(shù)據(jù)庫(kù),但與key-value存儲(chǔ)相異蹭睡。
面向文檔的數(shù)據(jù)庫(kù)具有以下特征:即使不定義表結(jié)構(gòu)衍菱,也可以像定義了表結(jié)構(gòu)一樣使用。關(guān)系型數(shù)據(jù)庫(kù)在變更表結(jié)構(gòu)時(shí)比較費(fèi)事棠笑,而且為了保持一致性還需修改程序梦碗。然而NoSQL數(shù)據(jù)庫(kù)則可省去這些麻煩(通常程序都是正確的)禽绪,確實(shí)是方便快捷蓖救。
跟key-value存儲(chǔ)不同的是洪规,面向文檔的數(shù)據(jù)庫(kù)可以通過(guò)復(fù)雜的查詢條件來(lái)獲取數(shù)據(jù)。雖然不具備事務(wù)處理和JOIN這些關(guān)系型數(shù)據(jù)庫(kù)所具有的處理能力循捺,但除此以外的其他處理基本上都能實(shí)現(xiàn)斩例。這是非常容易使用的NoSQL數(shù)據(jù)庫(kù)。
1从橘、不需要定義表結(jié)構(gòu)
2念赶、可以利用復(fù)雜的查詢條件
Cassandra、Hbase恰力、HyperTable屬于這種類(lèi)型叉谜。由于近年來(lái)數(shù)據(jù)量出現(xiàn)爆發(fā)性增長(zhǎng),這種類(lèi)型的NoSQL數(shù)據(jù)庫(kù)尤其引人注目踩萎。
面向行的數(shù)據(jù)庫(kù)和面向列的數(shù)據(jù)庫(kù)
普通的關(guān)系型數(shù)據(jù)庫(kù)都是以行為單位來(lái)存儲(chǔ)數(shù)據(jù)的停局,擅長(zhǎng)進(jìn)行以行為單位的讀入處理,比如特定條件數(shù)據(jù)的獲取香府。因此董栽,關(guān)系型數(shù)據(jù)庫(kù)也被稱為面向行的數(shù)據(jù)庫(kù)。相反企孩,面向列的數(shù)據(jù)庫(kù)是以列為單位來(lái)存儲(chǔ)數(shù)據(jù)的锭碳,擅長(zhǎng)以列為單位讀入數(shù)據(jù)。
面向列的數(shù)據(jù)庫(kù)具有高擴(kuò)展性勿璃,即使數(shù)據(jù)增加也不會(huì)降低相應(yīng)的處理速度(特別是寫(xiě)入速度)擒抛,所以它主要應(yīng)用于需要處理大量數(shù)據(jù)的情況。另外蝗柔,利用面向列的數(shù)據(jù)庫(kù)的優(yōu)勢(shì)闻葵,把它作為批處理程序的存儲(chǔ)器來(lái)對(duì)大量數(shù)據(jù)進(jìn)行更新也是非常有用的。但由于面向列的數(shù)據(jù)庫(kù)跟現(xiàn)行數(shù)據(jù)庫(kù)存儲(chǔ)的思維方式有很大不同癣丧,應(yīng)用起來(lái)十分困難槽畔。
1、高擴(kuò)展性(特別是寫(xiě)入處理)
2胁编、應(yīng)用十分困難
最近厢钧,像Twitter和Facebook這樣需要對(duì)大量數(shù)據(jù)進(jìn)行更新和查詢的網(wǎng)絡(luò)服務(wù)不斷增加,面向列的數(shù)據(jù)庫(kù)的優(yōu)勢(shì)對(duì)其中一些服務(wù)是非常有用的嬉橙,但是由于這與本書(shū)所要介紹的內(nèi)容關(guān)系不大早直,就不進(jìn)行詳細(xì)介紹了。
如何導(dǎo)入NoSQL數(shù)據(jù)庫(kù)
關(guān)系型數(shù)據(jù)庫(kù)和NoSQL數(shù)據(jù)庫(kù)與其說(shuō)是對(duì)立關(guān)系(替代關(guān)系)市框,倒不如說(shuō)是互補(bǔ)關(guān)系霞扬。筆者認(rèn)為,與目前應(yīng)用廣泛的關(guān)系數(shù)據(jù)庫(kù)相對(duì)應(yīng),在有些情況下使用特定的NoSQL數(shù)據(jù)庫(kù)喻圃,將會(huì)使處理更加簡(jiǎn)單萤彩。
這并不是說(shuō)“只使用NoSQL數(shù)據(jù)庫(kù)”或者“只使用關(guān)系型數(shù)據(jù)庫(kù)”,而是“通常情況下使用關(guān)系型數(shù)據(jù)庫(kù)斧拍,在適合使用NoSQL的時(shí)候使用NoSQL數(shù)據(jù)庫(kù)”雀扶,即讓NoSQL數(shù)據(jù)庫(kù)對(duì)關(guān)系型數(shù)據(jù)庫(kù)的不足進(jìn)行彌補(bǔ)。引入NoSQL數(shù)據(jù)庫(kù)時(shí)的思維方法:
當(dāng)然肆汹,如果用錯(cuò)的話愚墓,可能會(huì)發(fā)生使用NoSQL數(shù)據(jù)庫(kù)反而比使用關(guān)系型數(shù)據(jù)庫(kù)效果更差的情況。NoSQL數(shù)據(jù)庫(kù)只是對(duì)關(guān)系型數(shù)據(jù)庫(kù)不擅長(zhǎng)的某些特定處理進(jìn)行了優(yōu)化昂勉,做到量材適用是非常重要的浪册。
例如,若想獲得“更高的處理速度”和“更恰當(dāng)?shù)臄?shù)據(jù)存儲(chǔ)”岗照,那么NoSQL數(shù)據(jù)庫(kù)是最佳的選擇议经。但一定不要在關(guān)系型數(shù)據(jù)庫(kù)擅長(zhǎng)的領(lǐng)域使用NoSQL數(shù)據(jù)庫(kù)。
原來(lái)一提到數(shù)據(jù)存儲(chǔ)谴返,就是關(guān)系型數(shù)據(jù)庫(kù)煞肾,別無(wú)選擇。現(xiàn)在NoSQL數(shù)據(jù)庫(kù)給我們提供了另一種選擇(當(dāng)然要根據(jù)二者的優(yōu)點(diǎn)和不足區(qū)別使用)嗓袱。有些情況下籍救,同樣的處理若用NoSQL數(shù)據(jù)庫(kù)來(lái)實(shí)現(xiàn)可以變得“更簡(jiǎn)單、更高速”渠抹。而且蝙昙,NoSQL數(shù)據(jù)庫(kù)的種類(lèi)有很多,它們都擁有各自不同的優(yōu)勢(shì)梧却。
NoSQL數(shù)據(jù)庫(kù)是一門(mén)新興的技術(shù)奇颠,大家可能會(huì)覺(jué)得實(shí)際的操作經(jīng)驗(yàn)還不多,還可能碰到新的程序錯(cuò)誤放航,無(wú)法放心使用烈拒。
實(shí)際上,memcached已經(jīng)相當(dāng)?shù)某墒炝耍ㄥe(cuò)誤和故障都已經(jīng)被發(fā)現(xiàn)广鳍,且有明確的應(yīng)對(duì)方法)荆几。由于有豐富的事例和技術(shù)信息,所以不用擔(dān)心會(huì)遇到上述問(wèn)題赊时。但是吨铸,在其他的NoSQL數(shù)據(jù)庫(kù)的應(yīng)用過(guò)程中遇到問(wèn)題的可能性還是存在的。特別是實(shí)際應(yīng)用的時(shí)候可以參考的經(jīng)驗(yàn)祖秒、信息太少了诞吱。雖然NoSQL數(shù)據(jù)庫(kù)能帶來(lái)很多便利舟奠,但是在應(yīng)用的時(shí)候也要考慮這些風(fēng)險(xiǎn)。
反過(guò)來(lái)說(shuō)房维,如果不希望遇到此類(lèi)問(wèn)題鸭栖,還是繼續(xù)使用關(guān)系型數(shù)據(jù)庫(kù)吧。它積累了很多成熟經(jīng)驗(yàn)握巢,更讓人放心。
NoSQL數(shù)據(jù)庫(kù)的種類(lèi)和特征
memcached是由Danga Interactive公司開(kāi)發(fā)的開(kāi)源軟件松却,屬于臨時(shí)性鍵值存儲(chǔ)的NoSQL數(shù)據(jù)庫(kù)暴浦。
高速響應(yīng)
大多數(shù)的Web應(yīng)用程序通過(guò)關(guān)系型數(shù)據(jù)庫(kù)來(lái)保存數(shù)據(jù),并從中讀取必要的數(shù)據(jù)顯示在用戶端瀏覽器上晓锻。當(dāng)數(shù)據(jù)量較少時(shí)歌焦,應(yīng)用程序可以很快讀取結(jié)果并顯示出來(lái)。但當(dāng)數(shù)據(jù)量急劇增加砚哆,或者需要返回比較復(fù)雜的數(shù)據(jù)合計(jì)時(shí)独撇,響應(yīng)時(shí)間就會(huì)變長(zhǎng),用戶也只能被迫等待結(jié)果的返回躁锁,這樣將會(huì)降低用戶體驗(yàn)纷铣。
作為高速緩存使用
那么怎么才能獲得高速的響應(yīng)呢?當(dāng)然如果是簡(jiǎn)單處理的話战转,利用關(guān)系型數(shù)據(jù)庫(kù)的索引也能獲得高速響應(yīng)搜立。雖然memcached會(huì)更加快一些,但如果合理的使用索引槐秧,關(guān)系型數(shù)據(jù)庫(kù)就足夠快了啄踊。
但是,如果要對(duì)多個(gè)表的數(shù)據(jù)進(jìn)行計(jì)算刁标,情況會(huì)怎樣呢颠通?若使用關(guān)系型數(shù)據(jù)庫(kù),我們需要從每個(gè)表中取出數(shù)據(jù)然后進(jìn)行最后的組合處理膀懈,或者每次都要使用JOIN等處理顿锰。雖然我們可以通過(guò)事前用批處理制作數(shù)據(jù)來(lái)解決這個(gè)問(wèn)題,但是這樣又會(huì)增加需要管理的表启搂,花費(fèi)我們更多的精力撵儿。
“由于準(zhǔn)備數(shù)據(jù)本身需要關(guān)系型數(shù)據(jù)庫(kù)花費(fèi)幾十秒到幾分鐘的時(shí)間才能計(jì)算出來(lái),因此實(shí)時(shí)計(jì)算就會(huì)顯得比較慢狐血〉硇”這個(gè)時(shí)候,memcached就可以大顯身手了匈织。因?yàn)閙emcached可以把從關(guān)系數(shù)據(jù)庫(kù)中讀取的數(shù)據(jù)保存到緩存中浪默,所以即使是需要處理大量數(shù)據(jù)或者是訪問(wèn)非常集中的情況下牡直,它也能非常快速地返回響應(yīng)數(shù)據(jù)纳决。這是因?yàn)閙emcached對(duì)于(第二次以后的)相同處理碰逸,只要它發(fā)現(xiàn)有數(shù)據(jù)保存在緩存里,就不用通過(guò)關(guān)系型數(shù)據(jù)庫(kù)而直接進(jìn)行處理阔加。memcached存儲(chǔ)的數(shù)據(jù)有可能丟失饵史,但如果這些數(shù)據(jù)可以馬上重新讀取出來(lái)的話,那么即使因?yàn)閙emcached停止而導(dǎo)致數(shù)據(jù)丟失胜榔,也不會(huì)有什么問(wèn)題胳喷。
memcached是通過(guò)大家都很熟悉的散列表(關(guān)聯(lián)數(shù)組)來(lái)存儲(chǔ)各種格式數(shù)據(jù)的鍵值存儲(chǔ),所有的數(shù)據(jù)都被保存在內(nèi)存中夭织。
memcached利用簡(jiǎn)單的文本協(xié)議來(lái)進(jìn)行數(shù)據(jù)通信吭露,數(shù)據(jù)操作也只是類(lèi)似于保存與鍵值相對(duì)應(yīng)的值這樣的簡(jiǎn)單處理。因此尊惰,通過(guò)telnet連接memcached讲竿,就可以進(jìn)行數(shù)據(jù)的保存和讀取。但是弄屡,由于它利用的是文本協(xié)議题禀,所有無(wú)法對(duì)構(gòu)造體類(lèi)型的數(shù)據(jù)進(jìn)行操作,而只能對(duì)字符串類(lèi)型的值進(jìn)行操作膀捷。
當(dāng)然投剥,通過(guò)利用為各種語(yǔ)言準(zhǔn)備的程序庫(kù)來(lái)使用memcached的時(shí)候,值并不僅僅是字符串和數(shù)值担孔,數(shù)組和散列表這樣的構(gòu)造體一樣可以進(jìn)行保存和讀取處理江锨。但是,如前所述糕篇,因?yàn)槭褂昧宋谋緟f(xié)議來(lái)進(jìn)行通信啄育,要完成這樣的處理,就必須要把它們轉(zhuǎn)換成序列化的字節(jié)數(shù)組拌消,通常情況下這些處理是在程序庫(kù)內(nèi)部進(jìn)行的挑豌,因此不需要特別在意,但是需要在保存數(shù)據(jù)的時(shí)候進(jìn)行序列化處理墩崩,讀取數(shù)據(jù)的時(shí)候進(jìn)行反序列化處理氓英。
序列化對(duì)開(kāi)發(fā)語(yǔ)言的依賴
因?yàn)樾蛄谢蕾囉陂_(kāi)發(fā)語(yǔ)言,所以某種開(kāi)發(fā)語(yǔ)言環(huán)境下進(jìn)行的序列化結(jié)果是無(wú)法在其他開(kāi)發(fā)語(yǔ)言環(huán)境下使用的鹦筹。如果要進(jìn)行這樣的處理铝阐,就需要通過(guò)JSON這樣不存在語(yǔ)義依賴關(guān)系的格式化方法來(lái)進(jìn)行明確的序列化和反序列化處理。
說(shuō)到memcached的優(yōu)勢(shì)铐拐,要數(shù)其極其快速的處理速度徘键。由于數(shù)據(jù)全部存儲(chǔ)在內(nèi)存中练对,沒(méi)有磁盤(pán)的IO處理發(fā)生,所以它能以比關(guān)系數(shù)據(jù)庫(kù)高很多的速度進(jìn)行處理(因?yàn)閮?nèi)存中對(duì)數(shù)據(jù)的訪問(wèn)速度是硬盤(pán)中的10~100萬(wàn)倍)吹害。
另外一個(gè)容易被忽略的優(yōu)勢(shì)是她的簡(jiǎn)單易用性螟凭。由于它是通過(guò)鍵值這種散列表形式來(lái)操作數(shù)據(jù),所以只要用過(guò)散列表的人就能很容易的使用它它呀。由于memcached停止的時(shí)候所有的數(shù)據(jù)都會(huì)丟失螺男,所以不論遇到什么奇怪的問(wèn)題,只要重新啟動(dòng)memcached就可以恢復(fù)到初始狀態(tài)纵穿。
另外下隧,由于現(xiàn)在很多的Web服務(wù)器都在應(yīng)用memcached,不但擁有了成熟的技術(shù)政恍,而且有很多成功經(jīng)驗(yàn)被公開(kāi),這樣我們?cè)谛睦锖图夹g(shù)上遇到的困難就會(huì)小得多达传。
隨著數(shù)據(jù)量的增加篙耗,當(dāng)memcached的內(nèi)存無(wú)法保存所有數(shù)據(jù)的時(shí)候,可能就需要多臺(tái)服務(wù)器來(lái)進(jìn)行memcached宪赶,實(shí)際上通過(guò)多臺(tái)服務(wù)器來(lái)運(yùn)行memcached也是非常簡(jiǎn)單的宗弯。在使用多臺(tái)服務(wù)器來(lái)運(yùn)行memcached的時(shí)候,會(huì)使用一致性散列算法來(lái)分散數(shù)據(jù)搂妻。這個(gè)算法已經(jīng)實(shí)際應(yīng)用到memcached的客戶端程序庫(kù)中了蒙保。
一致性散列(Consistent Hashing)
如果只是使用多臺(tái)服務(wù)器,就可以利用鍵的散列值除以服務(wù)器臺(tái)數(shù)欲主,通過(guò)余數(shù)簡(jiǎn)單地決定哪臺(tái)服務(wù)器處理哪條數(shù)據(jù)邓厕。
但是,這種方法在服務(wù)器數(shù)量發(fā)生變化時(shí)就會(huì)遇到問(wèn)題扁瓢,這時(shí)候就需要用到一致性散列這樣的分散算法详恼。
這個(gè)算法首先對(duì)“各個(gè)服務(wù)器對(duì)應(yīng)的散列值”進(jìn)行計(jì)算,把它們分配到一個(gè)圓周上引几。整個(gè)圓周代表鍵的取值范圍昧互,每個(gè)服務(wù)器承擔(dān)一個(gè)特定取值范圍內(nèi)的鍵。
四臺(tái)服務(wù)器的一致性散列分配方式:
新增一臺(tái)5號(hào)服務(wù)器時(shí)的一致性散列分配方式:
新增5號(hào)服務(wù)器后伟桅,1敞掘、2、3號(hào)服務(wù)器負(fù)責(zé)處理的數(shù)據(jù)沒(méi)有任何影響楣铁,也就是說(shuō)玖雁,對(duì)于1、2盖腕、3號(hào)服務(wù)器茄菊,服務(wù)器數(shù)量變化后負(fù)責(zé)處理的數(shù)據(jù)與服務(wù)器數(shù)量變化前負(fù)責(zé)處理的數(shù)據(jù)一致疯潭,這也是一致性散列中一致性的含義。
但是面殖,原本由4號(hào)服務(wù)器負(fù)責(zé)處理的數(shù)據(jù)竖哩,現(xiàn)在由4號(hào)服務(wù)器和5號(hào)服務(wù)器共同處理。服務(wù)器數(shù)量變化后分配給4號(hào)服務(wù)器處理的數(shù)據(jù)脊僚,之前本來(lái)就是由4號(hào)服務(wù)器處理相叁,只是部分?jǐn)?shù)據(jù)被劃分給5號(hào)服務(wù)器負(fù)責(zé)處理,這樣只有一部分?jǐn)?shù)據(jù)會(huì)受到影響辽幌。所謂的一致性散列增淹,并非變化前后服務(wù)器的分配保持完全一致。而是將服務(wù)器增減帶來(lái)的緩存錯(cuò)誤的影響減小到非常低的水平乌企。
memcached有什么不足之處呢虑润?其實(shí)就是大家非常在意的數(shù)據(jù)臨時(shí)性(數(shù)據(jù)有可能丟失)問(wèn)題。
由于memcached把數(shù)據(jù)都保存在內(nèi)存中加酵,當(dāng)memcached由于故障等原因停止的時(shí)候拳喻,所有的數(shù)據(jù)都會(huì)丟失。也正因?yàn)槿绱酥硗螅盟鼇?lái)處理那些重要數(shù)據(jù)是非常危險(xiǎn)的冗澈,絕對(duì)不要使用。最好的處理方式還是把原始數(shù)據(jù)保存在其他地方陋葡,而只是用memcached來(lái)處理原始數(shù)據(jù)的復(fù)制或者是通過(guò)原始數(shù)據(jù)計(jì)算出來(lái)的結(jié)果亚亲。
另外,它還存在只能通過(guò)鍵來(lái)讀取數(shù)據(jù)這樣的局限腐缤。不能支持像LIKE這樣的模糊查詢捌归。
memcached的應(yīng)用
例如:分布式Session
屬于NoSQL分類(lèi)中的永久性鍵值存儲(chǔ)。Tokyo Tyrant和memcached一樣岭粤,通過(guò)鍵值這樣的散列表結(jié)構(gòu)保存數(shù)據(jù)陨溅。但是,數(shù)據(jù)的保存地點(diǎn)卻不一樣绍在,memcached是把數(shù)據(jù)保存在內(nèi)存中门扇,而Tokyo Tyrant則是把數(shù)據(jù)保存在磁盤(pán)上。
另外偿渡,Tokyo Tyrant還引入了數(shù)據(jù)庫(kù)類(lèi)型的概念臼寄。可以根據(jù)選擇的數(shù)據(jù)庫(kù)類(lèi)型溜宽,在緩存數(shù)據(jù)庫(kù)吉拳、散列數(shù)據(jù)庫(kù)、B-tree數(shù)據(jù)庫(kù)和表數(shù)據(jù)庫(kù)等數(shù)據(jù)保存方式間進(jìn)行切換适揉。
由于數(shù)據(jù)存儲(chǔ)在硬盤(pán)上留攒,Tokyo Tyrant的最大優(yōu)勢(shì)就是在它停止的時(shí)候數(shù)據(jù)也不會(huì)丟失煤惩。當(dāng)然,關(guān)系數(shù)據(jù)庫(kù)也不存在數(shù)據(jù)丟失的問(wèn)題炼邀,所有從某種程度上說(shuō)魄揉,也算不上什么優(yōu)勢(shì)。Tokyo Tyrant的另一個(gè)優(yōu)勢(shì)是:它在保存和讀取數(shù)據(jù)的時(shí)候拭宁,與磁盤(pán)的IO處理無(wú)關(guān)洛退,可以實(shí)現(xiàn)對(duì)數(shù)據(jù)的高速訪問(wèn)。它可以獲得比關(guān)系型數(shù)據(jù)庫(kù)快得多的處理速度杰标。用戶在獲得高速反應(yīng)響應(yīng)的同時(shí)兵怯,又不必?fù)?dān)心數(shù)據(jù)丟失的煩惱,真的是非常方便腔剂。
關(guān)于數(shù)據(jù)的讀取方式媒区,memcached只能通過(guò)與鍵完全一致的條件進(jìn)行查詢,而Tokyo Tyrant存在不同的數(shù)據(jù)庫(kù)類(lèi)型掸犬,可以進(jìn)行范圍查詢(B-tree數(shù)據(jù)庫(kù))或者像關(guān)系型數(shù)據(jù)庫(kù)那樣進(jìn)行復(fù)雜條件的查詢(表格數(shù)據(jù)庫(kù))袜漩。同一個(gè)產(chǎn)品,能夠根據(jù)用途的不同而在數(shù)據(jù)庫(kù)類(lèi)型間進(jìn)行切換實(shí)在是方便極了登渣。
雖然既不會(huì)發(fā)生數(shù)據(jù)丟失噪服,訪問(wèn)的速度也非痴毙海快胜茧。但是,使用起來(lái)難度大仇味。
它兼具臨時(shí)性和永久性呻顽,所以它是NoSQL數(shù)據(jù)庫(kù)中介于memcached和Tokyo Tyrant之間的鍵值存儲(chǔ)。
處理數(shù)組形式的數(shù)據(jù)
確實(shí)丹墨,如果要處理字符串?dāng)?shù)據(jù)和標(biāo)準(zhǔn)的散列數(shù)據(jù)廊遍,memcached和Tokyo Tyrant這樣的鍵值存儲(chǔ)可能已經(jīng)足夠了。但是贩挣,根據(jù)用途的不同喉前,也不乏對(duì)快速處理數(shù)值和數(shù)組類(lèi)型數(shù)據(jù)的要求
Redis是鍵值存儲(chǔ)的一種,但是它對(duì)鏈表和集合等數(shù)組類(lèi)型的數(shù)據(jù)進(jìn)行了優(yōu)化處理王财,可以對(duì)數(shù)組類(lèi)型的數(shù)據(jù)進(jìn)行高速的插入和讀取處理卵迂,另外,Redis包含很多可以把這些處理原子化的命令绒净,所以可以非常容易的保證數(shù)據(jù)的一致性见咒。
由于Redis通常是把數(shù)據(jù)保存在內(nèi)存中,所以是處理速度非彻医快的鍵值存儲(chǔ)改览。雖然已經(jīng)存在了同樣是內(nèi)存中保存數(shù)據(jù)的鍵值存儲(chǔ)memcached下翎,但是這兩者的用途卻大不相同。memcached主要用作關(guān)系型數(shù)據(jù)庫(kù)的緩存宝当,與關(guān)系型數(shù)據(jù)結(jié)合使用视事,對(duì)簡(jiǎn)單的操作進(jìn)行優(yōu)化處理。與之相對(duì)今妄,Redis本身就是作為數(shù)據(jù)存儲(chǔ)而設(shè)計(jì)出來(lái)的郑口,它的操作指令非常多,其中很多很多都支持原子操作盾鳞。
Redis可以處理字符串犬性、鏈表、集合腾仅、有序集合乒裆、散列表等各種類(lèi)型的數(shù)據(jù),但需要注意的是所有數(shù)據(jù)都會(huì)被當(dāng)作字符串處理(數(shù)值的保存也是一樣)推励。
由于數(shù)據(jù)通常保存在內(nèi)存中鹤耍,所以處理速度非常快验辞。Redis會(huì)定期對(duì)數(shù)據(jù)進(jìn)行快照處理稿黄,除了一部分當(dāng)前的更新之外,數(shù)據(jù)都不會(huì)丟失跌造。雖然進(jìn)行數(shù)據(jù)快照的時(shí)候會(huì)增加負(fù)荷(需要對(duì)所有的數(shù)據(jù)進(jìn)行IO處理)杆怕,但是由于數(shù)據(jù)快照的IO處理通常都是連續(xù)IO,所以非常高效壳贪。
Redis最大的問(wèn)題就是這項(xiàng)新技術(shù)的使用實(shí)例相對(duì)較少陵珍。
內(nèi)容源自:
《NoSql數(shù)據(jù)庫(kù)入門(mén)》