網(wǎng)站開發(fā)圖片建站公司網(wǎng)站源碼
簡(jiǎn)單介紹
Redis是當(dāng)下最流行的NoSQL數(shù)據(jù)庫(kù)。在Redis中,數(shù)據(jù)的存儲(chǔ)格式是以鍵值對(duì)的方式進(jìn)行存儲(chǔ)的。在鍵值對(duì)的存儲(chǔ)形式中,值除了是常見的字符串,也可以是類似于Json對(duì)象的形式,或者是List,Map等數(shù)組格式,或者是其他的復(fù)雜類型,所以鍵值對(duì)的存儲(chǔ)方式也足夠滿足我們?nèi)粘5氖褂?#xff1a;
像這種的,并不是以標(biāo)準(zhǔn)的表的格式存儲(chǔ)的數(shù)據(jù)庫(kù),而是使用自身特定的數(shù)據(jù)結(jié)構(gòu)進(jìn)行存儲(chǔ)的數(shù)據(jù)庫(kù)叫做NoSQL的數(shù)據(jù)庫(kù)。當(dāng)然對(duì)于NoSQL的定義要更加的廣泛,現(xiàn)在暫時(shí)就用存儲(chǔ)結(jié)構(gòu)將SQL和NoSQL數(shù)據(jù)庫(kù)進(jìn)行簡(jiǎn)單的區(qū)分即可。
認(rèn)識(shí)NoSQL
SQL:關(guān)系型數(shù)據(jù)庫(kù)
NoSQL:非關(guān)系型數(shù)據(jù)庫(kù),或者說(shuō),不僅僅是數(shù)據(jù)庫(kù)
兩者的區(qū)別
首先,SQL的S表示的是(Structured)結(jié)構(gòu)化的意思,也就是說(shuō)關(guān)系型數(shù)據(jù)庫(kù)中的數(shù)據(jù)存儲(chǔ)格式都是非常的規(guī)整的表的格式,并且我們還會(huì)加上一些約束讓其中的數(shù)據(jù)更加的規(guī)范標(biāo)準(zhǔn)。
NoSQL的數(shù)據(jù)類型就相對(duì)比較松散,對(duì)于數(shù)據(jù)的存儲(chǔ)并沒(méi)有太強(qiáng)的約束,比如Redis的數(shù)據(jù)類型就是鍵值對(duì)的類型,其中鍵值的數(shù)據(jù)類型可以任意定義?;蛘邔?duì)于ES這類的文檔型,他們的數(shù)據(jù)存儲(chǔ)格式就是JSON格式的存儲(chǔ)方式。
除了數(shù)據(jù)的不同,當(dāng)我們?cè)诙xSQL的表結(jié)構(gòu)的時(shí)候,一般定義好了之后就不會(huì)輕易地修改表的結(jié)構(gòu),容易出現(xiàn)對(duì)應(yīng)的業(yè)務(wù)無(wú)法正常實(shí)現(xiàn)的風(fēng)險(xiǎn),或者數(shù)據(jù)發(fā)生錯(cuò)誤,但是對(duì)于NoSQL來(lái)說(shuō),字段的數(shù)量可以隨時(shí)的添加修改,我們只關(guān)注對(duì)應(yīng)的字段,至于其他的字段是多了或者少了都對(duì)我們沒(méi)有影響。
其次,SQL的第二個(gè)特點(diǎn)就是(Relational)關(guān)聯(lián),這個(gè)特性在之前我們學(xué)習(xí)MySQL時(shí)接觸到的外鍵約束和多表查詢,或者在做Java程序的時(shí)候?qū)W過(guò)的多對(duì)多關(guān)系中都有體驗(yàn),比如我們用一個(gè)用戶表,一個(gè)訂單表,一開始這兩張表并沒(méi)有關(guān)系,但是當(dāng)業(yè)務(wù)開始實(shí)現(xiàn),一個(gè)用戶購(gòu)買了一個(gè)商品,這時(shí)候就會(huì)出現(xiàn)一張中間表去維護(hù)某個(gè)用戶購(gòu)買了某樣商品,這時(shí)候表與表之間就開始有了關(guān)聯(lián),當(dāng)我們?cè)傧肴ルS意的操作關(guān)聯(lián)表中的數(shù)據(jù)的時(shí)候,可能會(huì)因?yàn)槟硞€(gè)表中的關(guān)聯(lián)數(shù)據(jù)而導(dǎo)致無(wú)法正常的更改數(shù)據(jù)。
而對(duì)于NoSQL來(lái)說(shuō),他不會(huì)刻意的去維護(hù)表與表之間的關(guān)系,甚至對(duì)于數(shù)據(jù)與數(shù)據(jù)之間的關(guān)系都非常的模糊,如果想要將兩個(gè)數(shù)據(jù)聯(lián)系起來(lái),一般的方式會(huì)選擇嵌套,即在一個(gè)JSON對(duì)象中再加入一個(gè)JSON對(duì)象的方式去將多個(gè)對(duì)象進(jìn)行聯(lián)系。
然后就是查詢方式的區(qū)別,SQL數(shù)據(jù)庫(kù)的查詢方式是使用SQL語(yǔ)言進(jìn)行查詢,但是對(duì)于NoSQL來(lái)說(shuō),查詢語(yǔ)言并不是固定的,而是不同的 NoSQL數(shù)據(jù)庫(kù)都有不同的查詢方式,并沒(méi)有一個(gè)統(tǒng)一的格式。各有各的好處,比如我們的SQL查詢語(yǔ)言比較統(tǒng)一,基本上一套SQL語(yǔ)言可以在各種關(guān)系型數(shù)據(jù)庫(kù)中使用,而非關(guān)系型數(shù)據(jù)庫(kù)雖然不統(tǒng)一,但是查詢的方式多半都比較符合程序員的編碼方式,所以學(xué)習(xí)起來(lái)也并不是非常的困難。
還有就是事務(wù)方面的區(qū)別,所有的關(guān)系型數(shù)據(jù)庫(kù)的事務(wù),都滿足ACID的特性,而非關(guān)系型數(shù)據(jù)庫(kù),并不能完美的實(shí)現(xiàn)事務(wù),只能實(shí)現(xiàn)基本的事務(wù)的一致性。
除了以上這些大方向的差異,還有一個(gè)小的差異,比如SQL一般會(huì)將數(shù)據(jù)持久化到硬盤中,而非關(guān)系型數(shù)據(jù)庫(kù)會(huì)將數(shù)據(jù)暫時(shí)存儲(chǔ)在內(nèi)存中,當(dāng)觸發(fā)持久化的操作的時(shí)候,才會(huì)真正的將數(shù)據(jù)落盤。以及在關(guān)系型數(shù)據(jù)庫(kù)設(shè)計(jì)之初,就并沒(méi)有為分布式做考慮,也就是說(shuō),當(dāng)你需要提升數(shù)據(jù)庫(kù)的性能的時(shí)候,只能不斷地增加本機(jī)的性能,這種方式就是垂直擴(kuò)展。但是NoSQL之所以現(xiàn)在發(fā)展的很快,就是因?yàn)樗钌狭舜髷?shù)據(jù)的快車,大數(shù)據(jù)的對(duì)于數(shù)據(jù)的要求量非常的大,所以大數(shù)據(jù)的組件一開始的設(shè)計(jì)就是為了能夠水平擴(kuò)展,也就是由多臺(tái)設(shè)備組成一個(gè)集群,從而協(xié)同運(yùn)作提升效率,NoSQL的數(shù)據(jù)庫(kù)也滿足這一分布式的特性,從而和大數(shù)據(jù)一拍即合。
當(dāng)然,根據(jù)不同的業(yè)務(wù)需求去選擇不同的數(shù)據(jù)庫(kù)也是非常重要的,所以了解了這些兩者的不同點(diǎn)之后才能更好地發(fā)揮不同組件的作用。