1. 程式人生 > >關係型資料庫和非關係型資料庫(MongoDB和redis對比)

關係型資料庫和非關係型資料庫(MongoDB和redis對比)

1.關係型資料庫和非關係型資料庫的區別(優缺點,適用環境)
2.部落格為什麼是mongodb

1.關係型

代表資料庫系統:MySQL, SQL Server, Oracle,
關係型資料庫的表是二維表,結構穩定,修改不易。經常需要聯表查詢。

優點:
1.查詢能力高,可以操作很複雜的查詢
2.一致性高。由於併發高,在資料同步的時候一般採用鎖來保證資料的可靠性(還有時間戳什麼的方法),在處理資料的時候對錶進行封鎖來保證操作的時候其他的操作不能改變當前查詢範圍內的資料的值。
3.由於表具有邏輯性,易於理解。
既然它現在有些過氣了(2333)自然有原因,隨著大資料時代的到來,關係型資料庫的嚴謹變得有些不適用:
1.不適用高併發讀寫
2.不適用海量資料高效讀寫
3.層次多,擴充套件性低
4.維護一致性開銷大
5.涉及聯表查詢,複雜,慢

2.非關係型

非關係型資料庫主要是使用key-value的方式儲存資料的,即是『no relational』,這是『顯然』區別於關係型資料庫的特點之一。由於資料間沒有關聯性,相對來說層級扁平。
優點:
1.由於資料之間沒有關係,所以易擴充套件,也易於查詢
2.資料結構靈活,每個資料都可以有不同的結構
3.由於降低了一致性的要求,所以查詢速度更快

非關係型資料庫的產生是因為隨著網站的進化,併發性增加,擴充套件性高,一致性要求降低。這樣關係型資料庫最重要的一致性維護就顯得有點多餘,並且消耗著效能。因此有了非關係型資料庫,它可以算是關係型資料庫的一種弱化的結果,在海量資料儲存和查詢上更勝一籌。
兩種資料庫沒有好壞之分,只是使用的環境不一樣。關係型資料庫可以說是更嚴謹的,可靠性更強的資料庫,在對於資料精度要求高的環境,比如說銀行系統這樣自然是像mysql這樣的資料庫適合。非關係型資料庫勝在處理大資料的速度,但是對於資料的準確度沒有那麼高,對於操作量大的環境比如當前大部分web2.0的網站更加適用一些。

3.Why mongodb

主要比較下mongodb和redis。

MongoDB更類似MySQL,支援欄位索引、遊標操作,其優勢在於查詢功能比較強大,擅長查詢JSON資料,能儲存海量資料,但是不支援事務。

Mysql在大資料量時效率顯著下降,MongoDB更多時候作為關係資料庫的一種替代。

mongodb更吃記憶體,因為當mongo發現記憶體不夠的時候,是以2的指數級別來申請記憶體的。所以一般都建議把mongodb單獨放。
其實可以說redis更像快取機制,cookie,也可以設定資料的過期時間,當然也可以永久儲存(但是好像稍遜色?)。mongodb是文件式的儲存,在類似於部落格系統這樣,可以把每篇部落格,包括日期,評論什麼的都當做一篇文件來看。這樣在部落格資料庫選擇的時候,自然是mongodb更加貼近一些(如果選擇非關係型資料庫), 也相較於redis更適合永久儲存

記憶體管理機制

Redis資料全部存在記憶體,定期寫入磁碟,當記憶體不夠時,可以選擇指定的LRU演算法刪除資料。

MongoDB和mysql一樣,只是把索引檔案放到記憶體中。由linux系統mmap實現,當記憶體不夠時,只將熱點資料放入記憶體,其他資料存在磁碟。
(注:mmap (一種記憶體對映檔案的方法) mmap將一個檔案或者其它物件對映進記憶體。檔案被對映到多個頁上,如果檔案的大小不是所有頁的大小之和,最後一個頁不被使用的空間將會清零。mmap在使用者空間對映呼叫系統中作用很大。)

支援的資料結構

Redis支援的資料結構豐富,包括hash、set、list等。

MongoDB資料結構比較單一,但是支援豐富的資料表達,索引,最類似關係型資料庫,支援的查詢語言非常豐富。

效能

redis更適用於較小資料量的效能及運算

mongodb則在海量資料的訪問下效能更優

可靠性

二者均支援持久化。

叢集

MongoDB叢集技術比較成熟,Redis從3.0開始支援叢集。

不適用場景

Ø 需要使用複雜sql的操作

Ø 事務性系統

轉載
原文

Redis 最佳應用場景:適用於資料變化快且資料庫大小可遇見(適合記憶體容量)的應用程式。

例如:股票價格、資料分析、實時資料蒐集、實時通訊。

MongoDB:最佳應用場景:適用於需要動態查詢支援;需要使用索引而不是 map/reduce功能;需要對大資料庫有效能要求;需要使用 CouchDB但因為資料改變太頻繁而佔滿記憶體的應用程式。

例如:你本打算採用 MySQL或 PostgreSQL,但因為它們本身自帶的預定義欄讓你望而卻步。

簡說mmap:

mmap系統呼叫並不是完全為了用於共享記憶體而設計的。它本身提供了不同於一般對普通檔案的訪問方式,程序可以像讀寫記憶體一樣對普通檔案進行操作。
mmap 系統呼叫使得程序之間通過對映同一個普通檔案實現共享記憶體。普通檔案被對映到程序地址空間後,程序可以像訪問普通記憶體一樣對檔案進行訪問,不必再呼叫。 read(),write()等操作。mmap並不分配空間, 只是將檔案對映到呼叫程序的地址空間裡, 然後你就可以用memcpy(記憶體拷貝)等操作寫檔案, 而不用write()了.寫完後用msync()同步一下(msync():一般說來,程序在對映空間的對共享內容的改變並不直接寫回到磁碟檔案中,往往在呼叫munmap(解除對映關係)後才執行該操作。可以通過呼叫msync()實現磁碟上檔案內容與共享記憶體區的內容一致), 你所寫的內容就儲存到檔案裡了. 不過這種方式沒辦法增加檔案的長度, 因為要對映的長度在呼叫mmap()的時候就決定了。

大資料處理的模型:MapReduce

Mapreduce是一個分散式運算程式的程式設計框架,是使用者開發“基於hadoop的資料分析應用”的核心框架;
Mapreduce核心功能是將使用者編寫的業務邏輯程式碼和自帶預設元件整合成一個完整的分散式運算程式,併發執行在一個hadoop叢集上

MapReduce的處理過程分為兩個步驟:map和reduce。map和reduce函式是要執行的任務,由master分配任務給worker執行。map函式讀取被分配的輸入資料片段,輸出中間key/value pair值的集合,reduce函式收集具有相同中間key值的value值,合併這些value值,形成一個較小的value值的集合。
MapReduce詳解
從零開始學Hadoop——淺析MapReduce(一)