MongoDB 和 Redis 的區(qū)別:
簡介
MongoDB 更類似?MySQL,支持字段索引缤剧、游標操作,其優(yōu)勢在于查詢功能比較強大域慷,擅長查詢 JSON 數(shù)據(jù)鞭执,能存儲海量數(shù)據(jù)司顿,但是不支持事務。
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)置了 復制(replication),LUA腳本(Lua scripting)锣夹, LRU驅(qū)動事件(LRU eviction)页徐,事務(transactions) 和不同級別的 磁盤持久化(persistence),并通過 Redis哨兵(Sentinel)和自動 分區(qū)(Cluster)提供高可用性(high availability)
內(nèi)存管理機制
Redis 數(shù)據(jù)全部存在內(nèi)存银萍,定期寫入磁盤变勇,當內(nèi)存不夠時,可以選擇指定的 LRU 算法刪除數(shù)據(jù)贴唇。
MongoDB 數(shù)據(jù)存在內(nèi)存搀绣,由 linux系統(tǒng) mmap 實現(xiàn),當內(nèi)存不夠時戳气,只將熱點數(shù)據(jù)放入內(nèi)存链患,其他數(shù)據(jù)存在磁盤。
持久化方式:
mongodb的所有數(shù)據(jù)實際上是存放在硬盤的物咳,所有要操作的數(shù)據(jù)通過mmap的方式映射到內(nèi)存某個區(qū)域內(nèi)。
然后蹄皱,mongodb就在這塊區(qū)域里面進行數(shù)據(jù)修改览闰,避免了零碎的硬盤操作。
至于mmap上的內(nèi)容flush到硬盤就是操作系統(tǒng)的事情了巷折,所以压鉴,如果,mongodb在內(nèi)存中修改了數(shù)據(jù)后锻拘,mmap數(shù)據(jù)flush到硬盤之前油吭,系統(tǒng)宕機了击蹲,數(shù)據(jù)就會丟失。
mmap詳解鏈接:http://www.cnblogs.com/techdoc/archive/2010/12/22/1913521.html
(mmap系統(tǒng)調(diào)用并不是完全為了用于共享內(nèi)存而設計的婉宰。它本身提供了不同于一般對普通文件的訪問方式,進程可以像讀寫內(nèi)存一樣對普通文件進行操作心包。
mmap 系統(tǒng)調(diào)用使得進程之間通過映射同一個普通文件實現(xiàn)共享內(nèi)存类咧。普通文件被映射到進程地址空間后,進程可以像訪問普通內(nèi)存一樣對文件進行訪問蟹腾,不必再調(diào)用痕惋。 read(),write()等操作娃殖。mmap并不分配空間, 只是將文件映射到調(diào)用進程的地址空間里, 然后你就可以用memcpy等操作寫文件, 而不用write()了.寫完后用msync()同步一下, 你所寫的內(nèi)容就保存到文件里了. 不過這種方式?jīng)]辦法增加文件的長度, 因為要映射的長度在調(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)存中叶洞。能夠處理遠超過內(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ù)表達昼钻,索引,最類似關(guān)系型數(shù)據(jù)庫封寞,支持的查詢語言非常豐富然评。
數(shù)據(jù)量和性能:
當物理內(nèi)存夠用的時候,redis>mongodb>mysql
當物理內(nèi)存不夠用的時候狈究,redis和mongodb都會使用虛擬內(nèi)存碗淌。
實際上如果redis要開始虛擬內(nèi)存,那很明顯要么加內(nèi)存條抖锥,要么你換個數(shù)據(jù)庫了亿眠。
但是,mongodb不一樣磅废,只要纳像,業(yè)務上能保證,冷熱數(shù)據(jù)的讀寫比拯勉,使得熱數(shù)據(jù)在物理內(nèi)存中竟趾,mmap的交換較少憔购。
mongodb還是能夠保證性能。
性能
二者性能都比較高岔帽,應該說都不會是瓶頸玫鸟。
可靠性
二者均支持持久化。
事務支持情況
Redis 事務支持比較弱山卦,只能保證事務中的每個操作連續(xù)執(zhí)行
mongodb不支持事務
集群
MongoDB 集群技術(shù)比較成熟鞋邑,Redis從3.0開始支持集群。
不適用的場景
? ?需要使用復雜sql的操作
? ?事務性系統(tǒng)
下面是?MongoDB 和?Redis?的對比圖:
MySQL 與?Redis 的區(qū)別:
MySQL 是持久化存儲账蓉,存放在磁盤里面枚碗,檢索的話,會涉及到一定的 IO铸本,為了解決這個瓶頸肮雨,于是出現(xiàn)了緩存,比如現(xiàn)在用的最多的 memcached(簡稱mc)箱玷。首先怨规,用戶訪問mc,如果未命中锡足,就去訪問 MySQL波丰,之后像內(nèi)存和硬盤一樣,把數(shù)據(jù)復制到mc一部分舶得。
Redis 和mc都是緩存掰烟,并且都是駐留在內(nèi)存中運行的,這大大提升了高數(shù)據(jù)量web訪問的訪問速度沐批。然而mc只是提供了簡單的數(shù)據(jù)結(jié)構(gòu)纫骑,比如 string存儲;Redis卻提供了大量的數(shù)據(jù)結(jié)構(gòu)九孩,比如string先馆、list、set躺彬、hashset煤墙、sorted set這些,這使得用戶方便了好多宪拥,畢竟封裝了一層實用的功能仿野,同時實現(xiàn)了同樣的效果,當然用Redis而慢慢舍棄mc江解。
內(nèi)存和硬盤的關(guān)系设预,硬盤放置主體數(shù)據(jù)用于持久化存儲徙歼,而內(nèi)存則是當前運行的那部分數(shù)據(jù)犁河,CPU訪問內(nèi)存而不是磁盤鳖枕,這大大提升了運行的速度,當然這是基于程序的局部化訪問原理桨螺。
推理到 Redis + MySQL宾符,它是內(nèi)存+磁盤關(guān)系的一個映射,MySQL 放在磁盤灭翔,Redis放在內(nèi)存魏烫,這樣的話,web應用每次只訪問Redis肝箱,如果沒有找到的數(shù)據(jù)哄褒,才去訪問 MySQL。
然而 Redis + MySQL 和內(nèi)存+磁盤的用法最好是不同的煌张。
前者是內(nèi)存數(shù)據(jù)庫呐赡,數(shù)據(jù)保存在內(nèi)存中,當然速度快骏融。
后者是關(guān)系型數(shù)據(jù)庫链嘀,功能強大,數(shù)據(jù)訪問也就慢档玻。
像memcache怀泊,MongoDB,Redis误趴,都屬于No SQL系列霹琼。
不是一個類型的東西,應用場景也不太一樣冤留,還是要看你的需求來決定碧囊。
Mongodb與redis相比較:
mongoDB 源碼語言是C++,redis也是C或C++,
mongodb 文件存儲是BSON格式類似JSON,或自定義的二進制格式纤怒。
mongodb與redis性能都很依賴內(nèi)存的大小糯而,mongodb 有豐富的數(shù)據(jù)表達、索引泊窘;最類似于關(guān)系數(shù)據(jù)庫熄驼,支持豐富的查詢語言,redis數(shù)據(jù)豐富烘豹,較少的IO 瓜贾,這方面mongodb優(yōu)勢明顯。
mongodb不支持事物携悯,靠客戶端自身保證祭芦,redis支持事物,比較弱憔鬼,僅能保證事物中的操作按順序執(zhí)行龟劲,這方面 redis優(yōu)于mongodb胃夏。
mongodb對海量數(shù)據(jù)的訪問效率提升,redis 較小數(shù)據(jù)量的性能及運算,這方面 mongodb性能優(yōu)于redis .monbgodb 有mapredurce功能昌跌,提供數(shù)據(jù)分析仰禀,redis 沒有 ,這方面 mongodb優(yōu)于redis 蚕愤。