Redis和Memcache和MongoDB簡介及區別分析(整理)

Redis和Memcache

1、Redis簡介

Redis是一個開源的使用ANSI C語言編寫、支持網絡、可基於內存亦可持久化的日誌型、Key-Value數據庫,並提供多種語言的API。從2010年3月15日起,Redis的開發工做由VMware主持。從2013年5月開始,Redis的開發由Pivotal贊助。javascript

NoSql 數據存儲html

redis是一個 key-value存儲系統。和 Memcached相似,它支持存儲的value類型相對更多,包括 string(字符串)、list(鏈表)、set(集合)、zset(sorted set --有序集合)和hash(哈希類型)。這些 數據類型都支持push/pop、add/remove及取交集並集和差集及更豐富的操做,並且這些操做都是原子性的。在此基礎上,redis支持各類不一樣方式的排序。與memcached同樣,爲了保證效率,數據都是 緩存在內存中。區別的是redis會 週期性的把更新的數據寫入磁盤或者把修改操做寫入追加的 記錄文件,而且在此基礎上實現了master-slave(主從)同步。
Redis 是一個高性能的key-value數據庫。 redis的出現,很大程度 補償了memcached這類key/value存儲的不足,在部 分場合能夠對 關係數據庫起到很好的 補充做用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客戶端,使用很方便。[1]  
Redis支持主從同步。數據能夠從主服務器向任意數量的從服務器上同步,從服務器能夠是關聯其餘從服務器的主服務器。這使得Redis可執行單層樹複製。存盤能夠有意無心的對數據進行寫操做。因爲徹底實現了發佈/訂閱機制,使得從數據庫在任何地方同步樹時,可訂閱一個頻道並接收主服務器完整的消息發佈記錄。同步對讀取操做的可擴展性和數據冗餘頗有幫助。
redis的官網地址,很是好記,是redis.io。(特地查了一下,域名後綴io屬於國家域名,是british Indian Ocean territory,即英屬印度洋領地)
目前,Vmware在資助着redis項目的開發和維護。
 
下面是官方的bench-mark數據:[1]  
測試完成了50個併發執行100000個請求。
設置和獲取的值是一個256字節字符串。
Linux box是運行Linux 2.6,這是X3320 Xeon 2.5 ghz。
文本執行使用loopback接口(127.0.0.1)。
結果:讀的速度是110000次/s,寫的速度是81000次/s 。
 
就DB來講,Redis成績已經很驚人了,且不說 memcachedbTokyo Cabinet之流,就說原版的memcached,速度彷佛也只能達到這個級別。Redis根本是使用 內存存儲,持久化的關鍵是這三條指令:SAVE BGSAVE LASTSAVE …
當接收到SAVE指令的時候,Redis就會dump數據到一個文件裏面。
值得一說的是它的獨家功能:存儲列表和集合,這是它與mc之流相比更有競爭力的地方。
不介紹mc裏面已經有的東東,只列出特殊的:
TYPE key — 用來獲取某key的類型
KEYS pattern — 匹配全部符合模式的key,好比KEYS * 就列出全部的key了,固然,複雜度O(n)
RANDOMKEY - 返回隨機的一個key
RENAME oldkey newkey— key也能夠更名
列表操做,精華
RPUSH key string — 將某個值加入到一個key列表末尾
LPUSH key string — 將某個值加入到一個key列表頭部
LLEN key — 列表長度
LRANGE key start end — 返回列表中某個範圍的值,至關於mysql裏面的 分頁查詢那樣
LTRIM key start end — 只保留列表中某個範圍的值
LINDEX key index — 獲取列表中特定索引號的值,要注意是O(n)複雜度
LSET key index value — 設置列表中某個位置的值
LPOP key
RPOP key — 和上面的LPOP同樣,就是相似棧或隊列的那種取頭取尾指令,能夠當成 消息隊列來使用了
集合操做
SADD key member — 增長元素
SREM key member — 刪除元素
SCARD key — 返回集合大小
SISMEMBER key member — 判斷某個值是否在集合中
SINTER key1 key2 ... keyN — 獲取多個集合的交集元素
SMEMBERS key — 列出集合的全部元素
還有Multiple DB的命令,能夠更換db,數據能夠隔離開,默認是存放在DB 0。

 

2、Memcache簡介

