(轉)Memcache,Redis,MongoDB(數據緩存系統)方案對比與分析

来源:http://www.cnblogs.com/GardenKeeper/archive/2017/01/18/6297746.html
-Advertisement-
Play Games

一、問題: 資料庫表數據量極大(千萬條),要求讓伺服器更加快速地響應用戶的需求。 資料庫表數據量極大(千萬條),要求讓伺服器更加快速地響應用戶的需求。 二、解決方案: 1.通過高速伺服器Cache緩存資料庫數據 2.記憶體資料庫 (這裡僅從數據緩存方面考慮,當然,後期可以採用Hadoop+HBase+ ...


一、問題:     資料庫表數據量極大(千萬條),要求讓伺服器更加快速地響應用戶的需求。   二、解決方案:      1.通過高速伺服器Cache緩存資料庫數據      2.記憶體資料庫   (這裡僅從數據緩存方面考慮,當然,後期可以採用Hadoop+HBase+Hive等分散式存儲分析平臺)   三、主流解Cache和資料庫對比: d1.png        上述技術基本上代表了當今在數據存儲方面所有的實現方案,其中主要涉及到了普通關係型資料庫(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與資料庫端協同工作情況:        d2.png      其中的過程是這樣的:            1.檢查用戶請求的數據是緩存中是否有存在,如果有存在的話,只需要直接把請求的數據返回,無需查詢資料庫。

           2.如果請求的數據在緩存中找不到,這時候再去查詢資料庫。返回請求數據的同時,把數據存儲到緩存中一份。
           3.保持緩存的“新鮮性”,每當數據發生變化的時候(比如,數據有被修改,或被刪除的情況下),要同步的更新緩存信息,確保用戶不會在緩存取到舊的數據。


     Memcached作為高速運行的分散式緩存伺服器,具有以下的特點: 
    • 協議簡單 
    • 基於libevent的事件處理 
    • 內置記憶體存儲方式
    • memcached不互相通信的分散式
  4.3 如何實現分散式可拓展性?
     Memcached的分散式不是在伺服器端實現的,而是在客戶端應用中實現的,即通過內置演算法制定目標數據的節點,如下圖所示: d3.png 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如何實現分散式可拓展性?   2.8以前的版本:與Memcached一致,可以在客戶端實現,也可以使用代理,twitter已開發出用於Redis和Memcached的代理Twemproxy 。 3.0 以後的版本:相較於Memcached只能採用客戶端實現分散式存儲,Redis則在伺服器端構建分散式存儲。Redis Cluster是一個實現了分散式且允許單點故障的Redis高級版本,它沒有中心節點,各個節點地位一致,具有線性可伸縮的功能。如圖給出Redis Cluster的分散式存儲架構,其中節點與節點之間通過二進位協議進行通信,節點與客戶端之間通過ascii協議進行通信。在數據的放置策略上,Redis Cluster將整個 key的數值域分成16384個哈希槽,每個節點上可以存儲一個或多個哈希槽,也就是說當前Redis Cluster支持的最大節點數就是16384        d4.jpg   五、綜合結論  應該說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是指集群分散式,也就是說集群本身均衡客戶端請求,各個節點可以交流,可拓展行、可維護性更強大。

來自:http://blog.csdn.net/suifeng3051/article/details/23739295
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 今天在牛客網上做了一道題,題意就是求左旋轉字元串。我使用輾轉相除法解之,一次性AC通過。實話說,每次寫演算法一次性通過,甚至一點編譯錯誤都沒有,我覺得這就是對我最好的嘉獎。 題目描述: 彙編語言中有一種移位指令叫做迴圈左移(ROL),現在有個簡單的任務,就是用字元串模擬這個指令的運算結果。對於一個給定 ...
  • 本教程上接Django 1.10中文文檔-第一個應用Part2-模型和管理站點。我們將繼續開髮網頁投票這個應用,主要講如何創建一個對用戶開放的界面。 概覽 視圖是Django應用中的一“類”網頁,它通常使用一個特定的函數提供服務,並且具有一個特定的模板。例如,在博客應用中,可能有以下視圖: 博客首頁 ...
  • 【轉自:http://www.cnblogs.com/disheng2016/p/6266523.html】 maven下載jar包的預設倉庫是http://my.repository.com/repo/path速度較慢,通過配置國內鏡像提高下載速度 1.打開eclipse >Window >Pre ...
  • 今天我們來講一下模板方法模式。 一、案例 我們在上中學的時候,會有這麼一種場景,老師在黑板上寫測試題,讓我們自己抄到紙上做。相信不少小伙伴們都經歷過這種歲月,想想還是很懷念的呢。這種做測試的方式,對當時的我們來講,有一個最致命的痛苦,就是這個題目會做,但是TM抄錯了題目了,擦擦擦。相信不少小伙伴肯定 ...
  • 在項目中或多或少的都存在著重覆的或者功能相似的代碼,如果要對代碼做改動,就要修改多個地方,所以我們需要將多處重覆的代碼提取到一個公共的地方供統一調用,以減少代碼量,提高代碼可維護性。 重構前代碼 重構後代碼 ...
  • 引言 2016年中,我所在的項目組將原來系統中的登錄模塊拆出來做成一套集中賬號管理系統,並對外提供單點登錄的服務。後來,公司中需要使用員工賬號進行登錄的系統越來越多,但這些系統都是各有各的實現方式,管理比較混亂。為了推廣我們組的賬號管理系統,統一公司的賬號體系,我寫了一篇“軟文”希望在公司技術月刊上 ...
  • 對於之前微信支付的文章中,我們談過了它的很多"坑",而在進行紅包開發時,這種坑依然不少,主要是微信為我們提供的各種賬號和密鑰太多,把開發人員都搞暈了,下麵大叔總結一下: 一 微信支付的密鑰 統一使用公眾號密鑰:Key 二 微信紅包的密鑰 統一使用商戶賬號的密鑰:AppSecret 三 紅包進行簽名要 ...
  • 1.添加按鈕 首先添加一個刪除按鈕,打開文件Index.js【..\MyCompanyName.AbpZeroTemplate.Web\Areas\Mpa\Views\Category\Index.js】 添加如下代碼: display: function (data) { var $span = ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...