|
- ASP.NET緩存全解析1:緩存的概述
- ASP.NET緩存全解析2:頁面輸出緩存
- ASP.NET緩存全解析3:頁面局部緩存
- ASP.NET緩存全解析4:應(yīng)用程序數(shù)據(jù)緩存
- ASP.NET 緩存全解析5:文件緩存依賴
- ASP.NET 緩存全解析6:數(shù)據(jù)庫緩存依賴
- ASP.NET 緩存全解析7:第三方分布式緩存解決方案 Memcached和Cacheman
Memcached — 分布式緩存系統(tǒng)
1.Memcached是什么?
Memcached是高性能的,分布式的內(nèi)存對象緩存系統(tǒng),用于在動態(tài)應(yīng)用中減少數(shù)據(jù)庫負載,提升訪問速度。Memcached通過在內(nèi)存里維護一個統(tǒng)一的巨大的hash表,它能夠用來存儲各種格式的數(shù)據(jù),包括圖像、視頻、文件以及數(shù)據(jù)庫檢索的結(jié)果等。Memcached由Danga Interactive最初為了加速 LiveJournal網(wǎng)站訪問速度而開發(fā)的,后來被很多大型的網(wǎng)站采用。起初作者編寫它可能是為了提高動態(tài)網(wǎng)頁應(yīng)用,為了減輕數(shù)據(jù)庫檢索的壓力,來做的這個緩存系統(tǒng)。它的緩存是一種分布式的,也就是可以允許不同主機上的多個用戶同時訪問這個緩存系統(tǒng),這種方法不僅解決了共享內(nèi)存只能是單機的弊端, 同時也解決了數(shù)據(jù)庫檢索的壓力,最大的優(yōu)點是提高了訪問獲取數(shù)據(jù)的速度!基于memcached作者對分布式cache的理解和解決方案。memcached完全可以用到其他地方 比如分布式數(shù)據(jù)庫,分布式計算等領(lǐng)域。Memcached將數(shù)據(jù)庫負載大幅度降低,更好的分配資源,更快速訪問。
2.Memcached工作機制
通過在內(nèi)存中開辟一塊區(qū)域來維持一個大的hash表來加快頁面訪問速度,和數(shù)據(jù)庫是獨立的。但是目前主要用來緩存數(shù)據(jù)庫的數(shù)據(jù)。允許多個server通過網(wǎng)絡(luò)形成一個大的hash,用戶不必關(guān)心數(shù)據(jù)存放在哪,只調(diào)用相關(guān)接口就可。存放在內(nèi)存的數(shù)據(jù)通過LRU算法進行淘汰出內(nèi)存。同時可以通過刪除和設(shè)置失效時間來淘汰存放在內(nèi)存的數(shù)據(jù)。
現(xiàn)在一些.NET開發(fā)人員開始放棄ASP.NET內(nèi)置的緩存機制,轉(zhuǎn)而使用Memcached——一種分布式的內(nèi)存緩存系統(tǒng)。當(dāng)運行在單獨的Web服務(wù)器上,你可以很容易地清除一個已經(jīng)確認被改變了的緩存。可惜,ASP.NET沒有一個很好的方法來支持多服務(wù)器。每個服務(wù)器上的緩存都對其他緩存的改變一無所知。
ASP.NET允許通過基于文件系統(tǒng)和數(shù)據(jù)庫表的觸發(fā)器來作廢一個緩存。然而,這也存在問題,比如數(shù)據(jù)庫觸發(fā)器需要使用昂貴的輪詢,以及觸發(fā)器本身冗長的編程。但是,我們還是有其他的選擇的。
不像ASP.NET內(nèi)置的緩存機制,Memcached是一個分布式的緩存系統(tǒng)。任何Web服務(wù)器都能更新或刪除一個緩存項,并且所有其他的服務(wù)器都能在下次訪問這些緩存項的時候自動獲取到更新的內(nèi)容。這是通過把這些緩存項存儲在一個或者多個緩存服務(wù)器上來實現(xiàn)的。每一個緩存項都根據(jù)它的關(guān)鍵字的哈希值來分配到一個服務(wù)器上。
表面看來,Memcached針對ASP.NET的API就像和內(nèi)置的API一樣。這讓開發(fā)人員很容易地轉(zhuǎn)換到Memcached上,僅僅通過在代碼中查找和替換即可實現(xiàn)。
一個被推薦的解決方案是不根據(jù)緩存項的關(guān)鍵字來生成哈希鍵值。這將允許開發(fā)人員能夠讓一個給定頁面中需要的所有緩存項,盡量存放在同一個服務(wù)器上。可惜,基于數(shù)據(jù)保存的地方而不是基于緩存項自身的關(guān)鍵字來生成哈希鍵,很容易產(chǎn)生錯誤,需要仔細來實現(xiàn)(這個算法)。
Memcached是基于Linux運行的,你可以在BSD的許可協(xié)議下使用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架構(gòu)下的分布式緩存項目
Cacheman據(jù)說是由微軟旗下的 Popfly 項目組成員 Sriram Krishnan 的作品。是他用業(yè)余時間開發(fā)的。最新的情況是,微軟的 Popfly 網(wǎng)站已經(jīng)“悄悄地”的做了更新,就是采用了 Krishnan 的 Cacheman,更新了緩存機制。該項緩存技術(shù)更新帶來的性能提升非常顯著,根據(jù)Popfly團隊中的 John Montgomery 的說法:加載一個已有的Mashup應(yīng)用時,可以帶來2到6倍的性能提升。
這些說法也得到了 Krishnan 本人的確認。他提到這是Cacheman 的第一次的實際應(yīng)用,并自豪的說 Cacheman 不費吹灰之力就拿下了 Popfly 的全部訪問量。
簡單介紹一下 Cacheman 這個項目。資料主要來源于 Krishnan的博客對Cacheman的介紹。
Cacheman是一個基于Windows平臺的快速分布式哈希表。是由純托管代碼實現(xiàn)。中間擱置了有幾個月,直到最近才開始重新上馬這個項目,極可能就是因為Popfly項目需要的緣故才開始著手的。
Krishnan本人對 memcached 很感興趣,于是創(chuàng)建了 Cacheman。Cacheman上有很多 memcached 的影子,比如與memcached相似的文本通訊協(xié)議。Cacheman的通訊協(xié)議公開,任何人可以根據(jù)自己偏愛的語言環(huán)境寫客戶端。 Krishnan 在自己家用電腦(2.4GHz Intel Core 2 帶2GB內(nèi)存)上進入測試,達到了每秒16000次左右的請求,并且還是服務(wù)器與客戶端都是在同一臺服務(wù)器下完成的。
現(xiàn)這款產(chǎn)品還不太完善,作者自身也提到:在Cacheman做指定key的GET/SET/DELETE操作時,客戶端需要弄清需要與哪一臺Cacheman服務(wù)器通訊,為此要對該key做一個快速FNV哈希然后求余得到應(yīng)該和幾臺服務(wù)器中的哪臺服務(wù)器通訊。但該法的缺點在于新增或刪除一個服務(wù)器節(jié)點時,緩存節(jié)點需要大規(guī)模遷移。修復(fù)該問題需要一致性的哈希算法,作者表示還沒有時間解決此事。作者提出了采用中心架構(gòu)的“主緩存服務(wù)器”的解決辦法,讓客戶端輪詢主緩存服務(wù)器來獲取應(yīng)該與那個緩存服務(wù)器通訊,但他也覺的這樣做增加了復(fù)雜性,會帶來些新問題。
可以感覺到,由于 Cacheman 這個個人項目已經(jīng)介入到 Popfly 這個正式產(chǎn)品中,可能很快就會被微軟吸納為正式產(chǎn)品,因此如果有人采用這個產(chǎn)品做自己緩存的解決方案的話,應(yīng)該不必太擔(dān)心后續(xù)的產(chǎn)品升級及文檔支持服務(wù),它的未來前途值的期待。說不定 Krishnan 會從 Popfly 項目脫身出來專職負責(zé)這個 Cacheman 項目。
目前最新的版本是0.0.2版 :http://www.sriramkrishnan.com/code/。
NET技術(shù):ASP.NET緩存全解析7:第三方分布式緩存解決方案 Memcached和Cacheman,轉(zhuǎn)載需保留來源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。