天天看點

Memcache,Redis,MongoDB(資料緩存系統)方案對比與分析

一、問題:

    資料庫表資料量極大(千萬條),要求讓伺服器更加快速地響應使用者的需求。

二、解決方案:

     1.通過高速伺服器cache緩存資料庫資料

     2.記憶體資料庫

  (這裡僅從資料緩存方面考慮,當然,後期可以采用hadoop+hbase+hive等分布式存儲分析平台)

三、主流解cache和資料庫對比:

Memcache,Redis,MongoDB(資料緩存系統)方案對比與分析

     上述技術基本上代表了當今在資料存儲方面所有的實作方案,其中主要涉及到了普通關系型資料庫(mysql/postgresql),nosql資料庫(mongodb),記憶體資料庫(redis),記憶體cache(memcached),我們現在需要的是對大資料表仍保持高效的查詢速度,普通關系型資料庫是無法滿足的。而mongodb其實隻是一種非關系型資料庫,其優勢在于可以存儲海量資料,具備強大的查詢功能,是以不宜用于緩存資料的場景。

       從以上各資料可知,對于我們産品最可行的技術方案有兩種:

         1.memcached         記憶體key-value cache

         2.redis                     記憶體資料庫

四、下面重點分析memcached和redis兩種方案:

4.1 memcached介紹  

     memcached 是一個高性能的分布式記憶體對象緩存系統,用于動态web應用以減輕資料庫負載。它通過在記憶體中緩存資料和對象來減少讀取資料庫的次數,進而提供動态、資料庫驅動網站的速度,現在已被livejournal、hatena、facebook、vox、livejournal等公司所使用。

4.2 memcached工作方式分析

     許多web應用都将資料儲存到rdbms中,應用伺服器從中讀取資料并在浏覽器中顯示。 但随着資料量的增大、通路的集中,就會出現rdbms的負擔加重、資料庫響應惡化、 網站顯示延遲等重大影響。memcached是高性能的分布式記憶體緩存伺服器,通過緩存資料庫查詢結果,減少資料庫通路次數,以提高動态web等應用的速度、 提高可擴充性。下圖展示了memcache與資料庫端協同工作情況:

Memcache,Redis,MongoDB(資料緩存系統)方案對比與分析

     其中的過程是這樣的:

           1.檢查使用者請求的資料是緩存中是否有存在,如果有存在的話,隻需要直接把請求的資料傳回,無需查詢資料庫。

           2.如果請求的資料在緩存中找不到,這時候再去查詢資料庫。傳回請求資料的同時,把資料存儲到緩存中一份。

           3.保持緩存的“新鮮性”,每當資料發生變化的時候(比如,資料有被修改,或被删除的情況下),要同步的更新緩存資訊,確定使用者不會在緩存取到舊的資料。

     memcached作為高速運作的分布式緩存伺服器,具有以下的特點: 

協定簡單 

基于libevent的事件處理 

内置記憶體存儲方式

memcached不互相通信的分布式

4.3 如何實作分布式可拓展性?

     memcached的分布式不是在伺服器端實作的,而是在用戶端應用中實作的,即通過内置算法制定目标資料的節點,如下圖所示:

Memcache,Redis,MongoDB(資料緩存系統)方案對比與分析

4.4 redis 介紹  

     redis是一個key-value存儲系統。和memcached類似,它支援存儲的value類型相對更多,包括string(字元串)、list(連結清單)、set(集合)和zset(有序集合)。這些資料類型都支援push/pop、add/remove及取交集并集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎上,redis支援各種不同方式的排序。與memcached一樣,為了保證效率,資料都是緩存在記憶體中。差別的是redis會周期性的把更新的資料寫入磁盤或者把修改操作寫入追加的記錄檔案,并且在此基礎上實作了master-slave(主從)同步,目前redis的應用已經非常廣泛,國内像新浪、淘寶,國外像 flickr、github等均在使用redis的緩存服務。

4.5 redis 工作方式分析

     redis作為一個高性能的key-value資料庫具有以下特征: 

多樣的資料模型 

持久化 

主從同步  

     redis支援豐富的資料類型,最為常用的資料類型主要由五種:string、hash、list、set和sorted set。redis通常将資料存儲于記憶體中,或被配置為使用虛拟記憶體。redis有一個很重要的特點就是它可以實作持久化資料,通過兩種方式可以實作資料持久化:使用rdb快照的方式,将記憶體中的資料不斷寫入磁盤;或使用類似mysql的aof日志方式,記錄每次更新的日志。前者性能較高,但是可能會引起一定程度的資料丢失;後者相反。

redis支援将資料同步到多台從資料庫上,這種特性對提高讀取性能非常有益。

4.6 redis如何實作分布式可拓展性?

3.0以後的版本:相較于memcached隻能采用用戶端實作分布式存儲,redis則在伺服器端建構分布式存儲。redis cluster是一個實作了分布式且允許單點故障的redis進階版本,它沒有中心節點,各個節點地位一緻,具有線性可伸縮的功能。如圖給出redis cluster的分布式存儲架構,其中節點與節點之間通過二進制協定進行通信,節點與用戶端之間通過ascii協定進行通信。在資料的放置政策上,redis cluster将整個key的數值域分成16384個哈希槽,每個節點上可以存儲一個或多個哈希槽,也就是說目前redis cluster支援的最大節點數就是16384

Memcache,Redis,MongoDB(資料緩存系統)方案對比與分析

五、綜合結論

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