memcached

企業級Memcached服務應用實踐。

 

企業級Memcached服務應用實踐

Memcached服務html


 

一, Memcached介紹

 

1.1 Memcached與常見同類軟件對比

(1)Memcached是什麼?前端

  • Memcached是一個開源的,支持高性能,高併發的分佈式內存緩存系統,由C語言編寫,總共2000多行代碼。從軟件名稱上看,前3個字符「Mem」就是內存的意思,而接下來的後面5個字符「cache」就是緩存的意思,最後一個字符d,是daemon的意思,表明是服務器端守護進程模式服務。
  • Memcached服務分爲服務器端和客戶端兩部分,其中,服務器端軟件的名字形如Memcached-1.4.24.tar.gz,客戶端軟件的名字形如Memcache-2.25.tar.gz
  • Memcached軟件誕生於2003年,最初由LiveJournal的Brad Fitzpatrick開發完成。Memcache是整個項目的名稱,而Memcached是服務器端的主程序名,因其協議簡單,應用部署方便,且支持高併發,所以被互聯網企業普遍使用,直到如今仍然如此。其官方網站地址:http://memcached.org/.

(2)Memcached的做用mysql

  • 傳統場景中,多數Web應用都將數據保存到關係型數據庫中(例如:MySQL),Web服務器從中讀取數據並在瀏覽器中顯示。但隨着數據量的增大,訪問的集中,關係型數據庫的負擔就會出現加劇,響應緩慢,致使網站打開延遲等問題,影響用戶體驗。
  • 這時就須要Memcached軟件出馬了。使用Memcached的主要目的是,經過在自身內存中緩存關係型數據庫的查詢結果,減小數據庫被訪問的次數,以提升動態Web應用的速度,提升網站架構的併發能力和可擴展性。
  • Memcached服務的運行原理是經過在事先規劃好的系統內存空間中臨時緩存數據庫中的各種數據,以達到減小前端業務服務對數據庫的直接高併發訪問,從而提高大規模網站集羣中動態服務的併發訪問能力。 
    -生產場景的Memcached服務通常被用來保存網站中常常被讀取的對象或數據,就像咱們的客戶端瀏覽器也會把常常訪問的網頁緩存起來同樣,經過內存緩存來存取對象或數據要比磁盤存取快不少,由於磁盤是機械的,所以,在當今的IT企業中,Memcached的應用範圍很普遍。
 

1.2 互聯網常見內存緩存服務軟件

image_1crmbc3uu1bi51nlapo1ovqnaf9.png-182.2kB

 

二,Memcached的用途與應用場景

 

2.1 Memcached常見用途工做流程

Memcached是一種內存緩存軟件,在工做中常常用來緩存數據庫的查詢數據,數據被緩存在事先與分配的Memcached管理的內存中,能夠經過API或命令的方式存取內存中緩存的這些數據,Memcached服務內存中緩存的數據就像一張巨大的hash表,每條數據都是以key-value對的形式存在。redis

 

2.1.1網站讀取Memcached數據時工做流程

從邏輯上來講,當程序訪問後端數據庫獲取數據時會優先訪問Memcached緩存,若是緩存中有數據就直接返回給客戶端用戶,若是沒有合適的數據(沒有命中),再去後端的數據庫讀取數據,讀取到須要的數據後,就會把數據返回給客戶端,同時還會把讀取到的數據緩存到Memcached內存中,這樣客戶端用戶再次請求相同的數據時就會直接讀取Memcached緩存的數據了,這就大大地減輕了後端數據庫的壓力,並提升了整個網站的響應速度,提高了用戶體驗。算法

展現了Memcached緩存系統和後端數據庫系統的協做流程sql

image_1crmbd9os8ejin6okg1jjrtfnm.png-92.9kB

應用服務器至關於RealServer數據庫

RDBMS至關於MySQL後端

如上圖所示:使用Memcached緩存查詢的數據來減小數據庫壓力的具體工做流程以下:瀏覽器

(1)Web程序首先檢查客戶端請求的數據是否在Memcached緩存中存在,若是存在,直接把請求的數據返回給客戶端,此時再也不請求後端數據庫。緩存

