memcache

 

 

Memcached原理http://www.cnblogs.com/caoxiaojian/p/5715568.htmlhtml

Memcache是一個高性能的分佈式的內存對象緩存系統,經過在內存裏維護一個統一的巨大的hash表,它可以用來存儲各類格式的數據,包括圖像、視 頻、文件以及數據庫檢索的結果等。簡單的說就是將數據調用到內存中,而後從內存中讀取,從而大大提升讀取速度(即用於在動態應用中減小數據庫負載,提高訪 問速度)。前端

   Memcached是以守護進程方式運行於一個或多個服務中,隨時會接收客戶端的鏈接和操做。mysql

   Memcached是一種無阻塞的socket通訊方式服務,基於libevent庫,因爲無阻塞通訊,對內存讀寫速度很是之快。redis

   Memcached分服務器端和客戶端,能夠配置多個服務器端和客戶端,應用於分佈式的服務很是普遍。算法

  Memcached是鍵值一一對應,key默認最大不能超過256個字 節,value默認大小是1M,也就是一個slabs,若是要存2M的值(連續的),不能用兩個slabs,由於兩個slabs不是連續的,沒法在內存中 存儲,故須要修改slabs的大小,多個key和value進行存儲時,即便這個slabs沒有利用完,那麼也不會存放別的數據。sql

Memcached特色()數據庫

一、高性能

 不管哪種數據庫dbms(mysql,oracle,mssql,db2,Postgres等等),再怎麼優化,最終也避不開與慢速的存儲介質(硬 盤、磁帶)進行數據交換,但每每一旦涉及到了存儲介質的io操做,存取性能就會急劇降低。memcached,顧名思義,它的所有操做自始至終都是在內存 中進行的,因此存取數據的效率很是高。

   一般狀況下,大型網站對於數據庫的操做都會作優化。一般的手段有兩種:緩存

       

a、讀寫數據分離,採用主/輔庫的方式,來分散數據庫的壓力,提升查詢速度。安全

 b、按照業務特色橫向或者縱向分割數據庫。簡單來說,就是大庫變小庫,大表變小表,來提升數據庫訪問的效率。通常來說,一個數據庫具備不少表或者一張表有N多的記錄,都會明顯的下降數據庫的服務能力,好比mysql數據庫單表記錄達到2000萬條左右(筆者之前的工做經驗),性能會降低到幾乎沒法忍受。服務器

 

  數據庫會在如下狀況下會出現訪問瓶頸:

    a、事務操做

       企業級的數據庫(好比mysql的innodb模式)都支持事務操做。因爲事務具備原子性,事務中涉及的數據表在運行過程當中將會加鎖。在這種狀況下,訪問這些表的數據會出現延遲。

    b、數據更新

       數據庫中任何的表在數據更新過程當中,一樣會被加鎖。在這種狀況下,也會出現上面一樣的結果。

2分佈式

    一種計算機硬件的配置方式和相應的功能配置方式。它是一種多處理器的計算機系統,各處理器經過互連網絡構成統一的系統。系統採用分佈式計算結構,即把原來 系統內中央處理器處理的任務分散給相應的處理器,實現不一樣功能的各個處理器相互協調,共享系統的外設與軟件。這樣就加快了系統的處理速度,簡化了主機的邏 輯結構。

memcache的分佈式特性主要表如今兩個方面:

    a.memcache客戶端mc和服務器端ms能夠單獨安裝在任何獨立server上。

     固然部署在同一臺server上也沒問題,甚至於一臺機器上能夠部署n個memcached。

     b.memcache服務器端ms能夠安裝在任意數量的server上,提供並行存儲和計算的能力。

        這是分佈式特性的本質體現。ms能夠造成任意多臺server組成的集羣,爲mc提供服務。

Memcached工做機制()

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算法在實際的工做環境中會與操做系統相關,所如今都使用X64位系統。

 

Memcached刪除機制()

Memcached並無過時監控,它是標記刪除,只要內存沒有被重複使用,即便過時了,數據也會存在於內存之中,只是在get時檢測過時時間,若是當前時間大於有效期,就直接返回false。

Memcached應用場景

一、分佈式應用。

   因爲memcached自己基於分佈式的系統,因此尤爲適合大型的分佈式系統。

二、數據庫前段緩存

   數據庫經常是網站系統的瓶頸。數據庫的大併發量訪問,經常形成網站內存溢出。固然咱們也可使用Hibernate的緩存機制。但memcached是基於分佈式的,並可獨立於網站應用自己,因此更適合大型網站進行應用的拆分。

三、服務器間數據共享

      舉例來說,咱們將網站的登陸系統、查詢系統拆分爲兩個應用,放在不一樣的服務器上,並進行集羣,那這個時候用戶登陸後,登陸信息如何從登陸系統服務器同步 到查詢系統服務器呢?這時候,咱們即可以使用memcached,登陸系統將登陸信息緩存起來,查詢系統即可以得到登陸信息,就像獲取本地信息同樣。

不適合應用的場景:

一、緩存的數據量比較小。

二、緩存的數據須要持久化。

Memcached優勢

一、提升系統的併發能力

二、減輕數據庫的負擔

兩種用途其實很是容易理解。因爲memcached高性能,因此能夠同時服務於更多的鏈接,大大提升了系統的併發處理的能力。另外,memcached通 常部署在業務邏輯層(前臺應用)和存儲層(主指數據庫)之間,做爲數據庫和前臺應用的數據緩衝,所以能夠快速的響應前端的請求,減小對數據庫的訪問。

 

redismemcached的區別(總結) 

一、Redis和Memcache都是將數據存放在內存中,都是內存數據庫。不過memcache還可用於緩存其餘東西,例如圖片、視頻等等;

二、Redis不只僅支持簡單的k/v類型的數據,同時還提供list,set,hash等數據結構的存儲;

三、虛擬內存--Redis當物理內存用完時,能夠將一些好久沒用到的value 交換到磁盤;

四、過時策略--memcache在set時就指定,例如set key1 0 0 8,即永不過時。Redis能夠經過例如expire 設定,例如expire name 10;

五、分佈式--設定memcache集羣,利用magent作一主多從;redis能夠作一主多從。均可以一主一從;

六、存儲數據安全--memcache掛掉後,數據沒了;redis能夠按期保存到磁盤(持久化) 讀取方面尤爲是針對批量讀取性能方面memcached佔據優點。固然redis也有他的優勢,如持久性、支持更多的數據結構。 因此在選擇方面若是有持久方面的需求或對數據類型和處理有要求的應該選擇redis;

七、災難恢復--memcache掛掉後,數據不可恢復; redis數據丟失後能夠經過aof恢復;

八、Redis支持數據的備份,即master-slave模式的數據備份;

九、應用場景不同:Redis出來做爲NoSQL數據庫使用外,還能用作消息隊列、數據堆棧和數據緩存等;Memcached適合於緩存SQL語句、數據集、用戶臨時性數據、延遲查詢數據和session等。

相關文章
相關標籤/搜索