Memcached介紹
Memcached是國外社群網站LiveJournal團隊開發,目的是為了通過緩存資料庫查詢結果,減少資料庫通路次數,進而提高動态web站點性能。
官方站點 http://www.memcached.org/
資料結構簡單(k-v),資料存放在記憶體裡
多線程
基于c/s架構,協定簡單
基于libevent的事件處理
自主記憶體存儲處理(slab allowcation)
資料過期方式:Lazy Expiration 和 LRU
一般使用目的是,通過緩存資料庫查詢結果,減少資料庫通路次數,以提高動态web應用的速度、提高可擴充性。

正常的作業流程是:
使用者發起請求給NGINX,然後再次調用PHP,PHP和mysql打交道,當使用者PHP擷取到請求轉給NGINX,NGINX再次把請求資料交給使用者。
如果并發量很大,請求mysql的隊列比較多,這時候就需要增加一個緩存層Memcached。這樣通路過的資料全部丢在緩存中,當再次請求這個資料的時候就直接從Memcached讀取即可。
Slab allocation
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是通過在記憶體中開辟一塊區域來維持一個大的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叢集的規模,然後您就可以緩存更多的資料。