Redis和MemCache靜態Map作緩存區別

本地緩存和分佈式緩存

  本地緩存:使用自帶的map或者guava實現的是本地緩存,最主要的特色是輕量以及快速,生命週期隨着jvm的銷燬而結束,而且在多實例的狀況下,每一個實例都須要各自保存一份緩存,緩存不具備一致性。redis

  分佈式緩存:使用redis或memcached之類的稱爲分佈式緩存,在多實例的狀況下,各實例共用一份緩存數據,緩存具備一致性。缺點是須要保持redis或memcached服務的高可用,整個程序架構上較爲複雜。算法

1、Redis和靜態Map緩存區別:

  • redis能夠獨立部署,這樣網站代碼更新後redis緩存的數據還在,本地內存每次網站更新都會釋放掉數據存到redis,多個項目間能夠共享緩存數據,若是是本地內存是沒法跨項目共享的本地緩存不方面查看及修改 redis有豐富工具管理緩存數據
  • Redis 能夠用幾十 G 內存來作緩存,Map不行,通常 JVM 也就分幾個G數據就夠大了,JVM 內存太大容易掛掉的;
  • Redis 的緩存能夠持久化,Map 是內存對象,程序一重啓數據就沒了;
  • Redis 能夠實現分佈式的緩存,Map 只能存在建立它的程序裏;
  • Redis 能夠處理每秒百萬級的併發,是專業的緩存服務,Map 只是一個普通的對象;
  • Redis 緩存有過時機制,Map 自己無此功能;
  • Redis 有豐富的 API,Map 就簡單太多了;
  • Redis 有不少數據結構,方便操做,好比 hash set list sort-set等,在某些場景下操做起來比map方便;

2、Redis和MemCache

  • 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能夠按期持久化到磁盤(有快照和AOF日誌兩種持久化方式,在實際應用的時候,要特別注意配置文件快照參數,要不就頗有可能服務器頻繁滿載作dump)) 
  • 災難恢復–memcache掛掉後,數據不可恢復; redis數據丟失後能夠經過aof恢復。
  • Redis支持數據的備份,即master-slave模式的數據備份。
  • redis目前官方只支持LINUX 上去行,從而省去了對於其它系統的支持,這樣的話能夠更好的把精力用於本系統 環境上的優化,雖而後來微軟有一個小組爲其寫了補丁。可是沒有放到主幹上

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

3、下面重點分析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是指集羣分佈式,也就是說集羣自己均衡客戶端請求,各個節點能夠交流,可拓展行、可維護性更強大。

相關文章
相關標籤/搜索