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