(2)若是請求的數據在Memcached緩存中不存在,則程序會去請求數據庫服務,把從數據庫中取到的數據返回給客戶端,同時把新取到的數據緩存一份到Memcached緩存中。

 

2.1.2 網站更新Memcached數據時的工做流程

(1)當程序更新或刪除數據時,會首先處理後端數據庫中的數據。

(2)在處理後端數據庫中數據的同時,也會通知Memcached,告訴它對應的舊數據失效,從而保證Memcached中緩存的數據始終和數據庫中一致,這個數據一致性很是重要,也是大型網站分佈式緩存集羣最頭疼的問題所在。

(3)若是是在高併發讀寫場合,除了要程序通知Memcached過時的緩存失效外,還可能要經過相關機制,例如在數據庫上部署相關程序(如在數據庫中設置觸發器使用UDFs),實現當數據庫有更新時就把數據更新到Memcached服務中,這樣一來,客戶端在訪問新數據時,因預先把更新過的數據庫數據複製到Memcached中緩存起來了,因此能夠減小第一次查詢數據庫帶來的訪問壓力,提高Memcached中緩存的命中率,甚至新浪門戶還會把持久化存儲Redis作成MySQL數據庫的從庫,實現真正的主從複製。

下圖爲Memcached網站做爲緩存應用更新數據的流程

image_1crmbegc71on71smebaut9g1jc913.png-78.4kB

下圖爲Memcached服務做爲緩存應用經過相關軟件更新數據的流程

image_1crmbeur71437mpu15mb1b61s6n1g.png-74.1kB

在生產工做中,網站Web服務器做爲緩存應用更新數據的方案更爲經常使用,即由網站程序負責更新Memcached緩存。

 

2.2 Memcached在企業中的應用場景

 

2.2.1 做爲數據庫的查詢數據緩存

(1)完整數據緩存

例如:電商的商品分類功能不是常常變更的,所以能夠事先放到Memcached裏,而後再對外提供數據訪問。這個過程被稱之爲「數據預熱」。 
此時只需讀取緩存,無需讀取數據庫就能獲得Memcached緩存裏的全部商品分類數據了,因此數據庫的訪問壓力就會大大下降。 
爲何商品分類數據能夠事先放在緩存裏呢? 
由於,商品分類幾乎都是由內部人員管理的,若是須要更新數據,更新數據庫後,就能夠把數據同時更新到Memcached裏。 
若是把商品分類數據作成靜態化文件,而後,經過在前端Web緩存或者使用CDN加速效果更好。

(2)熱點數據緩存

熱點數據緩存通常是用於由用戶更新的商品,例如淘寶的賣家,在賣家新增商品後,網站程序就會把商品寫入後端數據庫,同時把這部分數據,放入Memcached內存中,下一次訪問這個商品的請求就直接從Memcached內存中取走了。這種方法用來緩存網站熱點的數據,即利用Memcached緩存常常被訪問的數據。

提示: 
這個過程能夠經過程序實現,也能夠在數據庫上安裝相關軟件進行設置,直接由數據庫把內容更新到Memcached中,就至關於Memcached是MySQL的從庫同樣。

  • 若是碰到電商雙11,秒殺高併發的業務場景,必需要事先預熱各類緩存,包括前端的Web緩存和後端的數據庫緩存。

  • 也就是先把數據放入內存預熱,而後逐步動態更新。此時,會先讀取緩存,若是緩存裏沒有對應的數據,再去讀取數據庫,而後把讀到的數據放入緩存。若是數據庫裏的數據更新,須要同時觸發緩存更新,防止給用戶過時的數據,固然對於百萬級別併發還有不少其餘的工做要作。

  • 絕大多數的網站動態數據都是保存在數據庫當中的,每次頻繁地存取數據庫,會致使數據庫性能急劇降低,沒法同時服務更多的用過戶(好比MySQL特別頻繁的鎖表就存在此問題),那麼,就可讓Memcached來分擔數據庫的壓力。增長Memcached服務的好處除了能夠分擔數據庫的壓力之外,還包括無須改動整個網站架構,只須簡單地修改下程序邏輯,讓程序先讀取Memcached緩存查詢數據便可,固然別忘了,更新數據時也要更新Memcached緩存。

 

