redis和memcache的區別

最近一直在學Python,寫python,剛好一個同事問我redis和memcache的區別,如何選擇。一直都是使用redis的。而memcache坦言用的不多,其實各有所的利弊。對比了一下,寫了記錄。
簡單區別:


1. Redis中,並不是所有的數據都一直存儲在內存中的,這是和Memcached相比一個最大的區別。 
2. redis不僅僅支持簡單的k/v類型的數據,同時還提供list,set,hash等數據結構的存儲。 
3. Redis支持數據的備份,即master-slave模式的數據備份。 
4. Redis支持數據的持久化,可以將內存中的數據保持在磁盤中,重啓的時候可以再次加載進行使用。
Redis在很多方面具備數據庫的特徵,或者說就是一個數據庫系統,而Memcached只是簡單的K/V緩存

關注點:

  1. 內存使用率
    你需要關注內存使用率。對於key-value這樣簡單的數據儲存,memcache的內存使用率更高。如果採用hash結構,redis的內存使用率會更高。當然,這些都依賴於具體的應用場景。

  2. 持久化和關係模式
    你需要關注關注數據持久化和主從複製時,只有redis擁有這兩個特性。如果你的目標是構建一個緩存在升級或者重啓後之前的數據不會丟失的話,那也只能選擇redis。

  3. 數據結構
    redis支持很多複雜的操作,甚至只考慮內存的使用情況,在一個單一操作裏你常常可以做很多,而不需要將數據讀取到客戶端中(這樣會需要很多的IO操作)。這些複雜的操作基本上和純GET和POST操作一樣快,所以你不只是需要GET/SET而是更多的操作時,redis會起很大的作用。

  4. 使用場景
    對於兩者的選擇還是要看具體的應用場景,如果需要緩存的數據只是key-value這樣簡單的結構時,我在項目裏還是採用memcache,它也足夠的穩定可靠。如果涉及到存儲,排序等一系列複雜的操作時,毫無疑問選擇redis。

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

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

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

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

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

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

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

如何實現分佈式可拓展性?
Memcached的分佈式不是在服務器端實現的,而是在客戶端應用中實現的,即通過內置算法制定目標數據的節點,如下圖所示:
這裏寫圖片描述
redis和memcache的區別
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。
這裏寫圖片描述
redis和memcache的區別
綜合結論

應該說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是指集羣分佈式,也就是說集羣本身均衡客戶端請求,各個節點可以交流,可拓展行、可維護性更強大。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章