Redis是一個開源的使用ANSI C語言編寫、支持網絡、可基於內存亦可持久化的日誌型、Key-Value數據庫,並提供多種語言的API。從2010年3月15日起,Redis的開發工做由VMware主持。從2013年5月開始,Redis的開發由Pivotal贊助。javascript
NoSql 數據存儲html
memcache是一套分佈式的高速緩存系統,由LiveJournal的Brad Fitzpatrick開發,但目前被許多網站使用以提高網站的訪問速度,尤爲對於一些大型的、須要頻繁訪問數據庫的網站訪問速度提高效果十分顯著[1] 。這是一套開放源代碼軟件,以BSD license受權發佈。java
分佈式的高速緩存系統mysql
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,它也足夠的穩定可靠。若是涉及到存儲,排序等一系列複雜的操做時,毫無疑問選擇redis。sql
其餘:
一、 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
Memcached的優勢:
Memcached能夠利用多核優點,單實例吞吐量極高,能夠達到幾十萬QPS(取決於key、value的字節大小以及服務器硬件性能,平常環境中QPS高峯大約在4-6w左右)。適用於最大程度扛量。
支持直接配置爲session handle。
Memcached的侷限性:
只支持簡單的key/value數據結構,不像Redis能夠支持豐富的數據類型。
沒法進行持久化,數據不能備份,只能用於緩存使用,且重啓後數據所有丟失。
沒法進行數據同步,不能將MC中的數據遷移到其餘MC實例中。
Memcached內存分配採用Slab Allocation機制管理內存,value大小分佈差別較大時會形成內存利用率下降,並引起低利用率時依然出現踢出等問題。須要用戶注重value設計。
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 是一種文檔性的數據庫。先解釋一下文檔的數據庫,便可以存放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 作了對比,
一、性能
都比較高,性能對咱們來講應該都不是瓶頸
整體來說,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:主要解決海量數據的訪問效率問題