2.2.2 做爲集羣節點的session會話共享存儲

即把客戶端用戶請求多個前端應用服務集羣產生的session會話信息,統一存儲到一個Memcached緩存中。因爲session會話數據是存儲在內存中的,因此速度很快。

下圖爲Memcached服務在企業集羣架構中的常見工做位置:

image_1crmbhrb59vdgea12u81kg81n2h1t.png-269.7kB

 

三,Memcached的特色與工做機制

 

3.1 Memcached的特色

Memcached做爲高併發,高性能的緩存服務,具備以下特色:

  • 協議簡單。Memcached的協議實現很簡單,採用的是基於文本行的協議,能經過telnet/nc等命令直接操做memcached服務存儲數據。

  • 支持epoll/kqueue異步I/O模型,使用libevent做爲事件處理通知機制。

  • 簡單的說,libevent是一套利用c開發的程序庫,它將BSD系統的kqueue,Linux系統的epoll等事件處理功能封裝成一個接口,確保即便服務器端的鏈接數增長也能發揮很好的性能。Memcached就是利用這個libevent庫進行異步事件處理的。

  • 採用key/value鍵值數據類型。被緩存的數據以key/value鍵值形式存在,例如

 
  1. benet-->36,key=benet,value=36
  2. yunjisuan-->28,key=yunjisuan,value=28
  3. #經過benet key能夠獲取到36值,同理經過yunjisuan key能夠獲取28值
  • 全內存緩存,效率高。Memcached管理內存的方式很是高效,即所有的數據都存放於Memcached服務事先分配好的內存中,無持久化存儲的設計,和系統的物理內存同樣,當重啓系統或Memcached服務時,Memcached內存中的數據就會丟失。

  • 若是但願重啓後,數據依然能保留,那麼就能夠採用redis這樣的持久性內存緩存系統。

  • 當內存中緩存的數據容量達到服務啓動時設定的內存值時,就會自動使用LRU算法(最近最少被使用的)刪除過時的緩存數據。也能夠在存放數據時對存儲的數據設置過時時間,這樣過時後數據就自動被清除,Memcached服務自己不會監控數據過時,而是在訪問的時候查看key的時間戳判斷是否過時。

  • 可支持分佈式集羣 
    Memcached沒有像MySQL那樣的主從複製方式,分佈式Memcached集羣的不一樣服務器之間是互不通訊的,每個節點都獨立存取數據,而且數據內容也不同。經過對Web應用端的程序設計或者經過支持hash算法的負載均衡軟件,可讓Memcached支持大規模海量分佈式緩存集羣應用。

