使用memcached進行內存緩存

 

通常的網頁緩存方式有動態緩存和靜態緩存等幾種,在ASP.NET中已經可以實現對頁面局部進行緩存,而使用memcached的緩存比ASP.NET的局部緩存更加靈活,可以緩存任意的對象,不管是否在頁面上輸出。而memcached最大的優點是可以分佈式的部署,這對於大規模應用來說也是必不可少的要求。
LiveJournal.com使用了memcached在前端進行緩存,取得了良好的效果,而像wikipedia,sourceforge等也採用了或即將採用memcached作爲緩存工具。memcached可以大規模網站應用發揮巨大的作用。

Memcached是什麼?

Memcached是高性能的,分佈式的內存對象緩存系統,用於在動態應用中減少數據庫負載,提升訪問速度。
Memcached由Danga Interactive開發,用於提升LiveJournal.com訪問速度的。LJ每秒動態頁面訪問量幾千次,用戶700萬。Memcached將數據庫負載大幅度降低,更好的分配資源,更快速訪問。

如何使用memcached-Server端?

在服務端運行:
# ./memcached -d -m 2048 -l 10.0.0.40 -p 11211
這將會啓動一個佔用2G內存的進程,並打開11211端口用於接收請求。由於32位系統只能處理4G內存的尋址,所以在大於4G內存使用PAE的32位服務器上可以運行2-3個進程,並在不同端口進行監聽。

如何使用memcached-Client端?

在應用端包含一個用於描述Client的Class後,就可以直接使用,非常簡單。
PHP Example:
$options["servers"] = array("192.168.1.41:11211", "192.168.1.42:11212");
$options["debug"] = false;
$memc = new MemCachedClient($options);
$myarr = array("one","two", 3);
$memc->set("key_one", $myarr);
$val = $memc->get("key_one");
print $val[0]."/n"; // prints 'one‘
print $val[1]."/n"; // prints 'two‘
print $val[2]."/n"; // prints 3

爲什麼不使用數據庫做這些?


暫且不考慮使用什麼樣的數據庫(MS-SQL, Oracle, Postgres, MysQL-InnoDB, etc..), 實現事務(ACID,Atomicity, Consistency, Isolation, and Durability )需要大量開銷,特別當使用到硬盤的時候,這就意味着查詢可能會阻塞。當使用不包含事務的數據庫(例如Mysql-MyISAM),上面的開銷不存在,但讀線程又可能會被寫線程阻塞。
Memcached從不阻塞,速度非常快。

爲什麼不使用共享內存?

最初的緩存做法是在線程內對對象進行緩存,但這樣進程間就無法共享緩存,命中率非常低,導致緩存效率極低。後來出現了共享內存的緩存,多個進程或者線程共享同一塊緩存,但畢竟還是隻能侷限在一臺機器上,多臺機器做相同的緩存同樣是一種資源的浪費,而且命中率也比較低。
Memcached Server和Clients共同工作,實現跨服務器分佈式的全局的緩存。並且可以與Web Server共同工作,Web Server對CPU要求高,對內存要求低,Memcached Server對CPU要求低,對內存要求高,所以可以搭配使用。

Mysql 4.x的緩存怎麼樣?

Mysql查詢緩存不是很理想,因爲以下幾點:
當指定的表發生更新後,查詢緩存會被清空。在一個大負載的系統上這樣的事情發生的非常頻繁,導致查詢緩存效率非常低,有的情況下甚至還不如不開,因爲它對cache的管理還是會有開銷。
在32位機器上,Mysql對內存的操作還是被限制在4G以內,但memcached可以分佈開,內存規模理論上不受限制。
Mysql上的是查詢緩存,而不是對象緩存,如果在查詢後還需要大量其它操作,查詢緩存就幫不上忙了。
如果要緩存的數據不大,並且查詢的不是非常頻繁,這樣的情況下可以用Mysql 查詢緩存,不然的話memcached更好。

數據庫同步怎麼樣?

這裏的數據庫同步是指的類似Mysql Master-Slave模式的靠日誌同步實現數據庫同步的機制。
你可以分佈讀操作,但無法分佈寫操作,但寫操作的同步需要消耗大量的資源,而且這個開銷是隨着slave服務器的增長而不斷增長的。
下一步是要對數據庫進行水平切分,從而讓不同的數據分佈到不同的數據庫服務器組上,從而實現分佈的讀寫,這需要在應用中實現根據不同的數據連接不同的數據庫。
當這一模式工作後(我們也推薦這樣做),更多的數據庫導致更多的讓人頭疼的硬件錯誤。
Memcached可以有效的降低對數據庫的訪問,讓數據庫用主要的精力來做不頻繁的寫操作,而這是數據庫自己控制的,很少會自己阻塞 自己。

Memcached快嗎?


非常快,它使用libevent,可以應付任意數量打開的連接(使用epoll,而非poll),使用非阻塞網絡IO,分佈式散列對象到不同的服務器,查詢複雜度是O(1)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章