寫這篇文章以前,我也特地跟之前的同事作了一些交流,在此感謝sina xiangdong、kingsoft zhangyan和yahoo luke。另外,還有網上的朋友對我上一節的文章發表了許多有建設性評論,在這裏一併感謝。
memcached最吸引人的地方主要在於它的分佈式。分佈式對於互聯網應用來說,按照用途基本上可劃分爲三種方式:分佈式計算、分佈式存儲和二者兼而有之。memcached是分佈式存儲的一種。咱們常見的分佈式存儲大多數是將N臺設備(server或者單獨的存儲)構建成盤陣,而memcached旨在構建一個高速的內存池。更通俗一點來說:分佈式計算是將N顆cpu組裝成一顆cpu,分佈式慢速存儲是將N個硬盤組裝成一個大硬盤,memcached是將N塊內存組裝成一塊大內存。
有個朋友問:那是否是代價很昂貴啊。個人回答是確定的。若是你的網站規模只有三兩臺服務器的話,我以爲你就不用考慮這樣的方案了,等你的網站作大了之後,再參考這方面的資料便可。通常都是比較大的互聯網公司爲了追求更好的用戶體驗,才進行這方面的投資,對他們來說,用戶體驗至上,money是小case。
還有朋友問:有一些dbms提供內存表的功能,好比mysql的內存表,能夠代替memcached。但我要建議你的是:mysql的內存表確實起到一樣的做用,但它的侷限也不少,每每不能讓你爲所欲爲,因此建議你不要走彎路。
2、memcached的應用場景
2.1 應用範圍
memcached產品或相關技術的應用,咱們在前面已經提到了一些。其實它的應用仍是很是廣泛的,應用做爲普遍的領域:例如sns類網站、blog類網站、bbs類網站以及im後臺服務。
2.2 sns類網站的應用
livejournal.com是99年始於校園中的項目,有點像中國的校內網。幾個學生純屬出於愛好作了這樣一個網站,主要實現如下功能: sns、blog、bbs和rss等。livejournal從創建開始就採用了大量的開源軟件,到如今它自己也衍生了很多開源軟件。 sns網站,如今比比皆是,規模比較大的象開心、校內、51,它們的頁面上每每須要引用大量的用戶信息、好友信息以及文章信息等,因此跨表或跨庫操做會至關多。若是這些功能所有直接操做數據庫,顯然會帶來極大的效率損耗和系統負載。memcached在這樣的場景下就會發揮巨大的做用,它採用大內存把這些不變的數據全都緩存起來,當數據修改時就通知cache過時,這樣應用層基本上就能夠解決大部分問題了,只有很小一部分請求穿透應用層,用到數據庫。
2.3 blog、bbs類網站的應用
象blog.sina.com.cn這些流量巨大的blog系統,它須要頻繁讀寫的一些小數據。其中最典型的應用,咱們一般成爲「數字類服務」,好比blog中須要實時顯示的用戶點擊數和閱讀數,bbs中須要記錄的在線人數、在線用戶等。這些小數據的處理很是繁瑣,你不管怎麼去設計數據庫,都很難避開跨表或者跨庫。有的朋友會說,能夠在數據庫中增長冗餘字段解決這類問題,但事實上,這既不符合數據庫設計的範式規則,也很難作到數據的一致性,由此會引起更爲複雜的問題。並且因爲產品線的分散發展,數據已經很難作到徹底的統一規劃。memcached在這樣的場景下就會將這些小數據進行緩存,按期持久化就能夠了,查詢操做一直都在內存中運行。說到這裏,有的朋友又會想到一些其它的問題:「memcached server宕機了怎麼辦,怎麼保證與數據庫的數據一致」。我會對你說:「你的問題很是好,咱們將會在後面章節給出相應的解決方案」。另外,其實這種小數據並非關鍵性數據,即便偶爾發生點錯誤,也沒太大的問題。blog、bbs系統並非嚴格的企業級系統,假如你是爲銀行業務提供解決方案的話,memcached並不適合。
2.4 im server的應用
前些時間, 有一些文章介紹memcached 在Jabber上應用。寫累了,喝口水,讀者本身去找找資料吧,有時間的話,幫我補上吧,呵呵。
咱們舉了幾個例子來講明memcached的應用場景,彷佛都侷限於小數據服務,那是否是就不能用於較大數據的緩衝了?那毫不是,memcached可以用來存儲各類格式的數據,包括圖像、視頻、文件以及數據庫檢索的結果等等,並且生產環境中就這麼跑過,只不過讓大數據量使用緩衝的話,有點太浪費了,一樣數量的內存存不了幾條數據,因此會明顯的下降命中率。