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 。
