關係型資料庫(Relational Database)與非關係型資料庫(NoSQL)的區別:(MySQL,Redis,Memcache,MongoDB)

2020-10-12 11:00:29

Table of Contents

關係型資料庫(Relational Database)

什麼是關聯式資料庫

什麼是SQL?

關聯式資料庫的結構

關係模型

關聯式資料庫的好處

資料一致性

隔離性和原子性

ACID和關聯式資料庫

儲存過程和關聯式資料庫

資料庫鎖定和並行

選擇關聯式資料庫時要尋找什麼

未來的關聯式資料庫

非關係型資料庫 - Nosql介紹

NoSQL資料庫的型別是什麼?

NoSQL資料庫如何工作

Nosql和關係型資料庫的區別

1.儲存方式

2.儲存結構

3.儲存規範

4.儲存擴充套件

5.查詢方式

6.事務

7.效能

8.授權方式

ACID理論

1. 原子性

2. 一致性

3. 隔離性

4. 永續性

Redis,Memcache,MongoDb的特點與區別

Redis

優點

缺點

Memcache

優點

缺點

MongoDB

優點

缺點

Redis、Memcache和MongoDB的區別

1.效能

2.便利性

3.儲存空間

4.可用性

5.可靠性

6.一致性

7.資料分析

8.應用場景

Redis 簡介

Redis 優勢


 

關係型資料庫(Relational Database)


什麼是關聯式資料庫

關聯式資料庫是一種型別的資料庫,其儲存並提供存取被彼此相關的資料點。關聯式資料庫基於關係模型,這是一種在表中表示資料的直觀,直接的方法。在關聯式資料庫中,表中的每一行都是一條記錄,該記錄具有唯一的ID(稱為key)。該表的列儲存資料的屬性,每個記錄通常為每個屬性都有一個值,這使得在資料點之間建立關係變得容易。

 

什麼是SQL?


現在我們已經瞭解了NoSQL資料庫,讓我們將它們與傳統上最流行的資料庫進行對比:SQL(結構化查詢語言)存取的關聯式資料庫。與關聯式資料庫互動時可以使用SQL,在關聯式資料庫中資料儲存在具有固定列和行的表中。

SQL資料庫在1970年代初開始流行。當時,儲存非常昂貴,因此軟體工程師對他們的資料庫進行規範化以減少資料重複。

1970年代的軟體工程師通常也遵循瀑布式軟體開發模型。在開始開發之前,詳細計劃了專案。軟體工程師精心建立複雜的實體關係(ER)圖,以確保他們仔細考慮了需要儲存的所有資料。由於採用了這種預先計劃模型,如果在開發週期中需求發生變化,軟體工程師就難以適應。結果,專案經常超出預算,超過了截止日期,無法滿足使用者需求。 -- https://www.mongodb.com/nosql-explained

 

關聯式資料庫的結構


關係模型意味著邏輯資料結構(資料表,檢視和索引)與物理儲存結構是分開的。這種分離意味著資料庫管理員可以管理物理資料儲存,而不會影響對作為邏輯結構的資料的存取。例如,重新命名資料庫檔案不會重新命名儲存在其中的表。

邏輯操作和物理操作之間的區別也適用於資料庫操作,這是明確定義的操作,使應用程式能夠操縱資料庫的資料和結構。邏輯操作允許應用程式指定其所需的內容,而物理操作則確定應如何存取該資料然後執行任務。

為了確保資料始終準確且可存取,關聯式資料庫遵循某些完整性規則。例如,完整性規則可以指定不允許在表中重複行,以消除潛在的錯誤資訊進入資料庫的可能性。

 

關係模型


在資料庫的早期,每個應用程式都以自己獨特的結構儲存資料。當開發人員想要構建使用該資料的應用程式時,他們必須對特定的資料結構瞭解很多,才能找到所需的資料。這些資料結構效率低下,難以維護且難以優化以提供良好的應用程式效能。設計關聯式資料庫模型是為了解決多個任意資料結構的問題。

關係模型提供了表示和查詢可被任何應用程式使用的資料的標準方式。從一開始,開發人員就認識到關聯式資料庫模型的主要優勢在於表的使用,這是一種儲存,存取結構化資訊的直觀,有效且靈活的方式。

