NoSQL數據庫(Not Only SQL),NoSQL,泛指非關系型的數據庫。
一、NoSQL數據庫的四大分類
1、鍵值(Key-Value)存儲數據庫
這一類數據庫主要會使用到一個
哈希表,這個表中有一個特定的鍵和一個指針指向特定的數據。Key/value模型對於IT系統來說的優勢在於簡單、易部署。但是如果
DBA只對部分值進行查詢或更新的時候,Key/value就顯得效率低下了。舉例如:Tokyo Cabinet/Tyrant, Redis, Voldemort, Oracle BDB.
2、列存儲數據庫。
這部分數據庫通常是用來應對分布式存儲的海量數據。鍵仍然存在,但是它們的特點是指向了多個列。這些列是由列家族來安排的。如:Cassandra, HBase, Riak.
3、文檔型數據庫
文檔型數據庫的靈感是來自於Lotus Notes辦公軟件的,而且它同第一種鍵值存儲相類似。該類型的數據模型是版本化的文檔,半結構化的文檔以特定的格式存儲,比如JSON。文檔型數據庫可 以看作是鍵值數據庫的升級版,允許之間嵌套鍵值。而且文檔型數據庫比鍵值數據庫的查詢效率更高。如:CouchDB, MongoDb. 國內也有文檔型數據庫SequoiaDB,已經開源。
4、圖形(Graph)數據庫
圖形結構的數據庫同其他行列以及剛性結構的SQL數據庫不同,它是使用靈活的圖形模型,並且能夠擴展到多個服務器上。NoSQL數據庫沒有標准的查詢語言(SQL),因此進行數據庫查詢需要制定數據模型。許多NoSQL數據庫都有REST式的數據接口或者查詢API。如:Neo4J, InfoGrid, Infinite Graph.
因此,我們總結NoSQL數據庫在以下的這幾種情況下比較適用:1、數據模型比較簡單;2、需要靈活性更強的IT系統;3、對數據庫性能要求較高;4、不需要高度的數據一致性;5、對於給定key,比較容易映射復雜值的環境。
二、NoSQL數據庫的四大分類表格分析
| 分類 | 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度關系查找等 | 很多時候需要對整個圖做計算才能得出需要的信息,而且這種結構不太好做分布式的集群方案。 |
三、適用場景
NoSQL數據庫在以下的這幾種情況下比較適用:
1、數據模型比較簡單;
2、需要靈活性更強的IT系統;
3、對數據庫性能要求較高;
4、不需要高度的數據一致性;
5、對於給定key,比較容易映射復雜值的環境。
四、常見NoSql數據庫
據說現在已經有上百種NoSQL數據庫了,下面來了解下常見的一些NoSQL數據庫
先來看張表,了解下典型的NoSQL數據庫的分類:
| 臨時性鍵值存儲 | 永久性鍵值存儲 | 面向文檔的數據庫 | 面向列的數據庫 |
| Memcached | Tokyo Tyrant | MangoDB | Cassandra |
| Redis | Flare | CouchDB | HBase |
| ROMA | HyperTable | ||
| Redis |
Memcached
- 揮發性(臨時性)的鍵值存儲
- 一般作為關系型數據庫的緩存來使用
- 具有非常快的處理速度
- 由於存在數據丟失的可能,所以一般用來處理不需要持久保存的數據
- 用於需要使用expires時(需要定期清除數據)
- 使用一致性散列(Consistent Hashing)算法來分散數據
Tokyo Tyrant
- 持久性的鍵值存儲
- 用來處理需要持久保存,高速處理的數據
- 具有非常快的處理速度
- 用於不需要定期清除的數據
- 使用一致性散列(Consistent Hashing)算法來分散數據
Redis
- 兼具Memcached和Tokyo Tyrant優勢的鍵值存儲
- 擅長處理數組類型的數據
- 具有非常快的處理速度
- 可以高速處理時間序列的數據,易於處理集合運算
- 擁有很多可以進行原子操作的方法
- 使用一致性散列(Consistent Hashing)算法來分散數據
MongoDB
- 面向無需定義表結構的文檔數據
- 具有非常快的處理速度
- 通過BSON的形式可以保存和查詢任何類型的數據
- 無法進行JOIN處理,但是可以通過嵌入(embed)來實現同樣的功能
- 使用sharding(范圍分割)算法來分散數據
上面多次提到了一致性散列,那到底什么是一致性散列呢?請參考這里 ,我就不贅述了
不過,當server數量很少時,很可能他們在圓周上的分布不是特別均勻,
導致cache不能均勻分布到所有的server上。
這時候,就該請出虛擬節點了
為每個物理節點(服務器)在圓上分配100~200個點,
這樣就能抑制分布不均勻,最大限度地減小服務器增減時的緩存重新分布,
用戶數據映射在虛擬節點上,就表示用戶數據真正存儲位置是在該虛擬節點代表的實際物理服務器上。