memcache是一套分佈式的高速緩存系統,由LiveJournal的Brad Fitzpatrick開發,但目前被許多網站使用以提高網站的訪問速度,尤爲對於一些大型的、須要頻繁訪問數據庫的網站訪問速度提高效果十分顯著[1]  。這是一套開放源代碼軟件,以BSD license受權發佈。java

分佈式高速緩存系統mysql

MemCache的工做流程以下:先檢查客戶端的請求數據 是否在memcached中,若有,直接把請求數據返回,再也不對數據庫進行任何操做;若是請求的數據 不在memcached中,就去查數據庫,把從數據庫中獲取的數據返回給客戶端, 同時把數據緩存一份到memcached中(memcached客戶端不負責,須要程序明確實現);每次 更新數據庫的同時更新memcached中的數據,保證一致性;當分配給memcached內存空間用完以後,會使用 LRU(Least Recently Used,最近最少使用)策略加上到期失效策略,失效數據首先被替換,而後再替換掉最近未使用的數據。[2]  
Memcache是一個高性能的 分佈式的內存對象緩存系統,經過在 內存裏維護一個 統一的巨大的hash表,它可以用來存儲各類 格式的數據,包括 圖像視頻文件以及 數據庫檢索的結果等。簡單的說就是 將數據調用到內存中,而後 從內存中讀取,從而 大大提升讀取速度
Memcache是danga的一個項目,最先是LiveJournal 服務的,最初爲了加速 LiveJournal 訪問速度而開發的,後來被不少大型的網站採用。
Memcached是以守護程序(監聽)方式運行於一個或多個 服務器中,隨時會接收 客戶端鏈接和操做。

 

 

3、MongoDB簡介

MongoDB[1]   是一個基於 分佈式文件存儲數據庫。由 C++語言編寫。旨在爲WEB應用提供 可擴展高性能數據存儲解決方案
mongoDB
MongoDB[2]   是一個 介於關係數據庫非關係數據庫之間的產品,是 非關係數據庫當中功能最豐富,最像關係數據庫的。他支持的數據結構很是鬆散,是相似 jsonbson格式,所以能夠 存儲比較複雜的數據類型。Mongo最大的特色是他支持的 查詢語言很是強大,其語法有點相似於面向對象的查詢語言,幾乎能夠實現相似關係數據庫單表查詢的絕大部分功能,並且還支持對數據創建 索引。[3]  
 
它的特色是 高性能易部署易使用,存儲數據很是方便。主要功能特性有:
*面向集合存儲,易存儲對象類型的數據。
mongodb集羣參考
*模式自由。
*支持動態 查詢
*支持徹底索引,包含內部對象。
*支持查詢。
*支持複製和故障恢復。
*使用高效的二進制數據存儲,包括大型對象(如視頻等)。
*自動處理碎片,以支持雲計算層次的擴展性。
*支持 RUBYPYTHONJAVAC++PHPC#等多種語言。
*文件存儲格式爲BSON(一種JSON的擴展)。
*可經過 網絡訪問。

 

所謂「面向集合」(Collection-Oriented),意思是數據被 分組存儲數據集中,被稱爲一個集合(Collection)。每一個集合在數據庫中都有一個惟一的標識名,而且能夠包含無限數目的文檔。集合的概念相似 關係型數據庫(RDBMS)裏的表(table),不一樣的是它不須要定義任何模式(schema)。Nytro MegaRAID技術中的 閃存高速緩存算法,可以快速識別數據庫內大數據集中的熱數據,提供一致的性能改進。
模式自由(schema-free),意味着對於存儲在mongodb數據庫中的文件,咱們不須要知道它的任何結構定義。若是須要的話,你徹底能夠把不一樣結構的文件存儲在同一個數據庫裏。
存儲在集合中的文檔,被存儲爲 鍵-值對的形式。鍵用於惟一標識一個文檔,爲字符串類型,而值則能夠是各類 雜的文件類型。咱們稱這種存儲形式爲 BSON(Binary Serialized Document Format)。[3]  
[4]   MongoDB已經在多個站點部署,其主要場景以下:
1)網站實時數據處理。它很是適合實時的插入、更新與查詢,並具有網站實時數據存儲所需的複製及高度伸縮性。
2)緩存。因爲性能很高,它適合做爲信息基礎設施的緩存層。在系統重啓以後,由它搭建的持久化緩存層能夠避免下層的數據源過載。
3)高伸縮性的場景。很是適合由數十或數百臺服務器組成的數據庫,它的路線圖中已經包含對MapReduce引擎的內置支持。
不適用的場景以下:1)要求高度事務性的系統。
2)傳統的商業智能應用。
3)複雜的 跨文檔(表)級聯查詢

 

 