隨著時間的流逝,隨著開發人員開始使用結構化查詢語言(SQL)在資料庫中寫入和查詢資料,關係模型的另一優勢出現了。多年來,SQL已被廣泛用作資料庫查詢的語言。SQL基於關係代數,提供了一種內部一致的數學語言,可以更輕鬆地提高所有資料庫查詢的效能。相比之下,其他方法必須定義單個查詢。

 

關聯式資料庫的好處


所有型別和規模的組織都使用簡單而強大的關係模型來滿足各種資訊需求。關聯式資料庫用於跟蹤庫存,處理電子商務交易,管理大量關鍵任務客戶資訊等等。可以考慮將關聯式資料庫用於資料點彼此相關的任何資訊需求,並且必須以安全,基於規則的一致方式進行管理。

關聯式資料庫自1970年代就已經存在。如今,關係模型的優勢繼續使其成為資料庫中最廣泛接受的模型。

 

資料一致性


關係模型最適合維護應用程式和資料庫副本(稱為範例)之間的資料一致性。例如,當客戶在ATM機上存錢,然後檢視手機上的帳戶餘額時,客戶希望看到該筆存款會立即反映在更新的帳戶餘額中。關聯式資料庫在這種資料一致性方面表現出色,可確保資料庫的多個範例始終具有相同的資料。

對於其他型別的資料庫,很難與大量資料保持這種及時的一致性。最近的某些資料庫(例如NoSQL)只能提供「最終一致性」。根據此原理,在擴充套件資料庫或多個使用者同時存取同一資料時,資料需要一些時間來「追趕」。最終的一致性對於某些用途是可以接受的,例如在產品目錄中維護列表,但是對於關鍵業務操作(例如購物車交易),關聯式資料庫仍然是黃金標準。

 

隔離性和原子性


關聯式資料庫在非常細粒度的級別上處理業務規則和策略,並具有關於隔離嚴格策略(即,永久更改資料庫)。例如,考慮一個庫存資料庫,該資料庫跟蹤始終一起使用的三個部分。從庫存中拉出一個零件時,還必須拉出另外兩個。如果這三個部分之一不可用,則不應該拉扯任何一個部分-資料庫作出任何隔離之前,所有三個部分都必須可用。關聯式資料庫在知道可以對所有三個資料庫都提交之前,不會提交一部分。這種多方面的隔離能力稱為原子性。原子性是確保資料庫中資料準確並確保其符合業務規則,法規和政策的關鍵。

 

ACID和關聯式資料庫


定義關聯式資料庫事務的四個關鍵屬性是:原子性,一致性,隔離性和永續性(通常稱為ACID)

  • 原子性定義了構成完整資料庫事務的所有元素。
  • 一致性定義了在事務之後將資料點保持在正確狀態的規則。
  • 隔離使事務的效果對其他人不可見,直到提交為止,以避免混淆。
  • 永續性可確保一旦提交事務,資料更改將成為永久性的。
  1. Atomic:All operations in a transaction succeed or every operation is rolled back.
  2. Consistent:On the completion of a transaction, the database is structurally sound.
  3. Isolated:Transactions do not contend with one another. Contentious access to data is moderated by the database so that transactions appear to run sequentially.
  4. Durable:The results of applying a transaction are permanent, even in the presence of failures.
  • Atomic:事務中的所有操作都會成功,或者每個操作都會回滾。
  • 一致的:事務完成後,資料庫在結構上是健全的。
  • 孤立:交易不相互競爭。資料庫對有爭議的資料存取進行仲裁,以便事務似乎按順序執行。
  • 永續性:即使存在故障,應用事務的結果也是永久的。

 

儲存過程和關聯式資料庫


資料存取涉及許多重複操作。例如,從資料表中獲取資訊的簡單查詢可能需要重複數百或數千次才能產生所需的結果。這些資料存取功能需要某種型別的程式碼才能存取資料庫。應用程式開發人員不想在每個新應用程式中為這些功能編寫新程式碼。幸運的是,關聯式資料庫允許儲存過程,這是可以通過簡單的應用程式呼叫存取的程式碼塊。例如,單個儲存過程可以為多個應用程式的使用者提供一致的記錄標記。儲存過程還可以幫助開發人員確保以特定方式實現應用程式中的某些資料功能。

 

