Memcached 簡介
Memcached 是什么?
Memcached 是以 LiveJournal [1] 旗下 Danga Interactive 公司的 Brad Fitzpatric [2] 為首開發的一款軟件。現在已成為 mixi、 hatena、非死book、Vox、LiveJournal 等眾多服務中提高 Web 應用擴展性的重要因素。許多 Web 應用都將數據保存到 RDBMS 中,應用服務器從中讀取數據并在瀏覽器中顯示。但隨著數據量的增大、訪問的集中,就會出現 RDBMS 的負擔加重、數據庫響應惡化、網站顯示延遲等重大影響。
這時就該 memcached 大顯身手了。memcached 是高性能的分布式內存緩存服務器。一般的使用目的是,通過緩存數據庫查詢結果,減少數據庫訪問次數,以提高動態Web應用的速度、提高可擴展性。
Memcached 是一個高性能的分布式內存對象緩存系統,用于動態 Web 應用以減輕數據庫負載。它通過在內存中緩存數據和對象來減少讀取數據庫的次數,從而提供動態、數據庫驅動網站更快的運行速度。Memcached 基于一個存儲鍵/值對的 hashmap。其守護進程(daemon )是用 C 寫的,但是客戶端可以用任何語言來編寫,并通過 memcached 協議與守護進程通信。但是它并不提供冗余(例如,復制其 hashmap 條目);當某個服務器 S 停止運行或崩潰了,所有存放在 S 上的鍵/值對都將丟失。
(截取自:http://baike.baidu.com/view/794242.htm)
Memcached 能緩存什么?
通過在內存里維護一個統一的巨大的 hash 表,Memcached 能夠用來存儲各種格式的數據,包括圖像、視頻、文件以及數據庫檢索的結果等。
Memcached 快么?
非常快。memcached 使用了 libevent(如果可以的話,在 linux 下使用 epoll)來均衡任何數量的打開鏈接,使用非阻塞的網絡 I/O,對內部對象實現引用計數(因此,針對多樣的客戶端,對象可以處在多樣的狀態), 使用自己的頁塊分配器和哈希表, 因此虛擬內存不會產生碎片并且虛擬內存分配的時間復雜度可以保證為O(1).。
Danga Interactive 為提升 Danga Interactive 的速度研發了 memcached。目前,LiveJournal.com 每天已經在向一百萬用戶提供多達兩千萬次的頁面訪問。而這些,是由一個由 web 服務器和數據庫服務器組成的集群完成的。memcached 幾乎完全放棄了任何數據都從數據庫讀取的方式,同時,它還縮短了用戶查看頁面的速度、更好的資源分配方式,以及 memcache 失效時對數據庫的訪問速度。
(截取自:http://developer.51cto.com/art/200902/108601.htm)
Memcached 特征是什么?
- 協議簡單
- 基于libevent的事件處理
- 內置內存存儲方式
- memcached不互相通信的分布式
協議簡單
memcached 的服務器客戶端通信并不使用復雜的XML等格式, 而使用簡單的基于文本行的協議。因此,通過 telnet 也能在 memcached 上保存數據、取得數據。
基于libevent的事件處理
libevent 是個程序庫,它將 Linux的epoll、BSD類操作系統的kqueue等事件處理功能 封裝成統一的接口。即使對服務器的連接數增加,也能發揮 O(1) 的性能。 memcached 使用這個 libevent 庫,因此能在 Linux、BSD、Solaris 等操作系統上發揮其高性能。 關于事件處理這里就不再詳細介紹,可以參考 Dan Kegel 的 The C10K Problem。
- libevent: http://www.monkey.org/~provos/libevent/
- The C10K Problem: http://www.kegel.com/c10k.html
內置內存存儲方式
為了提高性能,memcached 中保存的數據都存儲在 memcached 內置的內存存儲空間中。 由于數據僅存在于內存中,因此重啟 memcached、重啟操作系統會導致全部數據消失。 另外,內容容量達到指定值之后,就基于LRU( Least Recently Used ) 算法自動刪除不使用的緩存。 memcached 本身是為緩存而設計的服務器,因此并沒有過多考慮數據的永久性問題。
memcached不互相通信的分布式
memcached 盡管是“分布式”緩存服務器,但服務器端并沒有分布式功能。 各個 memcached 不會互相通信以共享信息。那么,怎樣進行分布式呢? 這完全取決于客戶端的實現。
memcached的分布式
(截取自:http://tech.idv2.com/2008/07/10/memcached-001/)
Memcached 適合什么場合?
在很多時候,memcached 都被濫用了,這當然少不了對它的抱怨。我經常在論壇上看見有人發貼,類似于“如何提高效率”,回復是“用 memcached ”,至于怎么用,用在哪里,用來干什么一句沒有。memcached 不是萬能的,它也不是適用在所有場合。
Memcached是 “分布式”的內存對象緩存系統,那么就是說,那些不需要“分布”的,不需要共享的,或者干脆規模小到只有一臺服務器的應用,memcached 不會帶來任何好處,相反還會拖慢系統效率,因為網絡連接同樣需要資源,即使是 UNIX 本地連接也一樣。 在我之前的測試數據中顯示,memcached 本地讀寫速度要比直接 PHP 內存數組慢幾十倍,而APC、共享內存方式都和直接數組差不多。可見,如果只是本地級緩存,使用 memcached 是非常不劃算的。
Memcached 在很多時候都是作為數據庫前端 cache 使用的。因為它比數據庫少了很多 SQL 解析、磁盤操作等開銷,而且它是使用內存來管理數據的,所以它可以提供比直接讀取數據庫更好的性能,在大型系統中,訪問同樣的數據是很頻繁 的,memcached 可以大大降低數據庫壓力,使系統執行效率提升。另外,memcached 也經常作為服務器之間數據共享的存儲媒介,例如在 SSO 系統中保存系統單點登陸狀態的數據就可以保存在 memcached 中,被多個應用共享。
需要注意的是,memcached 使用內存管理數據,所以它是易失的,當服務器重啟,或者 memcached 進程中止,數據便會丟失,所以 memcached 不能用來持久保存數據。很多人的錯誤理解,memcached 的性能非常好,好到了內存和硬盤的對比程度,其實 memcached 使用內存并不會得到成百上千的讀寫速度提高,它的實際瓶頸在于網絡連接,它和使用磁盤的數據庫系統相比,好處在于它本身非常“輕”,因為沒有過多的開銷和 直接的讀寫方式,它可以輕松應付非常大的數據交換量,所以經常會出現兩條千兆網絡帶寬都滿負荷了, memcached 進程本身并不占用多少 CPU 資源的情況。(截取自: http://blog.developers.api.sina.com.cn/?p=124 )
擴展閱讀:
1.LiveJournal(經常被簡寫為LJ)是一個在互聯網上提供寫作的虛擬社區服務 http://www.livejournal.com/
2.Brad Fitzpatrick:http://bradfitz.com/