memcached簡介(轉)

 背景

    memcached是一個高性能、分佈式的內存對象緩存系統。
    memcached普遍應用在大負載高併發的網站上,是一種很是成熟的產品(稱爲一項技術也何嘗不可)。像facebook,youtube,yahoo,sina,sohu,netease,豆瓣等網站均或多或少使用了該項產品。memcached在以用戶爲中心的網站上,表現尤爲突出,例如sns,blog等web2.0應用的站點。這些站點通常來說,特別注重用戶體驗,用戶對服務器的響應速度要求很高,用戶數據相對比較複雜、關連度比較高,須要常常對數據庫進行更新和檢索。
    memcache是danga.com幾個開源項目中的一個,最初是專門爲livejournal.com站點而開發的,當時這個站點日pv達到了千萬級,在使用過程當中出現了不少的與負載和響應速度相關的問題,因而開發了這個項目,旨在改善網站當時的困境。memcache能夠應對任意多個鏈接,使用非阻塞的網絡IO。它的使用很是簡單和方便,最經常使用的功能不超過5個方法。
memcache官方網站: [url]http://www.danga.com/memcached[/url]
 

特色

    一、高性能
     不管哪種數據庫dbms(mysql,oracle,mssql,db2,Postgres等等),再怎麼優化,最終也避不開與慢速的存儲介質(硬盤、磁帶)進行數據交換,但每每一旦涉及到了存儲介質的io操做,存取性能就會急劇降低。memcached,顧名思義,它的所有操做自始至終都是在內存中進行的,因此存取數據的效率很是高。
     固然,一般狀況下,大型網站對於數據庫的操做都會作優化。一般的手段有兩種:
     a、讀寫數據分離,採用主/輔庫的方式,來分散數據庫的壓力,提升查詢速度。
     b、按照業務特色橫向或者縱向分割數據庫。簡單來說,就是大庫變小庫,大表變小表,來提升數據庫訪問的效率。通常來說,一個數據庫具備不少表或者一張表有N多的記錄,都會明顯的下降數據庫的服務能力,好比mysql數據庫單表記錄達到2000萬條左右(筆者之前的工做經驗),性能會降低到幾乎沒法忍受。關於數據庫的設計和優化,咱們之後能夠單獨作一個專題,這裏不作太多的研究。
     數據庫會在如下狀況下會出現訪問瓶頸:
     a、事務操做
     企業級的數據庫(好比mysql的innodb模式)都支持事務操做。因爲事務具備原子性,事務中涉及的數據表在運行過程當中將會加鎖。在這種狀況下,訪問這些表的數據會出現延遲。
     b、數據更新
     數據庫中任何的表在數據更新過程當中,一樣會被加鎖。在這種狀況下,也會出現上面一樣的結果。
     memcached的操做基本上就不會存在以上狀況(實際上也有加鎖的狀況,在後面再詳細探討),因此它的性能很是高。官方網站上對它的正式評價是very fast。事實上也是如此,相關的實驗室測試對比結果,你們能夠到網上搜索一下,比比皆是。
 
    二、分佈式
    所謂分佈式系統比較專業的解釋是:
    一種計算機硬件的配置方式和相應的功能配置方式。它是一種多處理器的計算機系統,各處理器經過互連網絡構成統一的系統。系統採用分佈式計算結構,即把原來系統內中央處理器處理的任務分散給相應的處理器,實現不一樣功能的各個處理器相互協調,共享系統的外設與軟件。這樣就加快了系統的處理速度,簡化了主機的邏輯結構。
memcache的分佈式特性主要表如今兩個方面:
a.memcache客戶端mc和服務器端ms能夠單獨安裝在任何獨立server上。
  固然部署在同一臺server上也沒問題,甚至於一臺機器上能夠部署n個memcached。
b.memcache服務器端ms能夠安裝在任意數量的server上,提供並行存儲和計算的能力。
  這是分佈式特性的本質體現。ms能夠造成任意多臺server組成的集羣,爲mc提供服務。

用途

    一、提升系統的併發能力
    二、減輕數據庫的負擔
    這兩種用途其實很是容易理解。因爲memcached高性能,因此能夠同時服務於更多的鏈接,大大提升了系統的併發處理的能力。另外,memcached一般部署在業務邏輯層(前臺應用)和存儲層(主指數據庫)之間,做爲數據庫和前臺應用的數據緩衝,所以能夠快速的響應前端的請求,減小對數據庫的訪問。
    如下是一個memcached部署的邏輯示意圖,其中mc是指memcached client,ms是指memcached server:
 
 
 

工做機制

    Memcached 是以守護程序方式運行於一個或多個服務器中,隨時接受客戶端的鏈接操做,客戶端能夠由各類語言編寫,目前已知的客戶端 API 包括 Perl/PHP/Python/Ruby/Java/C#/C 等等。客戶端首先與 Memcached 服務創建鏈接,而後存取對象。每一個被存取的對象都有一個惟一的標識符 key,存取操做均經過這個 key 進行,保存的時候還能夠設置有效期。保存在 Memcached 中的對象其實是放置在內存中的,而不是在硬盤上。Memcached 進程運行以後,會預申請一塊較大的內存空間,本身進行管理,用完以後再申請一塊,而不是每次須要的時候去向操做系統申請。Memcached將對象保存在一個巨大的Hash表中,它還使用NewHash算法來管理Hash表,從而得到進一步的性能提高。因此當分配給Memcached的內存足夠大的時候, Memcached的時間消耗基本上只是網絡Socket鏈接了。 
    Memcached按照LRU方式調度數據。LRU是Least Recently Used的縮寫,即最近最少使用頁面置換算法,是爲虛擬頁式存儲管理服務的。LRU算法在實際的工做環境中會與操做系統相關,好比32位的操做系統,最大的尋址空間是4G,若是當前內存的使用超過了這個限度,將被調出內存,內存中總維持最新最經常使用的數據。64位操做系統大大擴展了內存的尋址能力,因此如今很memcached服務都是運行在64位系統上。
 
相關文章
相關標籤/搜索