日期:2008-06-20 作者:喜騰小二
Memcached是高性能的,分佈式的內存對象緩存繫統,用於在動態應用中減少數據庫負載,提升訪問速度。
Memcached由Danga Interactive開發,用於提升LiveJournal.com訪問速度的。LJ每秒動態页面訪問量幾韆次,用戶700萬。Memcached將數據庫負載大幅度降低,更好的分配資源,更快速訪問。
為什麼不使用數據庫做這些?
暫且不考慮使用什麼樣的數據庫(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)。