統緩存全解析7:第三方分佈式緩存解決方案 Memcached和Cacheman

Memcached — 分佈式緩存系統算法

1.Memcached是什麼?數據庫

    Memcached是高性能的,分佈式的內存對象緩存系統,用於在動態應用中減小數據庫負載,提高訪問速度。Memcached經過在內存裏維護一個統一 的巨大的hash表,它可以用來存儲各類格式的數據,包括圖像、視頻、文件以及數據庫檢索的結果等。Memcached由Danga Interactive最初爲了加速 LiveJournal網站訪問速度而開發的,後來被不少大型的網站採用。起初做者編寫它多是爲了提升動態網頁應用,爲了減輕數據庫檢索的壓力,來作的 這個緩存系統。它的緩存是一種分佈式的,也就是能夠容許不一樣主機上的多個用戶同時訪問這個緩存系統,這種方法不只解決了共享內存只能是單機的弊端,同時也 解決了數據庫檢索的壓力,最大的優勢是提升了訪問獲取數據的速度!基於memcached做者對分佈式cache的理解和解決方案。memcached完 全能夠用到其餘地方 好比分佈式數據庫,分佈式計算等領域。Memcached將數據庫負載大幅度下降,更好的分配資源,更快速訪問。編程

2.Memcached工做機制api

    經過在內存中開闢一塊區域來維持一個大的hash表來加快頁面訪問速度,和數據庫是獨立的。可是目前主要用來緩存數據庫的數據。容許多個server經過 網絡造成一個大的hash,用戶沒必要關心數據存放在哪,只調用相關接口就可。存放在內存的數據經過LRU算法進行淘汰出內存。同時能夠經過刪除和設置失效 時間來淘汰存放在內存的數據。緩存

    如今一些.NET開發人員開始放棄ASP.NET內置的緩存機制,轉而使用Memcached——一種分佈式的內存緩存系統。當運行在單獨的Web服務器 上,你能夠很容易地清除一個已經確認被改變了的緩存。惋惜,ASP.NET沒有一個很好的方法來支持多服務器。每一個服務器上的緩存都對其餘緩存的改變一無 所知。服務器

    ASP.NET容許經過基於文件系統和數據庫表的觸發器來做廢一個緩存。然而,這也存在問題,好比數據庫觸發器須要使用昂貴的輪詢,以及觸發器自己冗長的編程。可是,咱們仍是有其餘的選擇的。網絡

    不像ASP.NET內置的緩存機制,Memcached是一個分佈式的緩存系統。任何Web服務器都能更新或刪除一個緩存項,而且全部其餘的服務器都能在 下次訪問這些緩存項的時候自動獲取到更新的內容。這是經過把這些緩存項存儲在一個或者多個緩存服務器上來實現的。每個緩存項都根據它的關鍵字的哈希值來 分配到一個服務器上。架構

    表面看來,Memcached針對ASP.NET的API就像和內置的API同樣。這讓開發人員很容易地轉換到Memcached上,僅僅經過在代碼中查找和替換便可實現。分佈式

    一個被推薦的解決方案是不根據緩存項的關鍵字來生成哈希鍵值。這將容許開發人員可以讓一個給定頁面中須要的全部緩存項,儘可能存放在同一個服務器上。惋惜,基於數據保存的地方而不是基於緩存項自身的關鍵字來生成哈希鍵,很容易產生錯誤,須要仔細來實現(這個算法)。memcached

     Memcached是基於Linux運行的,你能夠在BSD的許可協議下使用Memcached。他也提供了針對C#的客戶端以及Perl、Python、PHP、Java和其餘語言的API:http://www.danga.com/memcached/apis.bml。還有一個Win32的移植版本(http://jehiah.cz/projects/memcached-win32/),可讓Memcached運行在非Linux的機器上。

 

     Cacheman — .NET架構下的分佈式緩存項目

      Cacheman聽說是由微軟旗下的 Popfly 項目組成員 Sriram Krishnan 的做品。是他用業餘時間開發的。最新的狀況是,微軟的 Popfly 網站已經「悄悄地」的作了更新,就是採用了 Krishnan 的 Cacheman,更新了緩存機制。該項緩存技術更新帶來的性能提高很是顯著,根據Popfly團隊中的 John Montgomery 的說法:加載一個已有的Mashup應用時,能夠帶來2到6倍的性能提高。

       這些說法也獲得了 Krishnan 本人的確認。他提到這是Cacheman 的第一次的實際應用,並自豪的說 Cacheman 不費吹灰之力就拿下了 Popfly 的所有訪問量。

     簡單介紹一下 Cacheman 這個項目。主要參照 Krishnan的博客對Cacheman的介紹。

Cacheman是一個基於Windows平臺的快速分佈式哈希表。是由純託管代碼實現。中間擱置了有幾個月,直到最近纔開始從新上馬這個項目,很可能就是由於Popfly項目須要的緣故纔開始着手的。

     Krishnan本人對 memcached 很感興趣,因而建立了 Cacheman。Cacheman上有不少 memcached 的影子,好比與memcached類似的文本通信協議。Cacheman的通信協議公開,任何人能夠根據本身偏心的語言環境寫客戶端。 Krishnan 在本身家用PC(2.4GHz Intel Core 2 帶2GB內存)上進入測試,達到了每秒16000次左右的請求,而且仍是服務器與客戶端都是在同一臺服務器下完成的。

    現這款產品還不太完善,做者自身也提到:在Cacheman作指定key的GET/SET/DELETE操做時,客戶端須要弄清須要與哪一 臺Cacheman服務器通信,爲此要對該key作一個快速FNV哈希而後求餘獲得應該和幾臺服務器中的哪臺服務器通信。但該法的缺點在於新增或刪除一個 服務器節點時,緩存節點須要大規模遷移。修復該問題須要一致性的哈希算法,做者表示尚未時間解決此事。做者提出了採用中心架構的「主緩存服務器」的解決 辦法,讓客戶端輪詢主緩存服務器來獲取應該與那個緩存服務器通信,但他也覺的這樣作增長了複雜性,會帶來些新問題。

    能夠感受到,因爲 Cacheman 這個我的項目已經介入到 Popfly 這個正式產品中,可能很快就會被微軟吸納爲正式產品,所以若是有人採用這個產品作本身緩存的解決方案的話,應該沒必要太擔憂後續的產品升級及文檔支持服務, 它的將來前途值的期待。說不定 Krishnan 會從 Popfly 項目脫身出來專職負責這個 Cacheman 項目。

目前最新的版本是0.0.2版 :http://www.sriramkrishnan.com/code/

相關文章
相關標籤/搜索