談?wù)勀銓oSQL的理解
1.什么是NoSQL?
NoSQL呢常見的解釋有Non-Relational SQL或者Not Only SQL,不過Not Only SQL被更多人接受,一般泛指非關(guān)系型數(shù)據(jù)庫。它和關(guān)系型數(shù)據(jù)庫不同的是,不保證關(guān)系數(shù)據(jù)的ACID特性。
隨著互聯(lián)網(wǎng)的發(fā)展,NoSQL數(shù)據(jù)庫的產(chǎn)生就是為了解決超大規(guī)模和高并發(fā)系統(tǒng)中多重數(shù)據(jù)種類帶來的挑戰(zhàn),特別是大數(shù)據(jù)應(yīng)用的難題。目前具有代表性的NoSQL數(shù)據(jù)庫有Redis、HBase、ES、MongoDB等等。
NoSQL非常適合以下幾個場景:
- 數(shù)據(jù)模型比較簡單;
- 需要靈活性更強的數(shù)據(jù)庫;
- 對數(shù)據(jù)庫性能要求較高;
- 不需要高度的數(shù)據(jù)一致性;
- 對于給定Key,比較容易映射復(fù)雜值的環(huán)境。
2.NoSQL分類
通常來說,現(xiàn)在主流的NoSQL數(shù)據(jù)庫可以分為四大類:K-V鍵值數(shù)據(jù)庫、列存儲數(shù)據(jù)庫、文檔數(shù)據(jù)庫和圖形數(shù)據(jù)庫。
首先來看,K-V鍵值數(shù)據(jù)庫,主要應(yīng)用于內(nèi)容緩存、處理大量數(shù)據(jù)的高負(fù)載訪問,也可以用于記錄系統(tǒng)日志。比較有代表性的產(chǎn)品有Redis、Memcached等等。
其次是,列存儲數(shù)據(jù)庫,主要應(yīng)用于布式數(shù)據(jù)的儲存與管理,分布式可擴展性強,比較有代表性的產(chǎn)品有HBase、HadoopDB、BigTable等等。
然后就是,文檔數(shù)據(jù)庫,主要應(yīng)用于管理半結(jié)構(gòu)化數(shù)據(jù)或者面向文檔的數(shù)據(jù),比較有代表性的產(chǎn)品有MongoDB,ES等等,當(dāng)然,ES不僅僅只是數(shù)據(jù)庫,它還是一個分布式搜索引擎,是基于Lucene來開發(fā)的,現(xiàn)在已經(jīng)發(fā)展成為一個自有生態(tài)Elastic Stack。
最后就是,圖形數(shù)據(jù)庫,主要應(yīng)用于復(fù)雜、互連接但又低結(jié)構(gòu)化的圖結(jié)構(gòu)場合,可以用來構(gòu)建數(shù)據(jù)關(guān)系圖譜,Neo4J、InfoGrid、GraphDB等等。
下面我把四種分類的NoSQL數(shù)據(jù)庫整理成了一個表格,并總結(jié)了它們的優(yōu)缺點。
3、主流NoSQL對比
對于NoSQL數(shù)據(jù)庫對互聯(lián)網(wǎng)開發(fā)的重要性就不多說了,在互聯(lián)網(wǎng)分布式開發(fā)場景中,我認(rèn)為掌握Redis、HBase、Elastic、MongoDB就能滿足絕大部分需求。
如果對數(shù)據(jù)的讀寫要求極高,并且數(shù)據(jù)規(guī)模不大,也不需要長期存儲,那就選Redis;
如果數(shù)據(jù)規(guī)模較大,對數(shù)據(jù)的讀性能要求很高,數(shù)據(jù)表的結(jié)構(gòu)需要經(jīng)常變,有時還需要做一些聚合查詢,那就選MongoDB;
如果要構(gòu)造一個搜索引擎或者要完成一個高大上的數(shù)據(jù)可視化平臺,并且數(shù)據(jù)本身也具有分析價值,就選ES;
如果你要存儲海量數(shù)據(jù),而且還不能預(yù)估數(shù)據(jù)規(guī)模將來會增長多么大,那么選HBase。
這里我也整理了一種表格,大家可以保存一下:
最后,再給大家來個更加形象的對比:
Redis就相當(dāng)于開戰(zhàn)斗機,MongoDB就相當(dāng)于坐高鐵,HBase就相當(dāng)于航母,ES那就是帝國鐵騎,山地裝甲機器人。