資料庫鎖定和並行


當多個使用者或應用程式試圖同時更改同一資料時,資料庫中可能會發生衝突。鎖定和並行技術可在保持資料完整性的同時減少發生衝突的可能性。

鎖定可防止其他使用者和應用程式在更新資料時存取資料。在某些資料庫中,鎖定適用於整個表,這會對應用程式效能產生負面影響。其他資料庫(例如Oracle關聯式資料庫)在記錄級別應用鎖,使表中的其他記錄可用,從而有助於確保更好的應用程式效能。

當多個使用者或應用程式同時在同一資料庫上呼叫查詢時,並行管理活動。根據為資料控制定義的策略,此功能提供了對使用者和應用程式的正確存取。

 

選擇關聯式資料庫時要尋找什麼


用於儲存,管理,查詢和檢索關聯式資料庫中儲存的資料的軟體稱為關聯式資料庫管理系統(RDBMSf)(《RDBMS即關聯式資料庫管理系統(Relational Database Management System)》)。RDBMS提供使用者與應用程式和資料庫之間的介面,以及用於管理資料儲存,存取和效能的管理功能。

在資料庫型別和關聯式資料庫產品之間進行選擇時,有幾個因素可以指導您做出決定。您選擇的RDBMS將取決於您的業務需求。問問自己以下問題:

  • 我們的資料準確性要求是什麼?資料儲存和準確性將取決於業務邏輯嗎?我們的資料對準確性是否有嚴格的要求(例如,財務資料和政府報告)?
  • 我們需要可延伸性嗎?要管理的資料規模是多少?預期的增長量是多少?資料庫模型是否需要支援映象資料庫副本(作為單獨的範例)以實現可伸縮性?如果是這樣,它可以在這些範例之間保持資料一致性嗎?
  • 並行有多重要?多個使用者和應用程式是否需要同時進行資料存取?資料庫軟體在保護資料的同時是否支援並行?
  • 我們對效能和可靠性有何需求?我們需要高效能,高可靠性的產品嗎?查詢響應效能有哪些要求?供應商對服務水平協定(SLA)或計劃外停機的隔離是什麼?

 

未來的關聯式資料庫


多年來,關聯式資料庫已經變得越來越好,越來越快,越來越強大並且更易於使用。但是它們也變得更加複雜,並且管理資料庫長期以來一直是一項全職工作。開發人員必須將大部分時間花在優化資料庫效能所需的管理活動上,而不是將他們的專業知識用於開發可為業務帶來價值的創新應用程式。

如今,自主技術正在利用關係模型的優勢來提供新型的關聯式資料庫。該資料庫(又稱獨立資料庫)維護權力和關係模型的優點,但採用人工智慧(AI),機器學習和自動化監控和提高查詢效能和管理任務。例如,為了提高查詢效能,自動駕駛資料庫可以對索引進行假設和測試,以加快查詢速度,然後將最佳查詢推入生產環境(全部依靠自己)。自動駕駛資料庫無需人工干預即可連續進行這些改進。

自主技術使開發人員擺脫了管理資料庫的繁瑣任務。例如,他們不再需要預先確定基礎架構要求。相反,使用自動駕駛資料庫,他們可以根據需要新增儲存和計算資源以支援資料庫增長。僅需幾個步驟,開發人員就可以輕鬆建立自治的關聯式資料庫,從而加快了應用程式開發的時間。

 

非關係型資料庫 - Nosql介紹


Nosql的全稱是Not Only Sql,這個概念早起就有人提出,在09年的時候比較火。Nosql指的是非關係型資料庫,而我們常用的都是關係型資料庫。就像我們常用的mysql,sqlserver一樣,這些資料庫一般用來儲存重要資訊,應對普通的業務是沒有問題的。但是,隨著網際網路的高速發展,傳統的關係型資料庫在應付超大規模,超大流量以及高並行的時候力不從心。而就在這個時候,Nosql得到的告訴的發展。