4、Redis和Memcache的簡單區別

1. Redis中,並非全部的數據都一直存儲在內存中的,這是和Memcached相比一個最大的區別。 
2. Redis不只僅支持簡單的k/v類型的數據,同時還提供list,set,hash等數據結構的存儲。 
3. Redis支持數據的備份,即master-slave模式的數據備份。 
4. Redis支持數據的持久化,能夠將內存中的數據保持在磁盤中,重啓的時候能夠再次加載進行使用。redis

Redis在不少方面具有數據庫的特徵,或者說就是一個數據庫系統,而Memcached只是簡單的K/V緩存算法

下面是來自redis做者的說法(stackoverflow上面)。 
You should not care too much about performances. Redis is faster per core with small values, but memcached is able to use multiple cores with a single executable and TCP port without help from the client. Also memcached is faster with big values in the order of 100k. Redis recently improved a lot about big values (unstable branch) but still memcached is faster in this use case. The point here is: nor one or the other will likely going to be your bottleneck for the query-per-second they can deliver. 
You should care about memory usage. For simple key-value pairs memcached is more memory efficient. If you use Redis hashes, Redis is more memory efficient. Depends on the use case. 
You should care about persistence and replication, two features only available in Redis. Even if your goal is to build a cache it helps that after an upgrade or a reboot your data are still there. 
You should care about the kind of operations you need. In Redis there are a lot of complex operations, even just considering the caching use case, you often can do a lot more in a single operation, without requiring data to be processed client side (a lot of I/O is sometimes needed). This operations are often as fast as plain GET and SET. So if you don’t need just GEt/SET but more complex things Redis can help a lot (think at timeline caching). 
有網友翻譯以下[1]: 
沒有必要過多的關注性能。因爲Redis只使用單核,而Memcached可使用多核,因此在比較上,平均每個核上Redis在存儲小數據時比Memcached性能更高。而在100k以上的數據中,Memcached性能要高於Redis,雖然Redis最近也在存儲大數據的性能上進行優化,可是比起Memcached,仍是稍有遜色。說了這麼多,結論是,不管你使用哪個,每秒處理請求的次數都不會成爲瓶頸。 
你須要關注內存使用率。對於key-value這樣簡單的數據儲存,memcache的內存使用率更高。若是採用hash結構,redis的內存使用率會更高。固然,這些都依賴於具體的應用場景。 
你須要關注關注數據持久化和主從複製時,只有redis擁有這兩個特性。若是你的目標是構建一個緩存在升級或者重啓後以前的數據不會丟失的話,那也只能選擇redis。 
你應該關心你須要的操做。redis支持不少複雜的操做,甚至只考慮內存的使用狀況,在一個單一操做裏你經常能夠作不少,而不須要將數據讀取到客戶端中(這樣會須要不少的IO操做)。這些複雜的操做基本上和純GET和POST操做同樣快,因此你不僅是須要GET/SET而是更多的操做時,redis會起很大的做用。 
對於二者的選擇仍是要看具體的應用場景,若是須要緩存的數據只是key-value這樣簡單的結構時,我在項目裏仍是採用memcache,它也足夠的穩定可靠。若是涉及到存儲,排序等一系列複雜的操做時,毫無疑問選擇redissql

其餘: 
一、 Redis和Memcache都是將數據存放在內存中,都是內存數據庫。不過memcache還可用於緩存其餘東西,例如圖片、視頻等等。 
二、Redis不只僅支持簡單的k/v類型的數據,同時還提供list,set,hash等數據結構的存儲。 
三、虛擬內存–Redis當物理內存用完時,能夠將一些好久沒用到的value 交換到磁盤 
四、過時策略–memcache在set時就指定,例如set key1 0 0 8,即永不過時。Redis能夠經過例如expire 設定,例如expire name 10 
五、分佈式–設定memcache集羣,利用magent作一主多從;redis能夠作一主多從。均可以一主一從 
六、存儲數據安全–memcache掛掉後,數據沒了;redis能夠按期保存到磁盤(持久化) 
七、災難恢復–memcache掛掉後,數據不可恢復; redis數據丟失後能夠經過aof恢復 
八、Redis支持數據的備份,即master-slave模式的數據備份。mongodb