下面是利用Web端程序實現Memcached分佈式的簡單代碼:

 
  1. "memcached_servers" ==>array(
  2. '10.4.4.4:11211',
  3. '10.4.4.5:11211',
  4. '10.4.4.6:11211',

下面使用Tengine反向代理負載均衡的一致性哈希算法實現分佈式Memcached的配置。

 
  1. http {
  2. upstream test {
  3. consistent_hash $request_uri;
  4. server 127.0.0.1:11211 id=1001 weight=3;
  5. server 127.0.0.1:11212 id=1002 weight=10;
  6. server 127.0.0.1:11213 id=1003 weight=20;
  7. }
  8. }

下面使用Tengine反向代理負載均衡的一致性哈希算法實現分佈式Memcached的配置。

 
  1. http {
  2. upstream test {
  3. consistent_hash $request_uri;
  4. server 127.0.0.1:11211 id=1001 weight=3;
  5. server 127.0.0.1:11212 id=1002 weight=10;
  6. server 127.0.0.1:11213 id=1003 weight=20;
  7. }
  8. }

提示: 
Tengine是淘寶網開源的Nginx的分支,上述代碼來自: 
http://tengine.taobao.org/document_cn/http_upstream_consistent_hash_cn.html

 

3.2 Memcached工做原理與機制

 

3.2.1 Memcached工做原理

Memcached是一套相似C/S模式架構的軟件,在服務器端啓動Memcached服務守護進程,能夠指定監聽本地的IP地址,端口號,併發訪問鏈接數,以及分配了多少內存來處理客戶端請求。

 

3.2.2 Socket事件處理機制

Memcached軟件是由C語言來實現的,所有代碼僅有2000多行,採用的是異步epoll/kqueue非阻塞I/O網絡模型,其實現方式是基於異步的libevent事件單進程,單線程模式。使用libevent做爲事件通知機制,應用程序端經過指定服務器的IP地址及端口,就能夠鏈接Memcached服務進行通訊。

 

3.2.3 數據存儲機制

  • 須要被緩存的數據以key/value鍵值對的形式保存在服務器端預分配的內存區中,每一個被緩存的數據都有惟一的標識key,操做Memcached中的數據就是經過這個惟一標識的key進行的。緩存到Memcached中的數據僅放置在Memcached服務預分配的內存中,而非存儲在Memcached服務器所在的磁盤上,所以存取速度很是快。

  • 因爲Memcached服務自身沒有對緩存的數據進行持久化存儲的涉及,所以,在服務器端的Memcached服務進程重啓以後,存儲在內存中的這些數據就會丟失。且當內存中緩存的數據容量達到啓動時設定的內存值時,也會自動使用LRU算法刪除過時的數據。

  • 開發Memcached的初衷僅是經過內存緩存提高訪問效率,並無過多考慮數據的永久存儲問題。所以,若是使用Memcached做爲緩存數據服務,要考慮數據丟失後帶來的問題,例如:是否能夠從新生成數據,還有,在高併發場合下緩存宕機或重啓會不會致使大量請求直接到數據庫,致使數據庫沒法承受,最終致使網站架構雪崩等。

 

3.2.4 內存管理機制

Memcached採用了以下機制:

  • 採用slab(動態)內存分配機制

  • 採用LRU(算法)對象清除機制

  • 採用hash機制快速檢索item(經過MySQL索引查找數據)

 

3.2.5 多線程處理機制

  • 多線程處理時採用的是pthread(POSIX)線程模式。

  • 若要激活多線程,可在編譯時指定:./configure --enable-threads

  • 鎖機制不夠完善

  • 負載太重時,能夠開啓多線程(-t 線程數爲CPU核數)

 

3.3 Memcached預熱理念及集羣節點的正確重啓方法

 

3.3.1 Memcached預熱理念

  • 當須要大面積重啓Memcached時,首先要在前端控制網站入口的訪問流量,而後,重啓Memcached集羣並進行數據預熱,全部數據都預熱完畢以後,再逐步放開前端網站入口的流量。
  • 爲了知足Memcached服務數據能夠持久化存儲的需求,在較早時期,新浪網基於Memcached服務開發了一款NoSQL軟件,名字爲MemcacheDB,實現了在緩存的基礎上增長了持久存儲的特性,不過目前逐步被更優秀的Redis軟件取代了。
 

3.3.2 如何正確開啓網站集羣服務器

若是因爲機房斷電或者搬遷服務器集羣到新機房,那麼啓動集羣服務器時,必定要從網站集羣的後端依次往前端開啓,特別是開啓Memcached緩存服務器時要提早預熱。

 

四,Memcached內存管理

 

4.1 Memcached內存管理機制深刻剖析

(1)Malloc內存管理機制

在講解Memcached內存管理機制前,先來了解malloc

  • malloc的全稱是memory allocation,中文名稱動態內存分配,當沒法知道內存具體位置的時候,想要綁定真正的內存空間,就須要用到動態分配內存。

  • 早期的Memcached內存管理是經過malloc分配的內存實現的1,使用完後經過free來回收內存。這種方式容易產生內存碎片並下降操做系統對內存的管理效率。所以,也會加劇操做系統內存管理器的負擔,最壞的狀況下,會致使操做系統比Memcached進程自己還慢,爲了解決上述問題,Slab Allocator內存分配機制就誕生了。

(2)Slab內存管理機制

如今的Memcached是利用Slab Allocation機制來分配和管理內存的,過程以下:

1)提早將大內存分配大小爲1MB的若干個slab,而後針對每一個slab再進行小對象填充,這個小對象稱爲chunk,避免大量重複的初始化和清理,減輕了內存管理器的負擔。 
Slab Allocation內存分配的原理是按照預先規定的大小,將分配給Memcached服務的內存預先分割成特定長度的內存塊(chunk),再把尺寸相同的內存塊(chunk)分紅組(chunks slab class),這些內存塊不會釋放,能夠重複利用,以下圖所示。

