引子:http://www.javashuo.com/article/p-opnlrwwl-du.htmlhtml
一、 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模式的數據備份。redis
關於redis和memcache的不一樣,下面羅列了一些相關說法,供記錄:算法
redis和memecache的不一樣在於[2]:
一、存儲方式:
memecache 把數據所有存在內存之中,斷電後會掛掉,數據不能超過內存大小
redis有部份存在硬盤上,這樣能保證數據的持久性,支持數據的持久化(筆者注:有快照和AOF日誌兩種持久化方式,在實際應用的時候,要特別注意配置文件快照參數,要不就頗有可能服務器頻繁滿載作dump)。
二、數據支持類型:
redis在數據支持上要比memecache多的多。
三、使用底層模型不一樣:
新版本的redis直接本身構建了VM 機制 ,由於通常的系統調用系統函數的話,會浪費必定的時間去移動和請求。
四、運行環境不一樣:
redis目前官方只支持LINUX 上去行,從而省去了對於其它系統的支持,這樣的話能夠更好的把精力用於本系統 環境上的優化,雖而後來微軟有一個小組爲其寫了補丁。可是沒有放到主幹上數據庫
我的總結一下,有持久化需求或者對數據結構和處理有高級要求的應用,選擇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是指集羣分佈式,也就是說集羣自己均衡客戶端請求,各個節點能夠交流,可拓展行、可維護性更強大。