1. NoSQL簡介
- NoSQL(NoSQL = Not Only SQL ),非關系型數據庫,也意"not only SQL"。
- 通過應用實踐證明,關系模型是非常適合於客戶服務器編程,遠遠超出預期的利益,今天它是結構化數據存儲在網絡和商務應用的主導技術。
1.1 RDBMS vs NoSQL
RDBMS(關系數據庫管理系統)
- 高度組織化結構化數據
- 結構化查詢語言(SQL) (SQL)
- 數據和關系都存儲在單獨的表中。
- 數據操縱語言,數據定義語言
- 嚴格的一致性
- 基礎事務
NoSQL
- 代表着不僅僅是SQL
- 沒有聲明性查詢語言
- 沒有預定義的模式
- 鍵-值對存儲,列存儲,文檔存儲,圖形數據庫
- 最終一致性,而非ACID屬性
- 非結構化和不可預知的數據
- CAP定理
- 高性能,高可用性和可伸縮性
1.3 RDBMS vs NoSQL事務特性
RDBMS:ACID
- A (Atomicity) 原子性
- C (Consistency) 一致性
- I (Isolation) 獨立性
- D (Durability) 持久性
NoSQL:CAP
CAP定理(CAP theorem)
在計算機科學中, CAP定理(CAP theorem), 又被稱作 布魯爾定理(Brewer's theorem), 它指出對於一個分布式計算系統來說,不可能同時滿足以下三點:
- 一致性(Consistency) (所有節點在同一時間具有相同的數據)
- 可用性(Availability) (保證每個請求不管成功或者失敗都有響應)
- 分隔容忍(Partition tolerance) (系統中任意信息的丟失或失敗不會影響系統的繼續運作)
CAP理論的核心是:一個分布式系統不可能同時很好的滿足一致性,可用性和分區容錯性這三個需求,最多只能同時較好的滿足兩個。
因此,根據 CAP 原理將 NoSQL 數據庫分成了滿足 CA 原則、滿足 CP 原則和滿足 AP 原則三 大類:
- CA - 單點集群,滿足一致性,可用性的系統,通常在可擴展性上不太強大。
- CP - 滿足一致性,分區容忍性的系統,通常性能不是特別高。
- AP - 滿足可用性,分區容忍性的系統,通常可能對一致性要求低一些。
注意:redis 和 MongoDB 均滿足CP原則。
NoSQL:BASE
BASE:Basically Available, Soft-state, Eventually Consistent。
CAP理論的核心是:一個分布式系統不可能同時很好的滿足一致性,可用性和分區容錯性這三個需求,最多只能同時較好的滿足兩個。
BASE是NoSQL數據庫通常對可用性及一致性的弱要求原則:
- Basically Availble --基本可用
- Soft-state --軟狀態/柔性事務。 "Soft state" 可以理解為"無連接"的, 而 "Hard state" 是"面向連接"的
- Eventual Consistency -- 最終一致性, 也是是 ACID 的最終目的。
1.2 NoSQL優缺點
NoSQL的優點/缺點
優點:
- 高可擴展性
- 分布式計算
- 低成本
- 架構的靈活性,半結構化數據
- 沒有復雜的關系
缺點:
- 沒有標准化
- 有限的查詢功能(到目前為止)
- 最終一致是不直觀的程序
2. MongoDB簡介
- NoSQL中一種
- 對比redis為key-value存儲類型,MongoDB是文檔型數據庫
- MongoDB 將數據存儲為一個文檔,數據結構由鍵值(key=>value)對組成,字段值可以包含其他文檔,數組及文檔數組。
- MongoDB 文檔類似於 JSON 對象,是BSON(二進制Binary JSON)
如:
{
name : "sue",
age : 26,
groups : ["news", "sports"]
}
2.1 主要特點
- MongoDB 是一個面向文檔存儲的數據庫,操作起來比較簡單和容易。
- 你可以在MongoDB記錄中設置任何屬性的索引 (如:FirstName="Sameer",Address="8 Gandhi Road")來實現更快的排序。
- 你可以通過本地或者網絡創建數據鏡像,這使得MongoDB有更強的擴展性。
- 如果負載的增加(需要更多的存儲空間和更強的處理能力) ,它可以分布在計算機網絡中的其他節點上這就是所謂的分片。
- Mongo支持豐富的查詢表達式。查詢指令使用JSON形式的標記,可輕易查詢文檔中內嵌的對象及數組。
- MongoDb 使用update()命令可以實現替換完成的文檔(數據)或者一些指定的數據字段 。
- Mongodb中的Map/reduce主要是用來對數據進行批量處理和聚合操作。
- Map和Reduce。Map函數調用emit(key,value)遍歷集合中所有的記錄,將key與value傳給Reduce函數進行處理。
- Map函數和Reduce函數是使用Javascript編寫的,並可以通過db.runCommand或mapreduce命令來執行MapReduce操作。
- GridFS是MongoDB中的一個內置功能,可以用於存放大量小文件。
- MongoDB允許在服務端執行腳本,可以用Javascript編寫某個函數,直接在服務端執行,也可以把函數的定義存儲在服務端,下次直接調用即可。
- MongoDB支持各種編程語言:RUBY,PYTHON,JAVA,C++,PHP,C#等多種語言。
- MongoDB安裝簡單。
2.2 概念解析
SQL術語/概念 | MongoDB術語/概念 | 解釋/說明 |
---|---|---|
database | database | 數據庫 |
table | collection | 數據庫表/集合 |
row | document | 數據記錄行/文檔 |
column | field | 數據字段/域 |
index | index | 索引 |
table | joins | 表連接,MongoDB不支持 |
primary key | primary key | 主鍵,MongoDB自動將_id字段設置為主鍵 |
3. MongoDB和Redis的區別是什么
MongoDB 更類似 MySQL,支持字段索引、游標操作,其優勢在於查詢功能比較強大,擅長查詢 JSON 數據,能存儲海量數據,但是不支持事務。
Redis 是一個開源(BSD許可)的,內存中的數據結構存儲系統,支持多種類型的數據結構,可用作數據庫,高速緩存和消息隊列代理。
1、內存管理機制
Redis 數據全部存在內存,定期寫入磁盤,當內存不夠時,可以選擇指定的 LRU 算法刪除數據。
MongoDB 數據存在內存,由 linux系統 mmap 實現,當內存不夠時,只將熱點數據放入內存,其他數據存在磁盤。
2、支持的數據結構
Redis 支持的數據結構豐富,包括hash、set、list等。
MongoDB 數據結構比較單一,但是支持豐富的數據表達,索引,最類似關系型數據庫,支持的查詢語言非常豐富。
3、數據量和性能:
當物理內存夠用的時候,redis>mongodb>mysql
當物理內存不夠用的時候,redis和mongodb都會使用虛擬內存。
實際上如果redis要開始虛擬內存,那很明顯要么加內存條,要么你換個數據庫了。
但是,mongodb不一樣,只要,業務上能保證,冷熱數據的讀寫比,使得熱數據在物理內存中,mmap的交換較少。
mongodb還是能夠保證性能。
4、性能
mongodb依賴內存,TPS較高;Redis依賴內存,TPS非常高。性能上Redis優於MongoDB。
5、可靠性
mongodb從1.8版本后,采用binlog方式(MySQL同樣采用該方式)支持持久化,增加可靠性;
Redis依賴快照進行持久化;AOF增強可靠性;增強可靠性的同時,影響訪問性能。
可靠性上MongoDB優於Redis。
6、數據分析
mongodb內置數據分析功能(mapreduce);而Redis不支持。
7、事務支持情況
Redis 事務支持比較弱,只能保證事務中的每個操作連續執行;mongodb不支持事務。
8、集群
MongoDB 集群技術比較成熟,Redis從3.0開始支持集群。
參考鏈接:
https://www.runoob.com/mongodb/nosql.html
https://www.php.cn/redis/421928.html