image_1crmbrmi211328uv121t1241man2a.png-88.5kB


2)新增數據對象存儲時。因Memcached服務器中保存着slab內空閒chunk的列表,他會根據該列表選擇chunk,而後將數據緩存於其中。當有數據存入時,Memcached根據接收到的數據大小,選擇最適合數據大小的slab分配一個能存下這個數據的最小內存塊(chunk)。例如:有100字節的一個數據,就會被分配存入下面112字節的一個內存塊中,這樣會有12字節被浪費,這部分空間就不能被使用了,這也是Slab Allocator機制的一個缺點。

image_1crmbs5o3lkr170v19p46mo39q2n.png-40.5kB

Slab Allocator還可重複使用已分配的內存,即分配到的內存不釋放,而是重複利用。


(3)Slab Allocation的主要術語

image_1crmbsm1d1cbrcnqt1v10c5qsf34.png-81.5kB


(4)Slab 內存管理機制特色

  • 提早分配大內存Slab 1MB,再進行小對象填充chunk。

  • 避免大量重複的初始化和清理,減輕內存管理器負擔。

  • 避免頻繁malloc/free內存分配致使的碎片

下面對Mc的內存管理機制進行一個小結

  • Mc的早期內存管理機制爲malloc(動態內存分配)

  • malloc(動態內存分配)產生內存碎片,致使操做系統性能急劇降低。

  • Slab內存分配機制能夠解決內存碎片的問題

  • Memcached服務的內存預先分割成特定長度的內存塊,稱爲chunk,用於緩存數據的內存空間或內存塊,至關於磁盤的block,只不過磁盤的每個block都是相等的,而chunk只有在同一個Slab Class內纔是相等的。

  • Slab Class指特定大小(1MB)的包含多個chunk的集合或組,一個Memcached包含多個Slab Class,每一個Slab Class包含多個相同大小的chunk。

  • Slab機制也有缺點,例如,Chunk的空間會有浪費等。

 

4.2 Memcached Slab Allocator內存管理機制的缺點

(1)chunk存儲item浪費空間

Slab Allocator解決了當初的內存碎片問題,但新的機制也給Memcached帶來了新的問題。這個問題就是,因爲分配的是特定長度的內存,所以沒法有效利用分配的內存。例如,將100字節的數據緩存到128字節的chunk中,剩餘的28字節就浪費了,以下圖所示: 
image_1crmburl31t3n1t2o15rv5eb27841.png-25.9kB

避免浪費內存的辦法是,預先計算出應用存入的數據大小,或把同一業務類型的數據存入一個Memcached服務器中,確保存入的數據大小相對均勻,這樣就能夠減小內存的浪費。 
還有一種辦法是,在啓動時指定「-f」參數,能在某種程度上控制內存組之間的大小差別。在應用中使用Memcached時,一般能夠不從新設置這個參數,即便用默認值1.25進行部署便可。若是想優化Memcached對內存的使用,能夠考慮從新計算數據的預期平均長度,調整這個參數來得到合適的設置值,命令以下:

 
  1. -<factor>chunk size growth factor (default:1.25)!

(2)Slab尾部剩餘空間

  • 假設在classid=40中,兩個chunk佔用了1009384byte,那麼就有1048576-1009384=39192byte會被浪費掉。解決辦法:規劃slab大小=chunk大小*n整數倍。
 

4.3 使用Growth Factor對Slab Allocator內存管理機制調優