人們使用「 NoSQL資料庫」一詞時,通常會使用它來指代任何非關聯式資料庫。有人說「 NoSQL」代表「非SQL」,而另一些人則說「不僅SQL」。無論哪種方式,大多數人都認為NoSQL資料庫是以關係表以外的格式儲存資料的資料庫。

一個常見的誤解是NoSQL資料庫或非關聯式資料庫不能很好地儲存關係資料。NoSQL資料庫可以儲存關係資料-它們與關聯式資料庫的儲存方式不同。實際上,與SQL資料庫相比,許多人發現NoSQL資料庫中的建模關係資料比SQL資料庫中的建模關係資料更容易,因為不必在表之間拆分相關資料。

NoSQL資料模型允許將相關資料巢狀在單個資料結構中。

隨著儲存成本的急劇下降,NoSQL資料庫出現在2000年代後期。僅出於減少資料重複的目的而建立複雜,難以管理的資料模型的日子已經一去不復返了。開發人員(而非儲存人員)已成為軟體開發的主要成本,因此NoSQL資料庫針對開發人員的生產力進行了優化。 -- https://www.mongodb.com/nosql-explained

隨著儲存成本迅速降低,儲存和查詢所需的資料應用程式數量也增加了。這些資料具有各種形狀和大小(結構化,半結構化和多型性),因此預先定義架構幾乎變得不可能。NoSQL資料庫允許開發人員儲存大量非結構化資料,從而為他們提供了很大的靈活性。

此外,敏捷越來越受歡迎,軟體工程師也在重新考慮他們開發軟體的方式。他們認識到需要快速適應不斷變化的需求。他們需要能夠快速迭代並在整個軟體堆疊中進行更改(一直到資料庫模型)的能力。NoSQL資料庫為他們提供了這種靈活性。

雲端計算也越來越流行,開發人員開始使用公共雲來託管其應用程式和資料。他們希望能夠在多個伺服器和區域之間分佈資料,以使其應用程式具有彈性,可以橫向擴充套件而不是縱向擴充套件以及對資料進行智慧地理定位。一些NoSQL資料庫(如MongoDB)提供了這些功能。

 

NoSQL資料庫的型別是什麼?

https://www.mongodb.com/nosql-explained


隨著時間的流逝,出現了四種主要的NoSQL資料庫型別: 檔案資料庫鍵值資料庫寬列儲存圖形資料庫。讓我們檢查每種型別。

  • 檔案資料庫將資料儲存在類似於JSON(JavaScript物件符號)物件的檔案中。每個檔案包含成對的欄位和值。這些值通常可以是多種型別,包括字串,數位,布林值,陣列或物件之類的東西,並且它們的結構通常與開發人員在程式碼中使用的物件保持一致。由於它們的欄位值型別和強大的查詢語言多種多樣,因此檔案資料庫非常適合各種各樣的用例,並且可以用作通用資料庫。他們可以水平擴充套件以適應巨量資料量。根據DB引擎,MongoDB一直被評為全球最受歡迎的NoSQL資料庫,並且是檔案資料庫的一個範例。有關檔案資料庫的更多資訊,請存取什麼是檔案資料庫?
  • 鍵值資料庫是一種較簡單的資料庫,其中每個專案都包含鍵和值。通常只能通過參照值來檢索值,因此學習如何查詢特定鍵值對通常很簡單。鍵值資料庫非常適合需要儲存大量資料但無需執行復雜查詢來檢索資料的用例。常見的用例包括儲存使用者偏好設定或快取。Redis和DynanoDB是流行的鍵值資料庫。
  • 寬列儲存將資料儲存在表,行和動態列中。寬列儲存提供了比關聯式資料庫更大的靈活性,因為不需要每一行都具有相同的列。許多人認為寬列儲存是二維鍵值資料庫。寬列儲存非常適合需要儲存大量資料並且可以預測查詢模式的情況。寬列儲存通常用於儲存物聯網資料和使用者組態檔資料。Cassandra和HBase是最受歡迎的兩家寬列商店。
  • 圖形資料庫將資料儲存在節點和邊中。節點通常儲存有關人物,地點和事物的資訊,而邊緣則儲存有關節點之間的關係的資訊。在需要遍歷關係以查詢模式(例如社群網路,欺詐檢測和推薦引擎)的用例中,圖形資料庫非常出色。Neo4j和JanusGraph是圖形資料庫的範例。

 

