天天看點

Memcached原理

Memcached介紹

Memcached是國外社群網站LiveJournal團隊開發,目的是為了通過緩存資料庫查詢結果,減少資料庫通路次數,進而提高動态web站點性能。

官方站點 http://www.memcached.org/

資料結構簡單(k-v),資料存放在記憶體裡

多線程

基于c/s架構,協定簡單

基于libevent的事件處理

自主記憶體存儲處理(slab allowcation)

資料過期方式:Lazy Expiration 和 LRU

一般使用目的是,通過緩存資料庫查詢結果,減少資料庫通路次數,以提高動态web應用的速度、提高可擴充性。

Memcached原理

正常的作業流程是:

使用者發起請求給NGINX,然後再次調用PHP,PHP和mysql打交道,當使用者PHP擷取到請求轉給NGINX,NGINX再次把請求資料交給使用者。

如果并發量很大,請求mysql的隊列比較多,這時候就需要增加一個緩存層Memcached。這樣通路過的資料全部丢在緩存中,當再次請求這個資料的時候就直接從Memcached讀取即可。

Slab allocation

Memcached原理

Slab Allocation的原理

将配置設定的記憶體分割成各種尺寸的塊(chunk), 并把尺寸相同的塊分成組(chunk的集合),每個chunk集合被稱為slab。

Memcached的記憶體配置設定以Page為機關,Page預設值為1M,可以在啟動時通過-I 參數來指定。

Slab是由多個Page組成的,Page按照指定大小切割成多個chunk。

Growth factor

Memcached在啟動時通過-f選項可以指定 Growth Factor因子。該值控制chunk大小的差異。預設值為1.25。

通過memcached-tool指令檢視指定Memcached執行個體的不同slab狀态,可以看到各Item所占大小(chunk大小)差距為1.25

指令:# memcached-tool 127.0.0.1:11211 display

Memcached 内部不會監視記錄是否過期,而是在get時檢視記錄的時間戳,檢查記錄是否過期。這種技術被稱為lazy(惰性)expiration。是以,Memcached不會在過期監視上耗費CPU時間。

LRU機制

Memcached會優先使用已逾時的記錄的空間,但即使如此,也會發生追加新記錄時空間不足的情況,此時就要使用名為Least Recently Used(LRU)機制來配置設定空間。顧名思義,這是删除“最近最少使用”的記錄的機制。是以,當記憶體空間不足時(無法從slab class擷取到新的空間時),就從最近未被使用的記錄中搜尋,并将其空間配置設定給新的記錄。從緩存的實用角度來看,該模型十分理想。

安裝 memcached

配置參數

比如加上監聽的ip,可以把OPTIONS=”” 改為OPTIONS=”127.0.0.1″

其中-m 指定memcached配置設定記憶體

-c 指定最大并發數

-u 指定運作memcached服務的使用者

檢視Memcached運作狀态

方式一:

方式二:

方式三:

Memcached擴充

Memcached是怎麼工作的?

Memcached的高性能源于兩階段哈希(two-stage hash)結構。Memcached就像一個巨大的、存儲了很多<key,value>對的哈希表。通過key,可以存儲或查詢任意的資料。 用戶端 可以把資料存儲在多台memcached上。當查詢資料時,用戶端首先參考節點清單計算出key的哈希值(階段一哈希),進而選中一個節點;用戶端将請求發送給選中的節點,然後 memcached節點通過一個内部的雜湊演算法(階段二哈希),查找真正的資料(item)并傳回給用戶端。從實作的角度看,memcached是一個非阻塞的、基于事件的伺服器程式。

Memcached的存取對應的伺服器:

在查Memcached的時候經常會想到一個問題:“如果我将東西分别存在不同的伺服器上面,那麼memcached是如何配置設定這些資料在哪些伺服器上面呢? 取的時候又是如何取的呢?”查到了一個部落客的解析說:“memcached分布式環境下,每個伺服器端本身沒有互相連接配接,它的資料分布其實是由用戶端來維持的,用戶端按照自己的分布算法來講資料配置設定給指定的伺服器,取的時候用戶端再查找指定的伺服器!”可是我還沒有做過測試,所等我做了測試之後讓我用資料來說明一切吧!

Memcached原理

Memcached分布式叢集:

Memcached是通過在記憶體中開辟一塊區域來維持一個大的hash表來加快前台頁面對資料庫的資料通路的!它和資料庫是獨立的,不用經過硬碟,目前主要用來緩存資料庫中變動不大的資料。允許多個server通過網絡形成一個大的hash,使用者不必關心資料存放在哪,隻調用相關接口就可。這就是memcached的分布式叢集!

Memcached 的優勢:

Memcached最大的好處就是它帶來了極佳的水準可擴充性,特别是在一個巨大的系統中。由于用戶端自己做了一次哈希,那麼我們很容易增加大量memcached到叢集中。memcached 之間沒有互相通信,是以不會增加 memcached的負載;沒有多點傳播協定,不會網絡通信量爆炸(implode)。

memcached和MySQL的query cache相比,有什麼優缺點?

缺點:相比MySQL的query cache,把Memcached引入應用中需要不少的工作量。MySQL的query cache,可以自動地緩存SQL查詢的結果,被緩存的SQL查詢可以被反複、快速的執行。

優點:

1)當修改表時,MySQL的query cache會立刻被重新整理(flush)。當寫操作很頻繁時,MySQL的query cache會經常讓所有緩存資料都失效。

2)在多核CPU上,MySQL的query cache會遇到擴充問題(scalability issues)。在多核CPU上,query cache會增加一個全局鎖(global lock), 由于需要重新整理更多的緩存資料,速度會變得更慢。

3)在MySQL的query cache中,是不能存儲任意的資料的(隻能是SQL查詢結果)。利用memcached,我們可以搭建出各種高效的緩存。比如,可以執行多個獨立的查詢,建構出一個使用者對象(user object),然後将使用者對象緩存到memcached中。而query cache是SQL語句級别的,不可能做到這一點。在小的網站中,query cache會有所幫助,但随着網站規模的增加,query cache的弊将大于利。

4)query cache能夠利用的記憶體容量受到MySQL伺服器空閑記憶體空間的限制。給資料庫伺服器增加更多的記憶體來緩存資料,固然是很好的。但是,有了memcached,隻要您有空閑的記憶體,都可以用來增加memcached叢集的規模,然後您就可以緩存更多的資料。