在啓動Memcached時指定Growth Factor因子(經過 -f 選項),就能夠在某種程度上控制每組Slab之間的差別。默認值1.25。可是,在該選項出現以前,這個因子曾經被固定爲2,稱爲2「powers of 2」策略。讓咱們用之前的設置,以verbose模式啓動Memcached試試看:

 
  1. #memcached -f 2 w

下面是啓動後的verbose輸出:

 
  1. slab class 1:chunk size 128 perslab 8192
  2. slab class 2:chunk size 256 perslab 4096
  3. slab class 3:chunk size 512 perslab 2048
  4. slab class 4:chunk size 1024 perslab 1024
  5. slab class 5:chunk size 2048 perslab 512
  6. slab class 6:chunk size 4096 perslab 256
  7. slab class 7:chunk size 8192 perslab 128
  8. slab class 8:chunk size 16384 perslab 64
  9. slab class 9:chunk size 32768 perslab 32
  10. slab class 10:chunk size 65536 perslab 16
  11. slab class 11:chunk size 131072 perslab 8
  12. slab class 12:chunk size 262144 perslab 4
  13. slab class 13:chunk size 524288 perslab 2

可見,從128字節的組開始,組的大小依次增大爲原來的2倍。這樣設置的問題是,Slab之間的差異比較大,有些狀況下就至關浪費內存。所以,爲儘可能減小內存浪費,兩年前追加了growth factor這個選項。

來看看如今的默認設置(f=1.25)時的輸出:

 
  1. slab class 1:chunk size 88 perslab 11915 <---88*11915=1048520
  2. slab class 2:chunk size 112 perslab 9362
  3. slab class 3:chunk size 144 perslab 7281
  4. slab class 4:chunk size 184 perslab 5698
  5. slab class 5:chunk size 232 perslab 4519
  6. slab class 6:chunk size 296 perslab 3542
  7. slab class 7:chunk size 376 perslab 2788
  8. slab class 8:chunk size 472 perslab 2221
  9. slab class 9:chunk size 592 perslab 1771
  10. slab class 10:chunk size 744 perslab 1409 <---744*1409=1048520
  • 此時每一個Slab的大小是同樣的,即1048520,1MB。組間的差距比因子爲2時小得多,可見,這個值越小,Slab中chunk size的差距就越小,內存浪費也就越小。可見,默認值1.25更適合緩存幾百字節的對象。從上面的輸出結果來看,可能會以爲有些計算偏差,這些偏差是爲了保持字節數的對齊而故意設置的。

  • 當使用Memcached或是直接使用默認值進行部署時,最好是從新計算一下數據的預期平均長度,調整growth factor,以得到最恰當的設置。內存是珍貴的資源,浪費就太惋惜了。

 

4.4 Memcached的檢測過時與刪除機制

(1)Memcached懶惰檢測對象過時機制

  • 首先要知道,Memcached不會主動檢測item對象是否過時,而是在進行get操做時檢查item對象是否過時以及是否應該刪除!

  • 由於不會主動檢測item對象是否過時,天然也就不會釋放已分配給對象的內存空間了,除非爲添加的數據設定過時時間或內存緩存滿了,在數據過時後,客戶端不能經過key取出它的值,其存儲空間將被從新利用。

  • Memcached使用的這種策略爲懶惰檢測對象過時策略,即本身不監控存入的key/value對是否過時,而是在獲取key值時查看記錄的時間戳(sed key flag exptime bytes),從而檢查key/value對空間是否過時。這種策略不會在過時檢測上浪費CPU資源。

(2)Memcached懶惰刪除對象機制

  • 當刪除item對象時,通常不會釋放內存空間,而是作刪除標記,將指針放入slot回收插槽,下次分配的時候直接使用。

  • Memcached在分配空間時,會優先使用已通過期的key/value對空間;若分配的內存空間佔滿,Memcached就會使用LRU算法來分配空間,刪除最近最少使用的key/value對,從而將其空間分配給新的key/value對。在某些狀況下(完整緩存),若是不想使用LRU算法,那麼能夠經過「-M」參數來啓動Memcached,這樣,Memcached在內存耗盡時,會返回一個報錯信息,以下

 
  1. -M rerurn error on memory exhausted(rather than removing items)

