點選上方“芋道原始碼”,選擇“置頂公眾號”
技術文章第一時間送達!
原始碼精品專欄
來源:https://dwz.cn/H9G9ObZ4
NoSQL的四大種類
NoSQL資料庫在整個資料庫領域的江湖地位已經不言而喻。在大資料時代,雖然RDBMS很優秀,但是面對快速增長的資料規模和日漸複雜的資料模型,RDBMS漸漸力不從心,無法應對很多資料庫處理任務,這時NoSQL憑藉易擴充套件、大資料量和高效能以及靈活的資料模型成功的在資料庫領域站穩了腳跟。
目前大家基本認同將NoSQL資料庫分為四大類:鍵值儲存資料庫,檔案型資料庫,列儲存資料庫和圖形資料庫,其中每一種型別的資料庫都能夠解決關係型資料不能解決的問題。在實際應用中,NoSQL資料庫的分類界限其實沒有那麼明顯,往往會是多種型別的組合體。
主流nosql的詳解:MongoDB、Hbase、Redis
MongoDB
MongoDB 是一個高效能,開源,無樣式的檔案型資料庫,開發語言是C++。它在許多場景下可用於替代統的關係型資料庫或鍵/值儲存方式。
1.MongoDB特點
-
所用語言:C++
-
特點:保留了SQL一些友好的特性(查詢,索引)。
-
使用許可: AGPL(發起者: Apache)
-
協議: Custom, binary( BSON)
-
Master/slave複製(支援自動錯誤恢復,使用 sets 複製)
-
內建分片機制
-
支援 javascript運算式查詢
-
可在伺服器端執行任意的 javascript函式
-
update-in-place支援比CouchDB更好
-
在資料儲存時採用記憶體到檔案對映
-
對效能的關註超過對功能的要求
-
建議最好開啟日誌功能(引數 –journal)
-
在32位作業系統上,資料庫大小限制在約2.5Gb
-
空資料庫大約佔 192Mb
-
採用 GridFS儲存大資料或元資料(不是真正的檔案系統)
2.MongoDB優點:
1)更高的寫負載,MongoDB擁有更高的插入速度。
2)處理很大的規模的單表,當資料表太大的時候可以很容易的分割表。
3)高可用性,設定M-S不僅方便而且很快,MongoDB還可以快速、安全及自動化的實現節點 (資料中心)故障轉移。
4)快速的查詢,MongoDB支援二維空間索引,比如管道,因此可以快速及精確的從指定位置 獲取資料。MongoDB在啟動後會將資料庫中的資料以檔案對映的方式載入到記憶體中。如果內 存資源相當豐富的話,這將極大地提高資料庫的查詢速度。
5)非結構化資料的爆發增長,增加列在有些情況下可能鎖定整個資料庫,或者增加負載從而 導致效能下降,由於MongoDB的弱資料結構樣式,新增1個新欄位不會對舊表格有任何影響, 整個過程會非常快速。
3.MongoDB缺點:
1)不支援事務。
2)MongoDB佔用空間過大 。
3)MongoDB沒有成熟的維護工具。
4.MongoDB應用場景
1)適用於實時的插入、更新與查詢的需求,並具備應用程式實時資料儲存所需的複製及高度伸縮性;
2) 非常適合檔案化格式的儲存及查詢;
3)高伸縮性的場景:MongoDB 非常適合由數十或者數百臺伺服器組成的資料庫。
4)對效能的關註超過對功能的要求。
HBase
HBase 是 Apache Hadoop 中的一個子專案,屬於 bigtable 的開源版本,所實現的語言為Java(故依賴 Java SDK)。HBase 依託於 Hadoop 的 HDFS(分散式檔案系統)作為最基本儲存基礎單元。
1.HBase 特點:
-
所用語言: Java
-
特點:支援數十億行X上百萬列
-
使用許可: Apache
-
協議:HTTP/REST (支援 Thrift,見編註4)
-
在 BigTable之後建模
-
採用分散式架構 Map/reduce
-
對實時查詢進行最佳化
-
高效能 Thrift閘道器
-
透過在server端掃描及過濾實現對查詢操作預判
-
支援 XML, Protobuf, 和binary的HTTP
-
Cascading, hive, and pig source and sink modules
-
基於 Jruby( JIRB)的shell
-
對配置改變和較小的升級都會重新回滾
-
不會出現單點故障
-
堪比MySQL的隨機訪問效能
3. HBase 優點
1) 儲存容量大,一個表可以容納上億行,上百萬列;
2)可透過版本進行檢索,能搜到所需的歷史版本資料;
3)負載高時,可透過簡單的新增機器來實現水平切分擴充套件,跟Hadoop的無縫整合保障了其資料可靠性(HDFS)和海量資料分析的高效能(MapReduce);
4)在第3點的基礎上可有效避免單點故障的發生。
4.HBase 缺點
-
基於Java語言實現及Hadoop架構意味著其API更適用於Java專案;
-
node開發環境下所需依賴項較多、配置麻煩(或不知如何配置,如持久化配置),缺乏檔案;
-
佔用記憶體很大,且鑒於建立在為批次分析而最佳化的HDFS上,導致讀取效能不高;
-
API相比其它 NoSql 的相對笨拙。
5.HBase 適用場景
1)bigtable型別的資料儲存;
2)對資料有版本查詢需求;
3)應對超大資料量要求擴充套件簡單的需求。
Redis
Redis 是一個開源的使用ANSI C語言編寫、支援網路、可基於記憶體亦可持久化的日誌型、Key-Value資料庫,並提供多種語言的API。目前由VMware主持開發工作。
1.Redis 特點:
-
所用語言:C/C++
-
特點:執行異常快
-
使用許可: BSD
-
協議:類 Telnet
-
有硬碟儲存支援的記憶體資料庫,
-
但自2.0版本以後可以將資料交換到硬碟(註意, 2.4以後版本不支援該特性!)
-
Master-slave複製(見編註3)
-
雖然採用簡單資料或以鍵值索引的雜湊表,但也支援複雜操作,例如 ZREVRANGEBYSCORE。
-
INCR & co (適合計算極限值或統計資料)
-
支援 sets(同時也支援 union/diff/inter)
-
支援串列(同時也支援佇列;阻塞式 pop操作)
-
支援雜湊表(帶有多個域的物件)
-
支援排序 sets(高得分表,適用於範圍查詢)
-
Redis支援事務
-
支援將資料設定成過期資料(類似快速緩衝區設計)
-
Pub/Sub允許使用者實現訊息機制
2. Redis 優勢
1)非常豐富的資料結構;
2)Redis提供了事務的功能,可以保證一串 命令的原子性,中間不會被任何操作打斷;
3)資料存在記憶體中,讀寫非常的高速,可以達到10w/s的頻率。
3.Redis 缺點
1) Redis3.0後才出來官方的叢集方案,但仍存在一些架構上的問題;
2)持久化功能體驗不佳——透過快照方法實現的話,需要每隔一段時間將整個資料庫的資料寫到磁碟上,代價非常高;而aof方法只追蹤變化的資料,類似於mysql的binlog方法,但追加log可能過大,同時所有操作均要重新執行一遍,恢復速度慢;
3)由於是記憶體資料庫,所以,單臺機器,儲存的資料量,跟機器本身的記憶體大小。雖然redis本身有key過期策略,但是還是需要提前預估和節約記憶體。如果記憶體增長過快,需要定期刪除資料。
4.Redis 應用場景:
最佳應用場景:適用於資料變化快且資料庫大小可遇見(適合記憶體容量)的應用程式。
例如:微博、資料分析、實時資料蒐集、實時通訊等。
如果你對 Dubbo / Netty 等等原始碼與原理感興趣,歡迎加入我的知識星球一起交流。長按下方二維碼噢:
目前在知識星球更新了《Dubbo 原始碼解析》目錄如下:
01. 除錯環境搭建
02. 專案結構一覽
03. 配置 Configuration
04. 核心流程一覽
05. 拓展機制 SPI
06. 執行緒池
07. 服務暴露 Export
08. 服務取用 Refer
09. 註冊中心 Registry
10. 動態編譯 Compile
11. 動態代理 Proxy
12. 服務呼叫 Invoke
13. 呼叫特性
14. 過濾器 Filter
15. NIO 伺服器
16. P2P 伺服器
17. HTTP 伺服器
18. 序列化 Serialization
19. 叢集容錯 Cluster
20. 優雅停機
21. 日誌適配
22. 狀態檢查
23. 監控中心 Monitor
24. 管理中心 Admin
25. 運維命令 QOS
26. 鏈路追蹤 Tracing
… 一共 69+ 篇
目前在知識星球更新了《Netty 原始碼解析》目錄如下:
01. 除錯環境搭建
02. NIO 基礎
03. Netty 簡介
04. 啟動 Bootstrap
05. 事件輪詢 EventLoop
06. 通道管道 ChannelPipeline
07. 通道 Channel
08. 位元組緩衝區 ByteBuf
09. 通道處理器 ChannelHandler
10. 編解碼 Codec
11. 工具類 Util
… 一共 61+ 篇
目前在知識星球更新了《資料庫物體設計》目錄如下:
01. 商品模組
02. 交易模組
03. 營銷模組
04. 公用模組
… 一共 17+ 篇
目前在知識星球更新了《Spring 原始碼解析》目錄如下:
01. 除錯環境搭建
02. IoC Resource 定位
03. IoC BeanDefinition 載入
04. IoC BeanDefinition 註冊
05. IoC Bean 獲取
06. IoC Bean 生命週期
… 一共 35+ 篇
原始碼不易↓↓↓↓↓
點贊支援老艿艿↓↓