-
1 # 墨跡天氣
-
2 # 遷徙de麻雀
首先,所有資料庫都會使用快取。
典型的比如關係資料庫,索引和查詢計劃都會使用快取。
mongodb和redis屬於nosql範疇,nosql大部分都是基於記憶體模型設計,提供高速的讀寫速度。
redis本來就是做記憶體快取使用,mongodb也使用記憶體,根據版本使用的儲存引擎有不同特點。
mongodb3.0及之前的MMAPv1引擎3.0之前只有MMAPv1一種儲存引擎。特點如下:
該引擎使用記憶體對映檔案,將記憶體管理交給作業系統。
它的資料落地策略(同步記憶體資料到磁碟)包括兩個:資料同步和日誌同步,資料同步每隔60秒(可透過storage.syncPeriodSecs設定),日誌同步每隔100ms(可透過storage.journal.commitIntervalMs設定)。這裡的日誌是操作日誌,和關係資料庫的操作日誌類似的,可以提供故障恢復等功能。
注意:
這個階段,大多數使用mongodb的專案都是看中它的速度,而要讓它發揮最大的功力,需要系統可用記憶體大於資料檔案。如果資料檔案大於系統可用記憶體 ,mongodb的效能會急劇下降!
mongodb3.2及之後的WiredTiger引擎3.2提供了WiredTiger儲存引擎,並預設使用。4.0後已經棄用MMAPv1。
WiredTiger的特點如下:
提供文件級別的併發。
提供快照的檢查點。
支援資料和日誌的壓縮。這個其實很重要,對於不活躍的文件集合,BSON的資料模型耗費了大量空間,這時候就很有壓縮資料的必要。
相比MMAPv1,WiredTiger同時使用自己設計的快取和檔案系統快取。WiredTiger內部快取中的資料與磁碟格式使用不同的表示形式。透過檔案系統快取,MongoDB自動使用WiredTiger快取或其他程序未使用的所有可用記憶體。新的快取設計,不再會產生可用記憶體小於資料檔案大小時雪崩的效能問題,但是提供更大的記憶體依然是更好的。
上面兩個是wiredtiger提供的和mysql的innoDB儲存引擎的效能對比。
4.0強行提供對事物的支援,包括儲存引擎的最佳化(適應更大的資料檔案),這擺明了就是要提供更平滑的關係資料庫到Mongodb的過渡。不過他們之間依然有各自的優勢,mongodb的市場佔有率會有擴大的趨勢,但現在依然沒法取代關係資料庫。
PS:還有記憶體儲存引擎,這個只有企業版有,就不說了。
回覆列表
先說結論,mongoDB是會佔用一部分記憶體用來儲存熱資料和資料索引的。
在回答兩種工具有什麼區別之前,我們首先要弄清楚,mongo和redis是做什麼的?mongo的工作原理是什麼?redis的工作原理是什麼?什麼情況下選擇mongo什麼情況下選擇redis?下面我來詳細分析一下二者的區別,及使用場景。
1.先說mongoDB
(1)mongoDB是由C++語言編寫的,是一個基於分散式檔案儲存的開源資料庫系統。它是非關係型資料庫,但是mongoDB的使用方式又非常類似於關係型資料庫,所以相比於其它的非關係型資料庫來說,mongoDB支援的查詢方式是非常多樣化的。mongoDB在高負載的情況下,新增更多的節點,可以保證伺服器效能。MongoDB 旨在為WEB應用提供可擴充套件的高效能資料儲存解決方案。MongoDB 將資料儲存為一個文件,資料結構由鍵值(key=>value)對組成。MongoDB 文件類似於 JSON 物件。欄位值可以包含其他文件,陣列及文件陣列。
(2) 知道了什麼是mongo以後,我們再來看一下mongoDB是如何儲存資料的。mongoDB使用的是作業系統底層提供的記憶體對映機制 那麼什麼是記憶體對映呢?記憶體對映機制MMAP,指的是可以把磁碟檔案的一部分或全部內容直接對映到記憶體,這樣檔案中的資訊位置就會在記憶體中有對應的地址空間,這時對檔案的讀寫可以直接用指標來做,而不需要read/write函數了。同時作業系統會將資料重新整理儲存到磁碟上如圖:
mongoDB不干涉記憶體的管理工作,而是把這些管理交給作業系統去管理,好處是簡化了mongoDB的工作,壞處是沒有辦法很方便去控制記憶體,致使mongoDB有時候佔記憶體過多。
mongoDB會資料檔案及索引對映到記憶體中。如果是讀操作,記憶體中的資料起到緩衝作用;如果是寫操作,記憶體還可以把隨機的寫操作轉換成順序的寫操作,大幅度提升效能。
到底MongoDB配備多大記憶體合適?寬泛點來說,多多益善,如果要確切點來說,這實際取決於你的資料及索引的大小,一般來說mongoDB應分配的記憶體大小:記憶體 > 索引 + 熱資料
2.我們再來看redis
redis的儲存沒有mongoDB這麼複雜,redis的是一個高效能的基於記憶體的key-value儲存系統,redis對資料的操作,包括增刪查改,都是在記憶體中完成的。