下面針對Memcached刪除機制進行一個小結

  • 不主動檢測item對象是否過時,而是在get時纔會檢查item對象是否過時以及是否應該刪除。

  • 當刪除item對象時,通常不釋放內存空間,而是作刪除標記,將指針放入slot回收插槽,下次分配的時候直接使用。

  • 當內存空間滿的時候,將會根據LRU(最近最少使用)算法把最近最少使用的item對象刪除。

  • 數據存入能夠設定過時時間,可是數據過時後不會被當即刪除,而是在get時檢查item對象是否過時以及是否應該刪除。

  • 若是不但願系統使用LRU算法清除數據,能夠用使用-M參數。

 

五,Memcached服務安裝

Memcached的安裝比較簡單,支持Memcached的平臺常見的有Linux,FreeBSD,Solaris,Windows。這裏以Centos6.5爲例進行講解。

 

Memcached全部包下載地址

連接:https://pan.baidu.com/s/16uvApZWz_E8_0mbiB5bZog 
提取碼:lgxd

 

5.1 安裝libevent及鏈接Memcached工具nc

 

系統安裝環境

cat /etc/redhat-release

uname -r

hostname -I

image_1ct2kssri1qe11d7f17rf3bp2ur9.png-18.5kB

 

安裝Memcached相關軟件包

安裝Memcached前須要先安裝libevent,有關libevent的內容在前文已經介紹,此處用yum命令安裝libevent。操做命令以下:

yum -y install libevent libevent-devel nc --->自帶光盤裏沒有,須要公網yum源

rpm -qa libevent libevent-devel nc

image_1ct2kudcm1ughph5138vvup1cjum.png-30.3kB

 

5.2 安裝Memcached

yum -y install memcached --->可經過光盤安裝

提示: 
形如「memcache-2.2.7.tgz」文件名的軟件爲客戶端源代碼軟件,而形如「memcached-1.4.24.tar.gz」的文件爲服務器端的源代碼軟件。

image_1ct2l0pjj1jjv1ro8p5c1kgoe3g13.png-12.1kB

 

六,Memcached服務的基本管理

 

6.1 啓動Memcached

which memcached --->查看Memcached命令路徑

memcached -m 16m -p 11211 -d -u root -c 8192

-m 啓動16兆內存 -p 默認端口11211 -d 啓動守護進程 -u 指定用戶 -c 指定鏈接數

image_1ct2lo2oi18ou1fgl1nij1d321kdj3v.png-13.5kB

 

啓動第一個Memcached實例

netstat -antup | grep 11211 --->查看啓動狀況

ps -ef | grep memcached | grep -v grep

image_1ct2losg9jt8onj32knqh7hi4c.png-28.8kB

 

啓動第二個Memcached實例

memcached -m 16m -p 11212 -d -u root -c 8192

ps -ef | grep memcached | grep -v grep

image_1ct2lqffjhs2t77u7eajdagq4p.png-21kB

 

可把上述兩個實例的啓動命令放入/etc/rc.local,以便下次開機能夠自啓動

tail -2 /etc/rc.local 
memcached -m 16m -p 11211 -d -u root -c 8192 
memcached -m 16m -p 11212 -d -u root -c 8192

 

6.2 Memcached啓動命令相關參數說明

進程與鏈接設置:

image_1crmc95l9g6p18olaabr8outb4e.png-29.7kB

內存相關設置:

image_1crmc9jbu1j5321r1ot7vg41gm64r.png-28.1kB

併發鏈接設置:

image_1crmca5211e7j42oi5i1r7q12ep58.png-22.5kB

測試參數:

image_1crmcajijl7l16vpu6a1512mi55l.png-14.5kB

其餘選項可經過「memcached -h」命令來顯示。

 

6.3 向Memcached中寫入數據並檢查

 

6.3.1 Memcached中的數據形式及與MySQL相關語句對比

