Memcache,Redis,MongoDB(数据缓存系统)方案对比与分析
生活随笔
收集整理的這篇文章主要介紹了
Memcache,Redis,MongoDB(数据缓存系统)方案对比与分析
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、問題:
? ? ? ? ? 數據庫表數據量極大(千萬條),要求讓服務器更加快速地響應用戶的需求。
二、解決方案: ? ? ?1.通過高速服務器Cache緩存數據庫數據 ? ? ?2.內存數據庫
? (這里僅從數據緩存方面考慮,當然,后期可以采用Hadoop+HBase+Hive等分布式存儲分析平臺)
三、主流解Cache和數據庫對比:
? ? ?上述技術基本上代表了當今在數據存儲方面所有的實現方案,其中主要涉及到了普通關系型數據庫(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與數據庫端協同工作情況:
? ? ?
? ? ?其中的過程是這樣的: ? ? ? ? ? ?1.檢查用戶請求的數據是緩存中是否有存在,如果有存在的話,只需要直接把請求的數據返回,無需查詢數據庫。 ? ? ? ? ? ?2.如果請求的數據在緩存中找不到,這時候再去查詢數據庫。返回請求數據的同時,把數據存儲到緩存中一份。
? ? ? ? ? ?3.保持緩存的“新鮮性”,每當數據發生變化的時候(比如,數據有被修改,或被刪除的情況下),要同步的更新緩存信息,確保用戶不會在緩存取到舊的數據。
? ? ?Memcached作為高速運行的分布式緩存服務器,具有以下的特點:?
4.3 如何實現分布式可拓展性?
Memcached的分布式不是在服務器端實現的,而是在客戶端應用中實現的,即通過內置算法制定目標數據的節點,如下圖所示:
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數據庫具有以下特征:?
4.6 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是指集群分布式,也就是說集群本身均衡客戶端請求,各個節點可以交流,可拓展行、可維護性更強大。
二、解決方案: ? ? ?1.通過高速服務器Cache緩存數據庫數據 ? ? ?2.內存數據庫
? (這里僅從數據緩存方面考慮,當然,后期可以采用Hadoop+HBase+Hive等分布式存儲分析平臺)
三、主流解Cache和數據庫對比:
? ? ?上述技術基本上代表了當今在數據存儲方面所有的實現方案,其中主要涉及到了普通關系型數據庫(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與數據庫端協同工作情況:
? ? ?
? ? ?其中的過程是這樣的: ? ? ? ? ? ?1.檢查用戶請求的數據是緩存中是否有存在,如果有存在的話,只需要直接把請求的數據返回,無需查詢數據庫。 ? ? ? ? ? ?2.如果請求的數據在緩存中找不到,這時候再去查詢數據庫。返回請求數據的同時,把數據存儲到緩存中一份。
? ? ? ? ? ?3.保持緩存的“新鮮性”,每當數據發生變化的時候(比如,數據有被修改,或被刪除的情況下),要同步的更新緩存信息,確保用戶不會在緩存取到舊的數據。
? ? ?Memcached作為高速運行的分布式緩存服務器,具有以下的特點:?
- 協議簡單?
- 基于libevent的事件處理?
- 內置內存存儲方式
- memcached不互相通信的分布式
4.3 如何實現分布式可拓展性?
Memcached的分布式不是在服務器端實現的,而是在客戶端應用中實現的,即通過內置算法制定目標數據的節點,如下圖所示:
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數據庫具有以下特征:?
-
- 多樣的數據模型?
- 持久化?
- 主從同步 ?
4.6 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是指集群分布式,也就是說集群本身均衡客戶端請求,各個節點可以交流,可拓展行、可維護性更強大。
總結
以上是生活随笔為你收集整理的Memcache,Redis,MongoDB(数据缓存系统)方案对比与分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: memcache的原理和命中率的总结
- 下一篇: ubuntu再次体验之【美化】--修改主