關於redis和memcache的不一樣,下面羅列了一些相關說法,供記錄:數據庫

redis和memecache的不一樣在於[2]: 
一、存儲方式: 
memecache 把數據所有存在內存之中,斷電後會掛掉,數據不能超過內存大小 
redis有部份存在硬盤上,這樣能保證數據的持久性,支持數據的持久化(筆者注:有快照和AOF日誌兩種持久化方式,在實際應用的時候,要特別注意配置文件快照參數,要不就頗有可能服務器頻繁滿載作dump)。 
二、數據支持類型: 
redis在數據支持上要比memecache多。 
三、使用底層模型不一樣: 
新版本的redis直接本身構建了VM 機制 ,由於通常的系統調用系統函數的話,會浪費必定的時間去移動和請求。 
四、運行環境不一樣: 
redis目前官方只支持LINUX 上去行,從而省去了對於其它系統的支持,這樣的話能夠更好的把精力用於本系統 環境上的優化,雖而後來微軟有一個小組爲其寫了補丁。可是沒有放到主幹上json

我的總結一下,有持久化需求或者對數據結構和處理有高級要求的應用,選擇redis,其餘簡單的key/value存儲,選擇memcache。

下面重點分析Memcached和Redis兩種方案: 
Memcached介紹 
Memcached 是一個高性能的分佈式內存對象緩存系統,用於動態Web應用以減輕數據庫負載。它經過在內存中緩存數據和對象來減小讀取數據庫的次數,從而提供動態、數據庫驅動網站的速度,如今已被LiveJournal、hatena、Facebook、Vox、LiveJournal等公司所使用。

Memcached工做方式分析 
許多Web應用都將數據保存到 RDBMS中,應用服務器從中讀取數據並在瀏覽器中顯示。 但隨着數據量的增大、訪問的集中,就會出現RDBMS的負擔加劇、數據庫響應惡化、 網站顯示延遲等重大影響。Memcached是高性能的分佈式內存緩存服務器,經過緩存數據庫查詢結果,減小數據庫訪問次數,以提升動態Web等應用的速度、 提升可擴展性。下圖展現了memcache與數據庫端協同工做狀況: 
這裏寫圖片描述 
其中的過程是這樣的: 
1.檢查用戶請求的數據是緩存中是否有存在,若是有存在的話,只須要直接把請求的數據返回,無需查詢數據庫。 
2.若是請求的數據在緩存中找不到,這時候再去查詢數據庫。返回請求數據的同時,把數據存儲到緩存中一份。 
3.保持緩存的「新鮮性」,每當數據發生變化的時候(好比,數據有被修改,或被刪除的狀況下),要同步的更新緩存信息,確保用戶不會在緩存取到舊的數據。

Memcached做爲高速運行的分佈式緩存服務器,具備如下的特色: 
1.協議簡單 
2.基於libevent的事件處理 
3.內置內存存儲方式 
4.memcached不互相通訊的分佈式

如何實現分佈式可拓展性? 
Memcached的分佈式不是在服務器端實現的,而是在客戶端應用中實現的,即經過內置算法制定目標數據的節點,以下圖所示: 
這裏寫圖片描述

Redis 介紹 
Redis是一個key-value存儲系統。和Memcached相似,它支持存儲的value類型相對更多,包括string(字符串)、 list(鏈表)、set(集合)和zset(有序集合)。這些數據類型都支持push/pop、add/remove及取交集並集和差集及更豐富的操做,並且這些操做都是原子性的。在此基礎上,redis支持各類不一樣方式的排序。與memcached同樣,爲了保證效率,數據都是緩存在內存中。區別的是redis會週期性的把更新的數據寫入磁盤或者把修改操做寫入追加的記錄文件,而且在此基礎上實現了master-slave(主從)同步,當前 Redis的應用已經很是普遍,國內像新浪、淘寶,國外像 Flickr、Github等均在使用Redis的緩存服務。

