MongoDB與Redis的區(qū)別分析

MongoDB 和 Redis 的區(qū)別:

簡介

MongoDB 更類似?MySQL,支持字段索引、游標(biāo)操作,其優(yōu)勢在于查詢功能比較強(qiáng)大擅長查詢 JSON 數(shù)據(jù)能存儲海量數(shù)據(jù)但是不支持事務(wù)

MySQL?在大數(shù)據(jù)量時效率顯著下降,MongoDB 更多時候作為關(guān)系數(shù)據(jù)庫的一種替代。

Redis 是一個開源(BSD許可)的,內(nèi)存中的數(shù)據(jù)結(jié)構(gòu)存儲系統(tǒng),它可以用作數(shù)據(jù)庫、緩存消息中間件。它支持多種類型的數(shù)據(jù)結(jié)構(gòu),如 字符串(strings), 散列(hashes),列表(lists), 集合(sets), 有序集合(sorted sets) 與范圍查詢, bitmaps, hyperloglogs 和 地理空間(geospatial) 索引半徑查詢。 Redis 內(nèi)置了 復(fù)制(replication),LUA腳本(Lua scripting), LRU驅(qū)動事件(LRU eviction),事務(wù)(transactions) 和不同級別的 磁盤持久化(persistence),并通過 Redis哨兵(Sentinel)和自動 分區(qū)(Cluster)提供高可用性(high availability)

內(nèi)存管理機(jī)制

Redis 數(shù)據(jù)全部存在內(nèi)存,定期寫入磁盤,當(dāng)內(nèi)存不夠時,可以選擇指定的 LRU 算法刪除數(shù)據(jù)。

MongoDB 數(shù)據(jù)存在內(nèi)存,由 linux系統(tǒng) mmap 實(shí)現(xiàn),當(dāng)內(nèi)存不夠時,只將熱點(diǎn)數(shù)據(jù)放入內(nèi)存,其他數(shù)據(jù)存在磁盤。

持久化方式:

mongodb的所有數(shù)據(jù)實(shí)際上是存放在硬盤的,所有要操作的數(shù)據(jù)通過mmap的方式映射到內(nèi)存某個區(qū)域內(nèi)。

然后,mongodb就在這塊區(qū)域里面進(jìn)行數(shù)據(jù)修改,避免了零碎的硬盤操作。

至于mmap上的內(nèi)容flush到硬盤就是操作系統(tǒng)的事情了,所以,如果,mongodb在內(nèi)存中修改了數(shù)據(jù)后,mmap數(shù)據(jù)flush到硬盤之前,系統(tǒng)宕機(jī)了,數(shù)據(jù)就會丟失。

mmap詳解鏈接:http://www.cnblogs.com/techdoc/archive/2010/12/22/1913521.html

(mmap系統(tǒng)調(diào)用并不是完全為了用于共享內(nèi)存而設(shè)計的。它本身提供了不同于一般對普通文件的訪問方式,進(jìn)程可以像讀寫內(nèi)存一樣對普通文件進(jìn)行操作。

mmap 系統(tǒng)調(diào)用使得進(jìn)程之間通過映射同一個普通文件實(shí)現(xiàn)共享內(nèi)存。普通文件被映射到進(jìn)程地址空間后,進(jìn)程可以像訪問普通內(nèi)存一樣對文件進(jìn)行訪問,不必再調(diào)用。 read(),write()等操作。mmap并不分配空間, 只是將文件映射到調(diào)用進(jìn)程的地址空間里, 然后你就可以用memcpy等操作寫文件, 而不用write()了.寫完后用msync()同步一下, 你所寫的內(nèi)容就保存到文件里了. 不過這種方式?jīng)]辦法增加文件的長度, 因?yàn)橐成涞拈L度在調(diào)用mmap()的時候就決定了。)

redis:

它就是一個不折不扣的內(nèi)存數(shù)據(jù)庫了。

持久化方式:

redis所有數(shù)據(jù)都是放在內(nèi)存中的,持久化是使用RDB方式或者aof方式。

解密redis持久化:http://blog.nosqlfan.com/html/3813.html

mysql:

無論數(shù)據(jù)還是索引都存放在硬盤中。到要使用的時候才交換到內(nèi)存中。能夠處理遠(yuǎn)超過內(nèi)存總量的數(shù)據(jù)。

支持的數(shù)據(jù)結(jié)構(gòu)

Redis 支持的數(shù)據(jù)結(jié)構(gòu)豐富,包括hash、set、list等。

MongoDB 數(shù)據(jù)結(jié)構(gòu)比較單一,但是支持豐富的數(shù)據(jù)表達(dá),索引,最類似關(guān)系型數(shù)據(jù)庫,支持的查詢語言非常豐富。

數(shù)據(jù)量和性能:

當(dāng)物理內(nèi)存夠用的時候,redis>mongodb>mysql

當(dāng)物理內(nèi)存不夠用的時候,redis和mongodb都會使用虛擬內(nèi)存。

實(shí)際上如果redis要開始虛擬內(nèi)存,那很明顯要么加內(nèi)存條,要么你換個數(shù)據(jù)庫了。

但是,mongodb不一樣,只要,業(yè)務(wù)上能保證,冷熱數(shù)據(jù)的讀寫比,使得熱數(shù)據(jù)在物理內(nèi)存中,mmap的交換較少。

