1. 程式人生 > >帶你走進快取世界(6):共享快取

帶你走進快取世界(6):共享快取

回顧之前的章節,我們大致講了下快取的基本概念、原理、策略和常用方法。可能會有朋友會說,訪問量小根本不需要快取,徒增開發的複雜度,訪問量大的話本地快取也沒意義。其實這話說的也不無道理,當然我們不能把這句話看成絕對的話,不然什麼話都成廢話了:),其實我們研究學習的任何技術都不會白學的,每種技術都有他的使用範疇,只是當我們面對新的層次時,需要改變,需要重新學習。我們之前講的每篇都非常有用,本地快取也非常有用。不過當我們面臨大的資料量和訪問量的考研時,就需要使用新的解決方案。今天就講講共享快取那些事。

到底什麼是共享快取?為什麼要用共享快取?
新的層次就是指當我們僅僅依賴資料庫和本地快取已經無法滿足我們的訪問量時,我們該怎麼處理?
其實問題突出在IO(Input/Output)上,就是說我們的IO能力不足了,解決辦法其實很簡單就是增加記憶體。但是,既然是增加記憶體為什麼還談公共快取呢?其實這裡牽扯到了一個分散式的整體部署問題。Web站點伺服器一般不是IO為主的機器,而資料庫伺服器才是IO密集型伺服器。如果我們只是在Web伺服器上增加記憶體,雖然可以解決一時的IO緊張問題,但是Web服務一旦重啟,快取被清空,那麼所有的請求都將會去資料庫伺服器請求,那麼資料庫直接就會垮掉,也就是說網站直接垮掉。這是其一,其二web伺服器是CPU密集型伺服器(也就是主要用於計算,包含資料的物件處理、壓縮等),如果一臺計算頂不住的時候或者連線數頂不住的時候,勢必要增加web伺服器,到時候快取該建立在哪臺伺服器上呢?所以最理想的辦法就是把快取獨立出來,這就是共享快取伺服器。

共享快取和我們本地快取的區別在哪裡呢?
最大的區別就是不在一臺機器上,就是不在一個程序裡都不好搞,你說是不。 所以要通過網路傳輸獲取資料,但這要比本地快取慢了不知多少倍,因為機器之間的通訊是毫秒級的,而本地記憶體的資料處理是納米級的!傳輸完了還不算,傳輸的物件也不是我們直接使用的資料型別,我們還要經過反序列化成我們想要的物件再進行處理。所以,共享快取看起來貌似壞處多多。雖然慢,但是這也是無奈之舉,因為我們不可能無限制的提升一臺機器的能力,而且這種提升也是昂貴的,不如多臺廉價機器平行計算;況且,再不濟也比通過網路訪問資料庫快吧:),資料庫可是從磁碟掃描的啊,這個速度也是毫秒級的。

怎麼開發共享快取呢?
既然不是一臺機器,那麼共享快取就牽扯到了網路通訊技術,我們平時使用的通訊協議就是tcp、http,而.net自帶的通訊框架就是WCF,還有就是WebService,你是不是有種WebService太不靠譜的感覺?Http是無狀態協議,不能保持連線,每次都要重新建立開啟關閉,這並不太適合我們,而採用類似資料庫的連線池方式最合適(反過來想,我們開發的何嘗不就是資料庫?只不過是key/value的記憶體資料庫罷了)所以選用WCF,使用TCP協議更適合我們,只是我們需要在以前的程式碼基礎上增加網路通訊和序列化、壓縮等程式碼:),再複雜的話那就是安全、分散式支援咯。

我們需要開發共享快取嗎?
看到WCF、TCP,連線池、分散式神馬的,很多同學可能都暈了- -,其實這還是有一定難度的,不過還好我們能想到的技術這個世界上90%的都已經有了,更何況是共享快取呢。所以我們可以直接拿別人成熟的產品來使用就行了。至於如何開發,有興趣也可去研究別人的原始碼,自己有能力的話試著去開發一個.NET版本來提升自己的能力,一般也不推薦自己開發,除非有特殊的資料結構快取,不然會帶來維護上更高的成本,除非像很有實力和需求的公司。現在一些流行的軟體或框架也都是自己的需求慢慢演化成通用軟體的。現在比較知名的快取服務比如Memcached、Redis,當然還有其他好多,這個大家可以自己搜尋,我就不一一舉例了。


後面的章節應該會對共享快取的使用做一些簡單的介紹,至於是否開發一個C#版的簡易的共享快取服務,我看個人時間吧,最一段時間我忙著離職、找工作、和家人團聚、分離什麼的。。。唉,諸多理由來遮掩我的懶惰,呵呵。有時間我會寫的。