|
NoSQL 的全稱(chēng)是 Not Only SQL,也可以理解非關(guān)系型的數(shù)據(jù)庫(kù),是一種新型的革命式的數(shù)據(jù)庫(kù)設(shè)計(jì)方式,不過(guò)它不是為了取代傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)而被設(shè)計(jì)的,它們分別代表了不同的數(shù)據(jù)庫(kù)設(shè)計(jì)思路。 MongoDB: 它是一個(gè)內(nèi)存數(shù)據(jù)庫(kù),數(shù)據(jù)都是放在內(nèi)存里面的。 對(duì)數(shù)據(jù)的操作大部分都在內(nèi)存中,但 MongoDB 并不是單純的內(nèi)存數(shù)據(jù)庫(kù)。 MongoDB 是由 C++ 語(yǔ)言編寫(xiě)的,是一個(gè)基于分布式文件存儲(chǔ)的開(kāi)源數(shù)據(jù)庫(kù)系統(tǒng)。 在高負(fù)載的情況下,添加更多的節(jié)點(diǎn),可以保證服務(wù)器性能。 MongoDB 旨在為 WEB 應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲(chǔ)解決方案。 MongoDB 將數(shù)據(jù)存儲(chǔ)為一個(gè)文檔,數(shù)據(jù)結(jié)構(gòu)由鍵值(key=>value)對(duì)組成。MongoDB 文檔類(lèi)似于 JSON 對(duì)象。字段值可以包含其他文檔,數(shù)組及文檔數(shù)組。 MongoDB 的存儲(chǔ)特點(diǎn) 在傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)中,數(shù)據(jù)是以表單為媒介進(jìn)行存儲(chǔ)的,每個(gè)表單均擁有縱向的列和橫向的行。 由此可見(jiàn),相比較 MySQL,MongoDB 以一種直觀文檔的方式來(lái)完成數(shù)據(jù)的存儲(chǔ)。它很像 JavaScript 中定義的 JSON 格式,不過(guò)數(shù)據(jù)在存儲(chǔ)的時(shí)候 MongoDB 數(shù)據(jù)庫(kù)為文檔增加了序列化的操作,最終存進(jìn)磁盤(pán)的其實(shí)是一種叫做 BSON 的格式,即 Binary-JSON。 MongoDB 的應(yīng)用場(chǎng)景 在另一方面,對(duì)開(kāi)發(fā)者來(lái)說(shuō),如果是因?yàn)闃I(yè)務(wù)需求或者是項(xiàng)目初始階段,而導(dǎo)致數(shù)據(jù)的具體格式無(wú)法明確定義的話,MongoDB的這一鮮明特性就脫穎而出了。相比傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù),它非常容易被擴(kuò)展,這也為寫(xiě)代碼帶來(lái)了極大的方便。 不過(guò) MongoDB 對(duì)數(shù)據(jù)之間事務(wù)關(guān)系支持比較弱,如果業(yè)務(wù)這一方面要求比較高的話,MongoDB 還是并不適合此類(lèi)型的應(yīng)用。 非關(guān)系型數(shù)據(jù)庫(kù)(NoSQL ),屬于文檔型數(shù)據(jù)庫(kù)。先解釋一下文檔的數(shù)據(jù)庫(kù),即可以存放 xml、json、bson 類(lèi)型系那個(gè)的數(shù)據(jù)。這些數(shù)據(jù)具備自述性(self-describing),呈現(xiàn)分層的樹(shù)狀數(shù)據(jù)結(jié)構(gòu)。數(shù)據(jù)結(jié)構(gòu)由鍵值(key=>value)對(duì)組成。 存儲(chǔ)方式:虛擬內(nèi)存+持久化。 持久化方式: MongoDB 的所有數(shù)據(jù)實(shí)際上是存放在硬盤(pán)的,所有要操作的數(shù)據(jù)通過(guò) mmap 的方式映射到內(nèi)存某個(gè)區(qū)域內(nèi)。 然后,MongoDB 就在這塊區(qū)域里面進(jìn)行數(shù)據(jù)修改,避免了零碎的硬盤(pán)操作。 至于 mmap上的內(nèi)容flush到硬盤(pán)就是操作系統(tǒng)的事情了,所以,如果,MongoDB 在內(nèi)存中修改了數(shù)據(jù)后,mmap 數(shù)據(jù)flush到硬盤(pán)之前,系統(tǒng)宕機(jī)了,數(shù)據(jù)就會(huì)丟失。 主要特點(diǎn): MongoDB 的提供了一個(gè)面向文檔存儲(chǔ),操作起來(lái)比較簡(jiǎn)單和容易。 你可以在 MongoDB 記錄中設(shè)置任何屬性的索引 (如:FirstName="Sameer",Address="8 Gandhi Road")來(lái)實(shí)現(xiàn)更快的排序。 你可以通過(guò)本地或者網(wǎng)絡(luò)創(chuàng)建數(shù)據(jù)鏡像,這使得 MongoDB 有更強(qiáng)的擴(kuò)展性。 如果負(fù)載的增加(需要更多的存儲(chǔ)空間和更強(qiáng)的處理能力) ,它可以分布在計(jì)算機(jī)網(wǎng)絡(luò)中的其他節(jié)點(diǎn)上這就是所謂的分片。 MongoDB 支持豐富的查詢(xún)表達(dá)式。查詢(xún)指令使用 JSON 形式的標(biāo)記,可輕易查詢(xún)文檔中內(nèi)嵌的對(duì)象及數(shù)組。 MongoDB 使用 update() 命令可以實(shí)現(xiàn)替換完成的文檔(數(shù)據(jù))或者一些指定的數(shù)據(jù)字段 。 MongoDB 中的 Map/reduce 主要是用來(lái)對(duì)數(shù)據(jù)進(jìn)行批量處理和聚合操作。 Map 和 Reduce。Map 函數(shù)調(diào)用 emit(key,value) 遍歷集合中所有的記錄,將 key 與 value 傳給 Reduce 函數(shù)進(jìn)行處理。 Map 函數(shù)和 Reduce 函數(shù)是使用 JavaScript 編寫(xiě)的,并可以通過(guò) db.runCommand 或 mapreduce 命令來(lái)執(zhí)行 MapReduce 操作。 GridFS 是 MongoDB 中的一個(gè)內(nèi)置功能,可以用于存放大量小文件。 MongoDB 允許在服務(wù)端執(zhí)行腳本,可以用 Javascript 編寫(xiě)某個(gè)函數(shù),直接在服務(wù)端執(zhí)行,也可以把函數(shù)的定義存儲(chǔ)在服務(wù)端,下次直接調(diào)用即可。 MongoDB支持各種編程語(yǔ)言:RUBY,PYTHON,JAVA,C++,PHP,C# 等多種語(yǔ)言。 1. 它里面自帶了一個(gè)名叫 GirdFS 的分布式文件系統(tǒng),這就為 MongoDB 的部署提供了很大便利。而像 MySQL 這種比較早的數(shù)據(jù)庫(kù),雖然市面上有很多不同的分表部署的方案,但這種終究不如 MongoDB 直接官方支持來(lái)得便捷實(shí)在。 2. 另外,MongoDB 內(nèi)部還自建了對(duì) map-reduce運(yùn)算框架的支持,雖然這種支持從功能上看還算是比較簡(jiǎn)單的,相當(dāng)于MySQL里 GroupBy 功能的擴(kuò)展版,不過(guò)也為數(shù)據(jù)的統(tǒng)計(jì)帶來(lái)了方便。 3. MongoDB 在啟動(dòng)后會(huì)將數(shù)據(jù)庫(kù)中的數(shù)據(jù)以文件映射的方式加載到內(nèi)存中。如果內(nèi)存資源相當(dāng)豐富的話,這將極大地提高數(shù)據(jù)庫(kù)的查詢(xún)速度,畢竟內(nèi)存的 I/O 效率比磁盤(pán)高多了。 MongoDB 以 BSON 結(jié)構(gòu)(二進(jìn)制)進(jìn)行存儲(chǔ),對(duì)海量數(shù)據(jù)存儲(chǔ)有著很明顯的優(yōu)勢(shì)。 監(jiān)控 MongoDB提供了網(wǎng)絡(luò)和系統(tǒng)監(jiān)控工具M(jìn)unin,它作為一個(gè)插件應(yīng)用于MongoDB中。 Gangila是MongoDB高性能的系統(tǒng)監(jiān)視的工具,它作為一個(gè)插件應(yīng)用于MongoDB中。 基于圖形界面的開(kāi)源工具 Cacti, 用于查看CPU負(fù)載, 網(wǎng)絡(luò)帶寬利用率,它也提供了一個(gè)應(yīng)用于監(jiān)控 MongoDB 的插件。 查詢(xún)語(yǔ)句:是獨(dú)特的 MongoDB 的查詢(xún)方式。 適合場(chǎng)景:事件的記錄,內(nèi)容管理或者博客平臺(tái)等等。 架構(gòu)特點(diǎn):可以通過(guò)副本集,以及分片來(lái)實(shí)現(xiàn)高可用。 數(shù)據(jù)處理:數(shù)據(jù)是存儲(chǔ)在硬盤(pán)上的,只不過(guò)需要經(jīng)常讀取的數(shù)據(jù)會(huì)被加載到內(nèi)存中,將數(shù)據(jù)存儲(chǔ)在物理內(nèi)存中,從而達(dá)到高速讀寫(xiě)。 成熟度與廣泛度:新興數(shù)據(jù)庫(kù),成熟度較低,No SQL 數(shù)據(jù)庫(kù)中最為接近關(guān)系型數(shù)據(jù)庫(kù),比較完善的 DB 之一,適用人群不斷在增長(zhǎng)。 MongoDB 優(yōu)點(diǎn): 1.性能優(yōu)越:快速!在適量級(jí)的內(nèi)存的 MongoDB 的性能是非常迅速的,它將熱數(shù)據(jù)存儲(chǔ)在物理內(nèi)存中,使得熱數(shù)據(jù)的讀寫(xiě)變得十分快, 2.高擴(kuò)展:第三方支持豐富(這是與其他的 No SQL 相比,MongoDB 也具有的優(yōu)勢(shì)) 3.自身的 Failover 機(jī)制! 4.弱一致性(最終一致),更能保證用戶(hù)的訪問(wèn)速度 5.文檔結(jié)構(gòu)的存儲(chǔ)方式,能夠更便捷的獲取數(shù)據(jù): json 的存儲(chǔ)格式 6.支持大容量的存儲(chǔ),內(nèi)置 GridFS 7.內(nèi)置 Sharding MongoDB 缺點(diǎn): 主要是無(wú)事物機(jī)制! ① MongoDB 不支持事務(wù)操作(最主要的缺點(diǎn)) ② MongoDB 占用空間過(guò)大 ③ MongoDB 沒(méi)有如 MySQL 那樣成熟的維護(hù)工具,這對(duì)于開(kāi)發(fā)和IT運(yùn)營(yíng)都是個(gè)值得注意的地方 Redis: 它就是一個(gè)不折不扣的內(nèi)存數(shù)據(jù)庫(kù)。 持久化方式: Redis 所有數(shù)據(jù)都是放在內(nèi)存中的,持久化是使用 RDB 方式或者 aof 方式。 MySQL: 無(wú)論數(shù)據(jù)還是索引都存放在硬盤(pán)中。到要使用的時(shí)候才交換到內(nèi)存中。能夠處理遠(yuǎn)超過(guò)內(nèi)存總量的數(shù)據(jù)。 關(guān)系型數(shù)據(jù)庫(kù)。 在不同的引擎上有不同 的存儲(chǔ)方式。 查詢(xún)語(yǔ)句是使用傳統(tǒng)的 SQL 語(yǔ)句,擁有較為成熟的體系,成熟度很高。 開(kāi)源數(shù)據(jù)庫(kù)的份額在不斷增加,MySQL 的份額頁(yè)在持續(xù)增長(zhǎng)。 缺點(diǎn)就是在海量數(shù)據(jù)處理的時(shí)候效率會(huì)顯著變慢。 數(shù)據(jù)量和性能的比較: 當(dāng)物理內(nèi)存夠用的時(shí)候,Redis > MongoDB > MySQL 當(dāng)物理內(nèi)存不夠用的時(shí)候,Redis 和 MongoDB 都會(huì)使用虛擬內(nèi)存。 實(shí)際上如果Redis要開(kāi)始虛擬內(nèi)存,那很明顯要么加內(nèi)存條,要么你就該換個(gè)數(shù)據(jù)庫(kù)了。 但是,MongoDB 不一樣,只要,業(yè)務(wù)上能保證,冷熱數(shù)據(jù)的讀寫(xiě)比,使得熱數(shù)據(jù)在物理內(nèi)存中,mmap 的交換較少。 MongoDB 還是能夠保證性能。有人使用 MongoDB 存儲(chǔ)了上T的數(shù)據(jù)。 MySQL,MySQL根本就不需要擔(dān)心數(shù)據(jù)量跟內(nèi)存下的關(guān)系。不過(guò),內(nèi)存的量跟熱數(shù)據(jù)的關(guān)系會(huì)極大地影響性能表現(xiàn)。 當(dāng)物理內(nèi)存和虛擬內(nèi)存都不夠用的時(shí)候,估計(jì)除了 MySQL 你沒(méi)什么好選擇了。 其實(shí),從數(shù)據(jù)存儲(chǔ)原理來(lái)看,我更傾向于將 MongoDB 歸類(lèi)為硬盤(pán)數(shù)據(jù)庫(kù),但是使用了 mmap 作為加速的手段而已。 簡(jiǎn)說(shuō)mmap: mmap系統(tǒng)調(diào)用并不是完全為了用于共享內(nèi)存而設(shè)計(jì)的。它本身提供了不同于一般對(duì)普通文件的訪問(wèn)方式,進(jìn)程可以像讀寫(xiě)內(nèi)存一樣對(duì)普通文件進(jìn)行操作。 mmap 系統(tǒng)調(diào)用使得進(jìn)程之間通過(guò)映射同一個(gè)普通文件實(shí)現(xiàn)共享內(nèi)存。普通文件被映射到進(jìn)程地址空間后,進(jìn)程可以像訪問(wèn)普通內(nèi)存一樣對(duì)文件進(jìn)行訪問(wèn),不必再調(diào)用。 read(),write()等操作。mmap 并不分配空間, 只是將文件映射到調(diào)用進(jìn)程的地址空間里, 然后你就可以用 memcpy 等操作寫(xiě)文件, 而不用 write() 了.寫(xiě)完后用 msync() 同步一下, 你所寫(xiě)的內(nèi)容就保存到文件里了. 不過(guò)這種方式?jīng)]辦法增加文件的長(zhǎng)度, 因?yàn)橐成涞拈L(zhǎng)度在調(diào)用 mmap() 的時(shí)候就決定了。 MongoDB 與 MySQL 的適用場(chǎng)景: MongoDB 的適用場(chǎng)景為:數(shù)據(jù)不是特別重要(例如通知,推送這些),數(shù)據(jù)表結(jié)構(gòu)變化較為頻繁,數(shù)據(jù)量特別大,數(shù)據(jù)的并發(fā)性特別高,數(shù)據(jù)結(jié)構(gòu)比較特別(例如地圖的位置坐標(biāo)),這些情況下用 MongoDB , 其他情況就還是用 MySQL ,這樣組合使用就可以達(dá)到最大的效率。 1.如果需要將 MongoDB 作為后端 db 來(lái)代替MySQL使用,即這里 MySQL 與 MongoDB 屬于平行級(jí)別,那么,這樣的使用可能有以下幾種情況的考量: (1)MongoDB 所負(fù)責(zé)部分以文檔形式存儲(chǔ),能夠有較好的代碼親和性,json 格式的直接寫(xiě)入方便。(如日志之類(lèi)) (2)從 data models 設(shè)計(jì)階段就將原子性考慮于其中,無(wú)需事務(wù)之類(lèi)的輔助。開(kāi)發(fā)用如 nodejs 之類(lèi)的語(yǔ)言來(lái)進(jìn)行開(kāi)發(fā),對(duì)開(kāi)發(fā)比較方便。 (3)MongoDB 本身的 failover 機(jī)制,無(wú)需使用如 MHA 之類(lèi)的方式實(shí)現(xiàn)。 2.將 MongoDB 作為類(lèi)似 Redis,memcache 來(lái)做緩存db,為 MySQL 提供服務(wù),或是后端日志收集分析。 考慮到 MongoDB 屬于 No SQL 型數(shù)據(jù)庫(kù),SQL 語(yǔ)句與數(shù)據(jù)結(jié)構(gòu)不如 MySQL 那么親和 ,也會(huì)有很多時(shí)候?qū)?MongoDB 做為輔助MySQL 而使用的類(lèi) Redis memcache 之類(lèi)的緩存db來(lái)使用。 亦或是僅作日志收集分析。 MongoDB 有一個(gè)最大的缺點(diǎn),就是它占用的空間很大,因?yàn)樗鼘儆诘湫涂臻g換時(shí)間原則的類(lèi)型。那么它的磁盤(pán)空間比普通數(shù)據(jù)庫(kù)會(huì)浪費(fèi)一些,而且到目前為止它還沒(méi)有實(shí)現(xiàn)在線壓縮功能,在 MongoDB 中頻繁的進(jìn)行數(shù)據(jù)增刪改時(shí),如果記錄變了,例如數(shù)據(jù)大小發(fā)生了變化,這時(shí)候容易產(chǎn)生一些數(shù)據(jù)碎片,出現(xiàn)碎片引發(fā)的結(jié)果,一個(gè)是索引會(huì)出現(xiàn)性能問(wèn)題。 另外一個(gè)就是在一定的時(shí)間后,所占空間會(huì)莫明其妙地增大,所以要定期把數(shù)據(jù)庫(kù)做修復(fù),定期重新做索引,這樣會(huì)提升MongoDB 的穩(wěn)定性和效率。 1.MySQL 來(lái)自女兒的名字; MongoDB 來(lái)自 humongous 2.MySQL 使用 Table/Row/Column; MongoDB 使用 Collection/Document 3.MySQL 需要指定 table 的 schema; MongoDB的 collection 的每個(gè) document 的 schema 可以自由修改 4.MySQL 支持 join; MongoDB 沒(méi)有 join 5.MySQL 使用 SQL 語(yǔ)言; MongoDB 使用類(lèi)似 JavaScript 的函數(shù) 命令對(duì)比 MongoDB 與 MySQL 命令對(duì)比 傳統(tǒng)的關(guān)系數(shù)據(jù)庫(kù)一般由數(shù)據(jù)庫(kù)(database)、表(table)、記錄(record)三個(gè)層次概念組成,MongoDB 是由數(shù)據(jù)庫(kù)(database)、集合(collection)、文檔對(duì)象(document)三個(gè)層次組成。MongoDB對(duì)于關(guān)系型數(shù)據(jù)庫(kù)里的表,但是集合中沒(méi)有列、行和關(guān)系概念,這體現(xiàn)了模式自由的特點(diǎn)。 MongoDB (文檔型數(shù)據(jù)庫(kù)):提供可擴(kuò)展的高性能數(shù)據(jù)存儲(chǔ) 1、基于分布式文件存儲(chǔ) 2、高負(fù)載情況下添加更多節(jié)點(diǎn),可以保證服務(wù)器性能 3、將數(shù)據(jù)存儲(chǔ)為一個(gè)文檔 MongoDB 與 MySQL 的比較 1、穩(wěn)定性 2、索引,索引放在內(nèi)存中,能夠提升隨機(jī)讀寫(xiě)的性能。如果索引不能完全放在內(nèi)存,一旦出現(xiàn)隨機(jī)讀寫(xiě)比較高的時(shí)候,就會(huì)頻繁地進(jìn)行磁盤(pán)交換,MongoDB 的性能就會(huì)急劇下降 3、占用的空間很大,因?yàn)樗鼘儆诘湫涂臻g換時(shí)間原則的類(lèi)型。那么它的磁盤(pán)空間比普通數(shù)據(jù)庫(kù)會(huì)浪費(fèi)一些,而且到目前為止它還沒(méi)有實(shí)現(xiàn)在線壓縮功能, 在 MongoDB 中頻繁的進(jìn)行數(shù)據(jù)增刪改時(shí),如果記錄變了,例如數(shù)據(jù)大小發(fā)生了變化,這時(shí)候容易產(chǎn)生一些數(shù)據(jù)碎片,出現(xiàn)碎片引發(fā)的結(jié)果, 一個(gè)是索引會(huì)出現(xiàn)性能問(wèn)題, 另外一個(gè)就是在一定的時(shí)間后,所占空間會(huì)莫明其妙地增大,所以要定期把數(shù)據(jù)庫(kù)做修復(fù),定期重新做索引,這樣會(huì)提升MongoDB 的穩(wěn)定性和效率。 在最新的版本里,它已經(jīng)在實(shí)現(xiàn)在線壓縮,估計(jì)應(yīng)該在2.0版左右,應(yīng)該能夠?qū)崿F(xiàn)在線壓縮,可以在后臺(tái)執(zhí)行現(xiàn)在repair DataBase 的一些操作。如果那樣,就解決了目前困擾我們的大問(wèn)題。 4、MongoDB 對(duì)數(shù)據(jù)間的事務(wù)關(guān)系支持比較弱 5、運(yùn)維不方便 MongoDB 相對(duì)于 MySQL 的優(yōu)勢(shì) 1. 適合那些對(duì)數(shù)據(jù)庫(kù)具體數(shù)據(jù)格式不明確或者數(shù)據(jù)庫(kù)數(shù)據(jù)格式經(jīng)常變化的需求模型,而且對(duì)開(kāi)發(fā)者十分友好。 2. 自帶一個(gè)分布式文件系統(tǒng),可以很方便地部署到服務(wù)器機(jī)群上。 MongoDB 里有一個(gè)Shard的概念,就是方便為了服務(wù)器分片使用的。每增加一臺(tái)Shard,MongoDB 的插入性能也會(huì)以接近倍數(shù)的方式增長(zhǎng),磁盤(pán)容量也很可以很方便地?cái)U(kuò)充。 3. 自帶了對(duì)map-reduce運(yùn)算框架的支持,這也很方便進(jìn)行數(shù)據(jù)的統(tǒng)計(jì)。類(lèi)似于group by MongoDB 與 MySQL 命令對(duì)比 傳統(tǒng)的關(guān)系數(shù)據(jù)庫(kù)一般由數(shù)據(jù)庫(kù)(database)、表(table)、記錄(record)三個(gè)層次概念組成, MongoDB 是由數(shù)據(jù)庫(kù)(database)、集合(collection)、文檔對(duì)象(document)三個(gè)層次組成。 MongoDB 對(duì)于關(guān)系型數(shù)據(jù)庫(kù)里的表,但是集合中沒(méi)有列、行和關(guān)系概念,這體現(xiàn)了模式自由的特點(diǎn)。 MongoDB 和 Redis 的區(qū)別: 簡(jiǎn)介 MongoDB 更類(lèi)似 MySQL,支持字段索引、游標(biāo)操作,其優(yōu)勢(shì)在于查詢(xún)功能比較強(qiáng)大,擅長(zhǎng)查詢(xún) JSON 數(shù)據(jù),能存儲(chǔ)海量數(shù)據(jù),但是不支持事務(wù)。 MySQL 在大數(shù)據(jù)量時(shí)效率顯著下降,MongoDB 更多時(shí)候作為關(guān)系數(shù)據(jù)庫(kù)的一種替代。 內(nèi)存管理機(jī)制 Redis 數(shù)據(jù)全部存在內(nèi)存,定期寫(xiě)入磁盤(pán),當(dāng)內(nèi)存不夠時(shí),可以選擇指定的 LRU 算法刪除數(shù)據(jù)。 MongoDB 數(shù)據(jù)存在內(nèi)存,由 linux系統(tǒng) mmap 實(shí)現(xiàn),當(dāng)內(nèi)存不夠時(shí),只將熱點(diǎn)數(shù)據(jù)放入內(nèi)存,其他數(shù)據(jù)存在磁盤(pán)。 支持的數(shù)據(jù)結(jié)構(gòu) Redis 支持的數(shù)據(jù)結(jié)構(gòu)豐富,包括hash、set、list等。 MongoDB 數(shù)據(jù)結(jié)構(gòu)比較單一,但是支持豐富的數(shù)據(jù)表達(dá),索引,最類(lèi)似關(guān)系型數(shù)據(jù)庫(kù),支持的查詢(xún)語(yǔ)言非常豐富。 性能 二者性能都比較高,應(yīng)該說(shuō)都不會(huì)是瓶頸。 可靠性 二者均支持持久化。 集群 MongoDB 集群技術(shù)比較成熟,Redis從3.0開(kāi)始支持集群。 不適用的場(chǎng)景 ? 需要使用復(fù)雜sql的操作 ? 事務(wù)性系統(tǒng) 下面是 MongoDB 和 Redis 的對(duì)比圖: MySQL 與 Redis 的區(qū)別: MySQL 是持久化存儲(chǔ),存放在磁盤(pán)里面,檢索的話,會(huì)涉及到一定的 IO,為了解決這個(gè)瓶頸,于是出現(xiàn)了緩存,比如現(xiàn)在用的最多的 memcached(簡(jiǎn)稱(chēng)mc)。首先,用戶(hù)訪問(wèn)mc,如果未命中,就去訪問(wèn) MySQL,之后像內(nèi)存和硬盤(pán)一樣,把數(shù)據(jù)復(fù)制到mc一部分。 Redis 和mc都是緩存,并且都是駐留在內(nèi)存中運(yùn)行的,這大大提升了高數(shù)據(jù)量web訪問(wèn)的訪問(wèn)速度。然而mc只是提供了簡(jiǎn)單的數(shù)據(jù)結(jié)構(gòu),比如 string存儲(chǔ);Redis卻提供了大量的數(shù)據(jù)結(jié)構(gòu),比如string、list、set、hashset、sorted set這些,這使得用戶(hù)方便了好多,畢竟封裝了一層實(shí)用的功能,同時(shí)實(shí)現(xiàn)了同樣的效果,當(dāng)然用Redis而慢慢舍棄mc。 內(nèi)存和硬盤(pán)的關(guān)系,硬盤(pán)放置主體數(shù)據(jù)用于持久化存儲(chǔ),而內(nèi)存則是當(dāng)前運(yùn)行的那部分?jǐn)?shù)據(jù),CPU訪問(wèn)內(nèi)存而不是磁盤(pán),這大大提升了運(yùn)行的速度,當(dāng)然這是基于程序的局部化訪問(wèn)原理。 推理到 Redis + MySQL,它是內(nèi)存+磁盤(pán)關(guān)系的一個(gè)映射,MySQL 放在磁盤(pán),Redis放在內(nèi)存,這樣的話,web應(yīng)用每次只訪問(wèn)Redis,如果沒(méi)有找到的數(shù)據(jù),才去訪問(wèn) MySQL。 然而 Redis + MySQL 和內(nèi)存+磁盤(pán)的用法最好是不同的。 前者是內(nèi)存數(shù)據(jù)庫(kù),數(shù)據(jù)保存在內(nèi)存中,當(dāng)然速度快。 后者是關(guān)系型數(shù)據(jù)庫(kù),功能強(qiáng)大,數(shù)據(jù)訪問(wèn)也就慢。 像memcache,MongoDB,Redis,都屬于No SQL系列。 不是一個(gè)類(lèi)型的東西,應(yīng)用場(chǎng)景也不太一樣,還是要看你的需求來(lái)決定。 ———————————————— 版權(quán)聲明:本文為CSDN博主「喵星人Xcode」的原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。 原文鏈接:https://blog.csdn.net/CatStarXcode/article/details/79513425 |
|
|