NoSQL資料庫如何工作

https://www.mongodb.com/nosql-explained


從設計角度理解NoSQL資料庫的吸引力的一種方法是,在使用地址資料的過於簡化的範例中,檢視SQL和NoSQL資料庫的資料模型的外觀。

SQL案例。 對於SQL資料庫,從地址的邏輯結構開始建立用於地址的資料庫,並且期望要儲存的記錄將保持相對不變。在分析了預期的查詢模式之後,SQL資料庫可能會優化兩個表中的儲存,一個用於基本資訊,另一個用於成為客戶,姓氏是兩個表的鍵。每個表中的每一行都是一個客戶,每列具有以下固定屬性:

  • 姓氏::名字::中間名首字母::位址列位::電子郵件地址::電話號碼
  • 姓氏::生日::帳號::客戶年份::溝通偏好

NoSQL案例。在上面的NoSQL資料庫型別一節中,描述了四種型別,每種都有自己的資料模型。

每種NoSQL資料庫的設計都應考慮到特定的客戶情況,並且會因技術原因而組織每種型別的資料庫。描述最簡單的型別是檔案資料庫,在其中將基本資訊和客戶資訊都組合在一個JSON檔案中是很自然的。在這種情況下,每個SQL列屬性將是欄位,而客戶記錄的詳細資訊將是與每個欄位關聯的資料值。

例如:Last_name: "Jones", First_name: "Mary", Middle_initial: "S",等等

嘗試NoSQL資料庫

如果您想嘗試NoSQL資料庫,MongoDB Atlas是一個不錯的起點。Atlas是由MongoDB完全管理的資料庫服務,並且在所有領先的雲提供商中都可用。阿特拉斯(Atlas)有一個永久的層,您可以用來踢輪胎並瞭解基礎知識。當您準備超越免費套餐時,可以使用程式碼NOSQLEXPLAINED獲得200美元的Atlas積分。

不確定擁有Atlas帳戶後該怎麼辦?前往MongoDB大學,您可以從MongoDB工程師那裡獲得免費的線上培訓。MongoDB大學的課程註冊已超過140萬。該快速入門教學是另一個偉大的地方開始,因為他們會幫助你起床,並與喜愛的程式語言快速執行。

 

Nosql和關係型資料庫的區別


1.儲存方式

  關係型資料庫是表格式的,因此儲存在表的行和列中。他們之間很容易關聯共同作業儲存,提取資料很方便。而Nosql資料庫則與其相反,他是大塊的組合在一起。通常儲存在資料集中,就像檔案、鍵值對或者圖結構。

2.儲存結構

  關係型資料庫對應的是結構化資料,資料表都預先定義了結構(列的定義),結構描述了資料的形式和內容。這一點對資料建模至關重要,雖然預定義結構帶來了可靠性和穩定性,但是修改這些資料比較困難。而Nosql資料庫基於動態結構,使用與非結構化資料。因為Nosql資料庫是動態結構,可以很容易適應資料型別和結構的變化。

3.儲存規範

  關係型資料庫的資料儲存為了更高的規範性,把資料分割為最小的關係表以避免重複,獲得精簡的空間利用。雖然管理起來很清晰,但是單個操作設計到多張表的時候,資料管理就顯得有點麻煩。而Nosql資料儲存在平面資料集中,資料經常可能會重複。單個資料庫很少被分隔開,而是儲存成了一個整體,這樣整塊資料更加便於讀寫

4.儲存擴充套件

  這可能是兩者之間最大的區別,關係型資料庫是縱向擴充套件,也就是說想要提高處理能力,要使用速度更快的計算機。因為資料儲存在關係表中,操作的效能瓶頸可能涉及到多個表,需要通過提升計算機效能來克服。雖然有很大的擴充套件空間,但是最終會達到縱向擴充套件的上限。而Nosql資料庫是橫向擴充套件的它的儲存天然就是分散式的,可以通過給資源池新增更多的普通資料庫伺服器來分擔負載。

