1. 程式人生 > >NoSQL—非關係型資料庫Redis和MongoDB的應用

NoSQL—非關係型資料庫Redis和MongoDB的應用

回顧下基礎,什麼是NoSQL

NoSQL,即Not Only SQL,指的是非關係型的這一類資料庫,它與關係型資料庫的區別主要在於資料儲存結構的不同,關係型資料庫採用的結構化的資料,NoSQL採用的是鍵值對的方式儲存資料,NoSQL主要用於解決web2.0中出現的超大規模和高併發資料存取效能問題

為什麼使用NoSQL
1、超大規模,高併發讀寫,High performance
2、海量資料的高效率儲存和訪問 huge Storage
3、高可擴充套件性和高可用性 High Scalability High Availability

NoSQL的特點:
1、易擴充套件(資料間沒關係)
2、大資料量、高效能讀寫,
3、靈活的資料模型,不需建立欄位
4、高可用

  因此,在處理非結構化/半結構化的大資料時;在水平方向上進行擴充套件時;隨時應對動態增加的資料項時可以優先考慮使用NoSQL資料庫。
  在考慮資料庫的成熟度;支援;分析和商業智慧;管理及專業性等問題時,應優先考慮關係型資料庫。

分類:NoSQL資料庫產品分為鍵值(Key-Value)儲存資料庫、列儲存資料庫、文件型資料庫圖形(Graph)資料庫四大類

分類

Examples舉例

典型應用場景

資料模型

優點

缺點

鍵值(key-value)

Tokyo Cabinet/Tyrant, Redis, Voldemort, Oracle BDB

內容快取,主要用於處理大量資料的高訪問負載,也用於一些日誌系統等等。

Key 指向 Value 的鍵值對,通常用hash table來實現

查詢速度快

資料無結構化,通常只被當作字串或者二進位制資料

列儲存資料庫

Cassandra, HBase, Riak

分散式的檔案系統

以列簇式儲存,將同一列資料存在一起

查詢速度快,可擴充套件性強,更容易進行分散式擴充套件

功能相對侷限

文件型資料庫

CouchDB, MongoDb

Web應用(與Key-Value類似,Value是結構化的,不同的是資料庫能夠了解Value的內容)

Key-Value對應的鍵值對,Value為結構化資料

資料結構要求不嚴格,表結構可變,不需要像關係型資料庫一樣需要預先定義表結構

查詢效能不高,而且缺乏統一的查詢語法。

圖形(Graph)資料庫

Neo4J, InfoGrid, Infinite Graph

社交網路,推薦系統等。專注於構建關係圖譜

圖結構

利用圖結構相關演算法。比如最短路徑定址,N度關係查詢等

很多時候需要對整個圖做計算才能得出需要的資訊,而且這種結構不太好做分散式的叢集方案



先說說Redis

用C語言開發的可基於記憶體亦可持久化日誌型、Key-Value型開源資料庫,並提供多種語言的API 。被稱為資料結構伺服器

應用場景:
1、快取,資料查詢,聊天室線上好友列表
2、任務佇列 搶購,
3、網站訪問統計
4、應用排行榜
5、資料過期處理 精確到毫秒
6、分散式叢集架構中的session分離

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

Redis支援主從同步。資料可以從主伺服器向任意數量的從伺服器上同步,從伺服器可以是關聯其他從伺服器的主伺服器。這使得Redis可執行單層樹複製。存檔可以有意無意的對資料進行寫操作。由於完全實現了釋出/訂閱機制,使得從資料庫在任何地方同步樹時,可訂閱一個頻道並接收主伺服器完整的訊息釋出記錄。同步對讀取操作的可擴充套件性和資料冗餘很有幫助。

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

mongoDB 

特點:(1)面向文件(2)高效能(3)高可用(4)易擴充套件(5)豐富的查詢語言

MongoDB 是一個基於分散式檔案儲存的資料庫。由 C++ 語言編寫。旨在為 WEB 應用提供可擴充套件的高效能資料儲存解決方案,是一個介於關係資料庫和非關係資料庫之間的產品,是非關係資料庫當中功能最豐富,最像關係資料庫的。

適合場景:事件記錄、內容管理或者部落格平臺,比如評論系統。

mongoDB 是一種文件性的資料庫。先解釋一下文件的資料庫,即可以存放xml、json、bson型別系那個的資料。

這些資料具備自述性(self-describing),呈現分層的樹狀資料結構。redis可以用hash存放簡單關係型資料。

mongoDB 存放json格式資料。

總的來說,redis:適用於資料量較小的追求效能的操作和運算上,MongoDB:主要解決海量資料的訪問效率問題