mongodb還是能夠保證性能。

性能

二者性能都比較高,應(yīng)該說都不會是瓶頸。

可靠性

二者均支持持久化。

事務(wù)支持情況

Redis 事務(wù)支持比較弱,只能保證事務(wù)中的每個操作連續(xù)執(zhí)行

mongodb不支持事務(wù)

集群

MongoDB 集群技術(shù)比較成熟,Redis從3.0開始支持集群。

不適用的場景

? ?需要使用復(fù)雜sql的操作

? ?事務(wù)性系統(tǒng)

下面是?MongoDB 和?Redis?的對比圖:

MySQL 與?Redis 的區(qū)別:

MySQL 是持久化存儲,存放在磁盤里面,檢索的話,會涉及到一定的 IO,為了解決這個瓶頸,于是出現(xiàn)了緩存,比如現(xiàn)在用的最多的 memcached(簡稱mc)。首先,用戶訪問mc,如果未命中,就去訪問 MySQL,之后像內(nèi)存和硬盤一樣,把數(shù)據(jù)復(fù)制到mc一部分。

  Redis 和mc都是緩存,并且都是駐留在內(nèi)存中運(yùn)行的,這大大提升了高數(shù)據(jù)量web訪問的訪問速度。然而mc只是提供了簡單的數(shù)據(jù)結(jié)構(gòu),比如 string存儲;Redis卻提供了大量的數(shù)據(jù)結(jié)構(gòu),比如string、list、set、hashset、sorted set這些,這使得用戶方便了好多,畢竟封裝了一層實(shí)用的功能,同時實(shí)現(xiàn)了同樣的效果,當(dāng)然用Redis而慢慢舍棄mc。

  內(nèi)存和硬盤的關(guān)系,硬盤放置主體數(shù)據(jù)用于持久化存儲,而內(nèi)存則是當(dāng)前運(yùn)行的那部分?jǐn)?shù)據(jù),CPU訪問內(nèi)存而不是磁盤,這大大提升了運(yùn)行的速度,當(dāng)然這是基于程序的局部化訪問原理。

  推理到 Redis + MySQL,它是內(nèi)存+磁盤關(guān)系的一個映射,MySQL 放在磁盤,Redis放在內(nèi)存,這樣的話,web應(yīng)用每次只訪問Redis,如果沒有找到的數(shù)據(jù),才去訪問 MySQL。

  然而 Redis + MySQL 和內(nèi)存+磁盤的用法最好是不同的。

前者是內(nèi)存數(shù)據(jù)庫,數(shù)據(jù)保存在內(nèi)存中,當(dāng)然速度快。

后者是關(guān)系型數(shù)據(jù)庫,功能強(qiáng)大,數(shù)據(jù)訪問也就慢。

像memcache,MongoDB,Redis,都屬于No SQL系列。

不是一個類型的東西,應(yīng)用場景也不太一樣,還是要看你的需求來決定。

Mongodb與redis相比較:

mongoDB 源碼語言是C++,redis也是C或C++,

mongodb 文件存儲是BSON格式類似JSON,或自定義的二進(jìn)制格式。

mongodb與redis性能都很依賴內(nèi)存的大小,mongodb 有豐富的數(shù)據(jù)表達(dá)、索引;最類似于關(guān)系數(shù)據(jù)庫,支持豐富的查詢語言,redis數(shù)據(jù)豐富,較少的IO ,這方面mongodb優(yōu)勢明顯。

mongodb不支持事物,靠客戶端自身保證,redis支持事物,比較弱,僅能保證事物中的操作按順序執(zhí)行,這方面 redis優(yōu)于mongodb。

mongodb對海量數(shù)據(jù)的訪問效率提升,redis 較小數(shù)據(jù)量的性能及運(yùn)算,這方面 mongodb性能優(yōu)于redis .monbgodb 有mapredurce功能,提供數(shù)據(jù)分析,redis 沒有 ,這方面 mongodb優(yōu)于redis 。

參考

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 關(guān)于Mongodb的全面總結(jié) MongoDB的內(nèi)部構(gòu)造《MongoDB The Definitive Guide》...
    中v中閱讀 32,329評論 2 89
  • 轉(zhuǎn)載地址:http://gnucto.blog.51cto.com/3391516/998509 Redis與Me...
    Ddaidai閱讀 21,553評論 0 82
  • 本文將從Redis的基本特性入手,通過講述Redis的數(shù)據(jù)結(jié)構(gòu)和主要命令對Redis的基本能力進(jìn)行直觀介紹。之后概...
    kelgon閱讀 61,690評論 23 625
  • 月?lián)嵘骄?一線明光陰迫 月影婆娑 風(fēng)在吟靜悄悄 月催人老 蟬在鳴燈火燒 月光搖落 手張開心放空 月上眉梢 魚美人有...
    二馬行空閱讀 494評論 5 6
  • 人生百態(tài),社會萬象,一個人一個故事,一個故事一個輪回。 每個人都是主角,主導(dǎo)自己的人生大戲。無論是否有主角的光環(huán)照...
    肉羅閱讀 386評論 2 5

友情鏈接更多精彩內(nèi)容