橫向擴充套件是已擴充套件伺服器的數量進行高並行的處理(增強處理業務的能力)

根據設定nginx的反向代理,轉發伺服器(設定的ip)進行輪換處理業務(可加入負載均衡器進行分發請求)

縱向擴充套件,是增加單機的處理能力,一般增加cpu的處理能力

5.查詢方式

  關係型資料庫通過結構化查詢語言來運算元據庫(就是我們通常說的SQL)。SQL支援資料庫CURD操作的功能非常強大,是業界的標準用法。而Nosql查詢以塊為單元運算元據,使用的是非結構化查詢語言(UnQl),它是沒有標準的。關係型資料庫表中主鍵的概念對應Nosql中儲存檔案的ID。關係型資料庫使用預定義優化方式(比如索引)來加快查詢操作,而Nosql更簡單更精確的資料存取模式。

6.事務

  關係型資料庫遵循ACID規則(原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、永續性(Durability)),而Nosql資料庫遵循BASE原則(基本可用(Basically Availble)、軟/柔性事務(Soft-state )、最終一致性(Eventual Consistency))。由於關係型資料庫的資料強一致性,所以對事務的支援很好。關係型資料庫支援對事務原子性細粒度控制,並且易於回滾事務。而Nosql資料庫是在CAP(一致性、可用性、分割區容忍度)中任選兩項,因為基於節點的分散式系統中,很難全部滿足,所以對事務的支援不是很好,雖然也可以使用事務,但是並不是Nosql的閃光點。

7.效能

  關係型資料庫為了維護資料的一致性付出了巨大的代價,讀寫效能比較差。在面對高並行讀寫效能非常差,面對海量資料的時候效率非常低。而Nosql儲存的格式都是key-value型別的,並且儲存在記憶體中,非常容易儲存,而且對於資料的 一致性是 弱要求。Nosql無需sql的解析,提高了讀寫效能。

8.授權方式

  關係型資料庫通常有SQL Server,Mysql,Oracle。主流的Nosql資料庫有redis,memcache,MongoDb。大多數的關係型資料庫都是付費的並且價格昂貴,成本較大,而Nosql資料庫通常都是開源的。

 

柔性事務滿足Base理論(基本可用、最終一致性)、CAP理論。

剛性事務滿足ACID理論。

 

ACID理論


1. 原子性


原子性是指事務是一個不可再分割的工作單元,事務中的操作要麼都發生,要麼都不發生。可採用「A向B轉賬」這個例子來說明解釋。在DBMS中,預設情況下一條SQL就是一個單獨事務,事務是自動提交的。只有顯式的使用start transaction開啟一個事務,才能將一個程式碼塊放在事務中執行。

 

2. 一致性


一致性是指在事務開始之前和事務結束以後資料庫的完整性約束沒有被破壞。這是說資料庫事務不能破壞關係資料的完整性以及業務邏輯上的一致性

如A給B轉賬,不論轉賬的事務操作是否成功,其兩者的存款總額不變(這是業務邏輯的一致性,至於資料庫關係約束的完整性就更好理解了)。

保障機制(也從兩方面著手):資料庫層面會在一個事務執行之前和之後,資料會符合你設定的約束唯一約束,外來鍵約束,check約束等)和觸發器設定;此外,資料庫的內部資料結構(如 B 樹索引或雙向連結串列)都必須是正確的。業務的一致性一般由開發人員進行保證,亦可轉移至資料庫層面。

 

3. 隔離性


多個事務並行存取時,事務之間是隔離的,一個事務不應該影響其它事務執行效果。

在並行環境中,當不同的事務同時操縱相同的資料時,每個事務都有各自的完整資料空間。由並行事務所做的修改必須與任何其他並行事務所做的修改隔離。事務檢視資料更新時,資料所處的狀態要麼是另一事務修改它之前的狀態,要麼是另一事務修改它之後的狀態,事務不會檢視到中間狀態的資料