Redis 工做方式分析 
Redis做爲一個高性能的key-value數據庫具備如下特徵: 
1.多樣的數據模型 
2.持久化 
3.主從同步 
Redis支持豐富的數據類型,最爲經常使用的數據類型主要由五種:String、Hash、List、Set和Sorted Set。Redis一般將數據存儲於內存中,或被配置爲使用虛擬內存。Redis有一個很重要的特色就是它能夠實現持久化數據,經過兩種方式能夠實現數據持久化:使用RDB快照的方式,將內存中的數據不斷寫入磁盤;或使用相似MySQL的AOF日誌方式,記錄每次更新的日誌。前者性能較高,可是可能會引發必定程度的數據丟失;後者相反。 Redis支持將數據同步到多臺從數據庫上,這種特性對提升讀取性能很是有益。

Redis如何實現分佈式可拓展性? 
2.8之前的版本:與Memcached一致,能夠在客戶端實現,也可使用代理,twitter已開發出用於Redis和Memcached的代理Twemproxy 。 
3.0 之後的版本:相較於Memcached只能採用客戶端實現分佈式存儲,Redis則在服務器端構建分佈式存儲。Redis Cluster是一個實現了分佈式且容許單點故障的Redis高級版本,它沒有中心節點,各個節點地位一致,具備線性可伸縮的功能。如圖給出Redis Cluster的分佈式存儲架構,其中節點與節點之間經過二進制協議進行通訊,節點與客戶端之間經過ascii協議進行通訊。在數據的放置策略上,Redis Cluster將整個 key的數值域分紅16384個哈希槽,每一個節點上能夠存儲一個或多個哈希槽,也就是說當前Redis Cluster支持的最大節點數就是16384。 
這裏寫圖片描述

綜合結論

應該說Memcached和Redis都能很好的知足解決咱們的問題,它們性能都很高,總的來講,能夠把Redis理解爲是對Memcached的拓展,是更加劇量級的實現,提供了更多更強大的功能。具體來講:

1.性能上: 
性能上都很出色,具體到細節,因爲Redis只使用單核,而Memcached可使用多核,因此平均每個核上Redis在存儲小數據時比 
Memcached性能更高。而在100k以上的數據中,Memcached性能要高於Redis,雖然Redis最近也在存儲大數據的性能上進行優化,可是比起 Memcached,仍是稍有遜色。

2.內存空間和數據量大小: 
MemCached能夠修改最大內存,採用LRU算法。Redis增長了VM的特性,突破了物理內存的限制。

3.操做便利上: 
MemCached數據結構單一,僅用來緩存數據,而Redis支持更加豐富的數據類型,也能夠在服務器端直接對數據進行豐富的操做,這樣能夠減小網絡IO次數和數據體積。

4.可靠性上: 
MemCached不支持數據持久化,斷電或重啓後數據消失,但其穩定性是有保證的。Redis支持數據持久化和數據恢復,容許單點故障,可是同時也會付出性能的代價。

5.應用場景: 
Memcached:動態系統中減輕數據庫負載,提高性能;作緩存,適合多讀少寫,大數據量的狀況(如人人網大量查詢用戶信息、好友信息、文章信息等)。 
Redis:適用於對讀寫效率要求都很高,數據處理業務複雜和對安全性要求較高的系統(如新浪微博的計數和微博發佈部分系統,對數據安全性、讀寫要求都很高)。

須要慎重考慮的部分 
1.Memcached單個key-value大小有限,一個value最大隻支持1MB,而Redis最大支持512MB 
2.Memcached只是個內存緩存,對可靠性無要求;而Redis更傾向於內存數據庫,所以對對可靠性方面要求比較高 
3.從本質上講,Memcached只是一個單一key-value內存Cache;而Redis則是一個數據結構內存數據庫,支持五種數據類型,所以Redis除單純緩存做用外,還能夠處理一些簡單的邏輯運算,Redis不只能夠緩存,並且還能夠做爲數據庫用 
4.新版本(3.0)的Redis是指集羣分佈式,也就是說集羣自己均衡客戶端請求,各個節點能夠交流,可拓展行、可維護性更強大。

ref:

http://blog.163.com/sun_jian_zhang/blog/static/187804041201310795917333/?suggestedreading&wumii
http://www.cnblogs.com/EE-NovRain/p/3268476.html 
http://www.open-open.com/lib/view/open1409643182369.html

 