向Memcached中添加數據時,注意添加的數據通常爲鍵值對的形式,例如:key1-->values1,key2-->values2

這裏把Memcached添加,查詢,刪除等的命令和MySQL數據庫作一個基本類比,見下表:

image_1crmcfbegib5o7cgco838rls1c.png-15.9kB

 

6.3.2 向Memcached中寫入數據實踐

 

(1)經過printf配合nc向Memcached中寫入數據,命令以下:**

printf "set key1 0 0 5\r\nbenet\r\n" | nc 127.0.0.1 11211

STORED --->出現STORED表示成功添加key1及對應的數據

printf和echo的區別是printf不會輸出換行符 nc是鏈接memcached的

image_1ct2m9j1eumhlbjipk17uqo2r56.png-11.3kB


 

若是set命令的字節是5,那麼後面就要5個字符(字節)。不然插入數據就會不成功

printf "set key1 0 0 4\r\nbenet\r\n" | nc 127.0.0.1 11211

image_1ct2mafgp1n9k17nk12101bv9sch5j.png-13.4kB


 

經過printf配置nc從Memcached中讀取數據

printf "get key1\r\n" | nc 127.0.0.1 11211 
VALUE key1 0 5 
benet #這就是讀取到的key1對應額值

image_1ct2me4t31nh2i3b1os4d8i1u2j60.png-12.6kB


 

經過printf配合nc從Memcached中刪除數據

printf "delete key1\r\n" | nc 127.0.0.1 11211

printf "get key1\r\n" | nc 127.0.0.1 11211

image_1ct2mghtm1d4p1slpmcr9b11bik6d.png-15.5kB

提示: 
推薦使用上述方法測試操做Memcached,只支持鍵值的讀取方式別的不支持

 

(2)經過telnet命令寫入數據時,具體步驟以下

 

1)安裝telnet工具

yum -y install telnet

image_1ct2mka501sde1ghkcq213hnuh96q.png-6.5kB

 

2)經過telnet向Memcached中寫入數據

which telnet

telnet 127.0.0.1 11211

Trying 127.0.0.1... --->若是到這裏表明未成功

Escape character is '^]'. --->鏈接成功

set user01 0 0 7 --->寫入數據

user01 --->鍵

get user01 --->瀏覽數據

delete user01 --->刪除數據

get user01 --->再瀏覽數據,數據被刪除

quit --->退出

Connection closed by foreign host. --->退出提示

image_1ct2mmtdn16b7aulfdqrfq1t6k77.png-32.6kB

 

6.4 操做Memcached相關命令的語法

 

如下爲操做Memcached的相關命令基本語法

 
  1. set key1 0 0 6 \r\n benet \r\n
  2. <command name><key><flags><exptime><bytes><datablock><string><datablock>
  3. STORED
  4. <status>
 

下表爲操做Memcached相關命令的詳細說明

image_1crmci7v39bt1kaol4eokr7ib1p.png-158.3kB

 

6.5 關閉Memcached

 

單實例關閉Memcached的方法(直接殺主進程方式)

ps -ef | grep memcached | grep -v grep

killall memcached或pkill memcached

netstat -antup | grep 11211

image_1ct2nbm4816099c4o4c1jjpbnr7k.png-23.7kB

 

若啓動了多個實例Memcached,使用killall或pkill方式就會同時關閉這些實例!所以最好在啓動時增長-P參數指定固定的pid文件,這樣便於管理不一樣的實例。

memcached -m 16m -p 11211 -d -u root -c 8192 -P /var/run/11211.pid

memcached -m 16m -p 11212 -d -u root -c 8192 -P /var/run/11212.pid

ps -ef | grep memcached | grep -v grep

image_1ct2nkifk1tud1ptq1u451baj1djn8e.png-39.6kB

 

此時,便可經過kill命令關閉Memcached

 
  1. kill `cat /var/run/11211.pid`

netstat -antup | grep 11211

netstat -antup | grep 11212

image_1ct2nl6itsrt7oh7ok1mp32g48r.png-30kB

相關文章
相關標籤/搜索