事務最複雜問題都是由事務隔離性引起的。完全的隔離性是不現實的,完全的隔離性要求資料庫同一時間只執行一條事務,這樣會嚴重影響效能。

關於隔離性中的事務隔離等級(事務之間影響),參見相應博文

 

4. 永續性


這是最好理解的一個特性:永續性,意味著在事務完成以後,該事務所對資料庫所作的更改便持久的儲存在資料庫之中,並不會被回滾。(完成的事務是系統永久的部分,對系統的影響是永久性的,該修改即使出現致命的系統故障也將一直保持)

write ahead logging:SQL Server中使用了WAL(Write-Ahead Logging)技術來保證事務紀錄檔的ACID特性,在資料寫入到資料庫之前,先寫入到紀錄檔,再將紀錄檔記錄變更到記憶體中。

 

Redis,Memcache,MongoDb的特點與區別


Redis


優點

  • 1.支援多種資料結構,如 string(字串)、 list(雙向連結串列)、dict(hash表)、set(集合)、zset(排序set)、
  • 2.支援持久化操作,可以進行aof及rdb資料持久化到磁碟,從而進行資料備份或資料恢復等操作,較好的防止資料丟失  的手段。
  • 3.支援通過Replication進行資料複製,通過master-slave機制,可以實時進行資料的同步複製,支援多級複製和增量複製,master-slave機制是Redis進行HA的重要手段。
  • 4.單執行緒請求,所有命令序列執行,並行情況下不需要考慮資料一致性問題。
  • 5.支援pub/sub訊息訂閱機制,可以用來進行訊息訂閱與通知。
  • 6.支援簡單的事務需求,但業界使用場景很少,並不成熟。

缺點

  • 1.Redis只能使用單執行緒,效能受限於CPU效能,故單範例CPU最高才可能達到5-6wQPS每秒(取決於資料結構,資料大小以及伺服器硬體效能,日常環境中QPS高峰大約在1-2w左右)。
  • 2.支援簡單的事務需求,但業界使用場景很少,並不成熟,既是優點也是缺點。
  • 3.Redis在string型別上會消耗較多記憶體,可以使用dict(hash表)壓縮儲存以降低記憶體耗用。

 

Memcache


優點

  • 1.Memcached可以利用多核優勢,單範例吞吐量極高,可以達到幾十萬QPS(取決於key、value的位元組大小以及伺服器硬體效能,日常環境中QPS高峰大約在4-6w左右)。適用於最大程度扛量。
  • 2.支援直接設定為session handle。

缺點

  • 1只支援簡單的key/value資料結構,不像Redis可以支援豐富的資料型別。
  • 2.無法進行持久化,資料不能備份,只能用於快取使用,且重新啟動後資料全部丟失。
  • 3.無法進行資料同步,不能將MC中的資料遷移到其他MC範例中。
  • 4.Memcached記憶體分配採用Slab Allocation機制管理記憶體,value大小分佈差異較大時會造成記憶體利用率降低,並引發低利用率時依然出現踢出等問題。需要使用者注重value設計。

 

MongoDB


優點

  • 1.更高的寫負載,MongoDB擁有更高的插入速度。
  • 2.處理很大的規模的單表,當資料表太大的時候可以很容易的分割表。
  • 3.高可用性,設定M-S不僅方便而且很快,MongoDB還可以快速、安全及自動化的實現節點(資料中心)故障轉移。
  • 4.快速的查詢,MongoDB支援二維空間索引,比如管道,因此可以快速及精確的從指定位置獲取資料。MongoDB在啟動後會將資料庫中的資料以檔案對映的方式載入到記憶體中。如果記憶體資源相當豐富的話,這將極大地提高資料庫的查詢速度。
  • 5.非結構化資料的爆發增長,增加列在有些情況下可能鎖定整個資料庫,或者增加負載從而導致效能下降,由於MongoDB的弱資料結構模式,新增1個新欄位不會對舊錶格有任何影響,整個過程會非常快速。

缺點

  • 1.不支援事務。
  • 2.MongoDB佔用空間過大 。
  • 3.MongoDB沒有成熟的維護工具。

 