5、Redis、Memcache和MongoDB的區別

>>Memcached

Memcached的優勢:
Memcached能夠利用多核優點單實例吞吐量極高,能夠達到幾十萬QPS(取決於key、value的字節大小以及服務器硬件性能,平常環境中QPS高峯大約在4-6w左右)。適用於最大程度扛量
支持直接配置爲session handle。
Memcached的侷限性:
只支持簡單的key/value數據結構不像Redis能夠支持豐富的數據類型
沒法進行持久化,數據不能備份,只能用於緩存使用,且重啓後數據所有丟失。
沒法進行數據同步,不能將MC中的數據遷移到其餘MC實例中。
Memcached內存分配採用Slab Allocation機制管理內存,value大小分佈差別較大時會形成內存利用率下降,並引起低利用率時依然出現踢出等問題。須要用戶注重value設計。

>>Redis

Redis的優勢:
支持多種數據結構,如 string(字符串)、 list(雙向鏈表)、dict(hash表)、set(集合)、zset(排序set)、hyperloglog(基數估算)
支持持久化操做,能夠進行aof及rdb數據持久化到磁盤,從而進行數據備份或數據恢復等操做,較好的防止數據丟失的手段。
支持經過Replication進行數據複製,經過master-slave機制,能夠實時進行數據的同步複製,支持多級複製和增量複製,master-slave機制是Redis進行HA的重要手段。
單線程請求,全部命令串行執行,併發狀況下不須要考慮數據一致性問題。
支持pub/sub消息訂閱機制,能夠用來進行消息訂閱與通知。
支持簡單的事務需求,但業界使用場景不多,並不成熟。

Redis的侷限性:
Redis只能使用單線程性能受限於CPU性能,故單實例CPU最高才可能達到5-6wQPS每秒(取決於數據結構,數據大小以及服務器硬件性能,平常環境中QPS高峯大約在1-2w左右)。
支持簡單的事務需求,但業界使用場景不多,並不成熟,既是優勢也是缺點。
Redis在string類型上會消耗較多內存,可使用dict(hash表)壓縮存儲以下降內存耗用。

Mc和Redis都是Key-Value類型,不適合在不一樣數據集之間創建關係,也不適合進行查詢搜索。好比redis的keys pattern這種匹配操做,對redis的性能是災難。

>>mongoDB 

mongoDB 是一種文檔性的數據庫。先解釋一下文檔的數據庫,便可以存放xml、json、bson類型系那個的數據。

這些數據具有自述性(self-describing),呈現分層的樹狀數據結構。redis能夠用hash存放簡單關係型數據。

mongoDB 存放json格式數據

適合場景:事件記錄、內容管理或者博客平臺,好比評論系統。

1.mongodb持久化原理

mongodb與mysql不一樣,mysql的每一次更新操做都會直接寫入硬盤,可是mongo不會,作爲內存型數據庫,數據操做會先寫入內存,而後再會持久化到硬盤中去,那麼mongo是如何持久化的呢
mongodb在啓動時,專門初始化一個線程不斷循環(除非應用crash掉),用於在必定時間週期內來從defer隊列中獲取要持久化的數據並寫入到磁盤的journal(日誌)和mongofile(數據)處,固然由於它不是在用戶添加記錄時就寫到磁盤上,因此按mongodb開發者說,它不會形成性能上的損耗,由於看過代碼發現,當進行CUD操做時,記錄(Record類型)都被放入到defer隊列中以供延時批量(groupcommit)提交寫入,但相信其中時間週期參數是個要認真考量的參數,系統爲90毫秒,若是該值更低的話,可能會形成頻繁磁盤操做,太高又會形成系統宕機時數據丟失過。

2.什麼是NoSQL數據庫?NoSQL和RDBMS有什麼區別?在哪些狀況下使用和不使用NoSQL數據庫?
NoSQL是非關係型數據庫,NoSQL = Not Only SQL
關係型數據庫採用的結構化的數據,NoSQL採用的是鍵值對的方式存儲數據。
在處理非結構化/半結構化的大數據時;在水平方向上進行擴展時;隨時應對動態增長的數據項時能夠優先考慮使用NoSQL數據庫
在考慮數據庫的成熟度;支持;分析和商業智能;管理及專業性等問題時,應優先考慮關係型數據庫