Redis、Memcache和MongoDB的區別


1.效能

  • 三者的效能都比較高,總的來講:Memcache和Redis差不多,要高於MongoDB。

2.便利性

  • memcache資料結構單一。
  • redis豐富一些,資料操作方面,redis更好一些,較少的網路IO次數。
  • mongodb支援豐富的資料表達,索引,最類似關係型資料庫,支援的查詢語言非常豐富。

3.儲存空間

  • redis在2.0版本後增加了自己的VM特性,突破實體記憶體的限制;可以對key value設定過期時間(類似memcache)。
  • memcache可以修改最大可用記憶體,採用LRU演演算法。
  • mongoDB適合巨量資料量的儲存,依賴作業系統VM做記憶體管理,吃記憶體也比較厲害,服務不要和別的服務在一起。

4.可用性

  • redis,依賴使用者端來實現分散式讀寫;主從複製時,每次從節點重新連線主節點都要依賴整個快照,無增量複製,因效能和效率問題,所以單點問題比較複雜;不支援自動sharding,需要依賴程式設定一致hash 機制。一種替代方案是,不用redis本身的複製機制,採用自己做主動複製(多份儲存),或者改成增量複製的方式(需要自己實現),一致性問題和效能的權衡。
  • Memcache本身沒有資料冗餘機制,也沒必要;對於故障預防,採用依賴成熟的hash或者環狀的演演算法,解決單點故障引起的抖動問題。
  • mongoDB支援master-slave,replicaset(內部採用paxos選舉演演算法,自動故障恢復),auto sharding機制,對使用者端遮蔽了故障轉移和切分機制。

5.可靠性

  • redis支援(快照、AOF):依賴快照進行持久化,aof增強了可靠性的同時,對效能有所影響。
  • memcache不支援,通常用在做快取,提升效能。
  • MongoDB從1.8版本開始採用binlog方式支援持久化的可靠性。

6.一致性

  • Memcache 在並行場景下,用cas保證一致性。
  • redis事務支援比較弱,只能保證事務中的每個操作連續執行。
  • mongoDB不支援事務。

7.資料分析

  • mongoDB內建了資料分析的功能(mapreduce),其他兩者不支援。

8.應用場景

  • redis:資料量較小的更效能操作和運算上。
  • memcache:用於在動態系統中減少資料庫負載,提升效能;做快取,提高效能(適合讀多寫少,對於資料量比較大,可以採用sharding)。
  • Mongodb:主要解決海量資料的存取效率問題

 

 

Redis 簡介


Redis 是完全開源免費的,遵守BSD協定,是一個高效能的key-value資料庫。

Redis 與其他 key - value 快取產品有以下三個特點:

  • Redis支援資料的持久化,可以將記憶體中的資料儲存在磁碟中,重新啟動的時候可以再次載入進行使用。
  • Redis不僅僅支援簡單的key-value型別的資料,同時還提供list,set,zset,hash等資料結構的儲存。
  • Redis支援資料的備份,即master-slave模式的資料備份。

 

Redis 優勢


  • 效能極高 – Redis能讀的速度是110000次/s,寫的速度是81000次/s 。
  • 豐富的資料型別 – Redis支援二進位制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 資料型別操作。
  • 原子 – Redis的所有操作都是原子性的,意思就是要麼成功執行要麼失敗完全不執行。單個操作是原子性的。多個操作也支援事務,即原子性,通過MULTI和EXEC指令包起來。
  • 豐富的特性 – Redis還支援 publish/subscribe, 通知, key 過期等等特性。

《Redis架構概述》https://rtoax.blog.csdn.net/article/details/107917429

《Redis與Memcached的對比》https://rtoax.blog.csdn.net/article/details/108614104

《Redis與MySQL的雙劍合璧,一文讀懂redis》https://rtoax.blog.csdn.net/article/details/108614373

《Redis快取持久化:RDB持久化和AOF持久化》https://rtoax.blog.csdn.net/article/details/108729843

《Redis:使用Redis的分散式鎖》https://rtoax.blog.csdn.net/article/details/108657676

 

相關NoSQL資源