3.MySQL和MongoDB之間最基本的區別是什麼?
關係型數據庫與非關係型數據庫的區別,即數據存儲結構的不一樣。

4.MongoDB的特色是什麼?
(1)面向文檔(2)高性能(3)高可用(4)易擴展(5)豐富的查詢語言

5.MongoDB支持存儲過程嗎?若是支持的話,怎麼用?
MongoDB支持存儲過程,它是javascript寫的,保存在db.system.js表中。

6.如何理解MongoDB中的GridFS機制,MongoDB爲什麼使用GridFS來存儲文件?
GridFS是一種將大型文件存儲在MongoDB中的文件規範。使用GridFS能夠將大文件分隔成多個小文檔存放,這樣咱們可以有效的保存大文檔,並且解決了BSON對象有限制的問題。

7.爲何MongoDB的數據文件很大?
MongoDB採用的預分配空間的方式來防止文件碎片

8.當更新一個正在被遷移的塊(Chunk)上的文檔時會發生什麼?
更新操做會當即發生在舊的塊(Chunk)上,而後更改纔會在全部權轉移前複製到新的分片上。

9.MongoDB在A:{B,C}上創建索引,查詢A:{B,C}和A:{C,B}都會使用索引嗎?
不會,只會在A:{B,C}上使用索引。

10.若是一個分片(Shard)中止或很慢的時候,發起一個查詢會怎樣?
若是一個分片中止了,除非查詢設置了「Partial」選項,不然查詢會返回一個錯誤。若是一個分片響應很慢,MongoDB會等待它的響應。

 

>>Redis、Memcache和MongoDB的區別

從如下幾個維度,對redis、memcache、mongoDB 作了對比,

一、性能

都比較高,性能對咱們來講應該都不是瓶頸

整體來說,TPS方面redis和memcache差很少,要大於mongodb

二、操做的便利性

memcache數據結構單一

redis豐富一些,數據操做方面,redis更好一些,較少的網絡IO次數

mongodb支持豐富的數據表達,索引,最相似關係型數據庫,支持的查詢語言很是豐富

三、內存空間的大小和數據量的大小

redis在2.0版本後增長了本身的VM特性,突破物理內存的限制;能夠對key value設置過時時間(相似memcache)

memcache能夠修改最大可用內存,採用LRU算法

mongoDB適合大數據量的存儲,依賴操做系統VM作內存管理,吃內存也比較厲害,服務不要和別的服務在一塊兒

四、可用性(單點問題)

對於單點問題,

redis,依賴客戶端來實現分佈式讀寫;主從複製時,每次從節點從新鏈接主節點都要依賴整個快照,無增量複製,因性能和效率問題,

因此單點問題比較複雜;不支持自動sharding,須要依賴程序設定一致hash 機制。

一種替代方案是,不用redis自己的複製機制,採用本身作主動複製(多份存儲),或者改爲增量複製的方式(須要本身實現),一致性問題和性能的權衡

Memcache自己沒有數據冗餘機制,也不必;對於故障預防,採用依賴成熟的hash或者環狀的算法,解決單點故障引發的抖動問題。

mongoDB支持master-slave,replicaset(內部採用paxos選舉算法,自動故障恢復),auto sharding機制,對客戶端屏蔽了故障轉移和切分機制。

五、可靠性(持久化)

對於數據持久化和數據恢復,

redis支持(快照、AOF):依賴快照進行持久化,aof加強了可靠性的同時,對性能有所影響

memcache不支持,一般用在作緩存,提高性能;

MongoDB從1.8版本開始採用binlog方式支持持久化的可靠性

六、數據一致性(事務支持)

Memcache 在併發場景下,用cas保證一致性

redis事務支持比較弱,只能保證事務中的每一個操做連續執行

mongoDB不支持事務

七、數據分析

mongoDB內置了數據分析的功能(mapreduce),其餘不支持

八、應用場景

redis:數據量較小的更性能操做和運算上

memcache:用於在動態系統中減小數據庫負載,提高性能;作緩存,提升性能(適合讀多寫少,對於數據量比較大,能夠採用sharding)

MongoDB:主要解決海量數據的訪問效率問題

相關文章
相關標籤/搜索