1. 程式人生 > >Memcached數據庫緩存

Memcached數據庫緩存

sta 關系型數據庫 邏輯 rpm sql 應用場景 mirror 內部 系統性能

Memcached

一、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/.

  Memcached的作用

傳統場景中,多數Web應用都將數據保存到關系型數據庫中(例如:MySQL),Web服務器從中讀取數據並在瀏覽器中顯示。但隨著數據量的增大,訪問的集中,關系型數據庫的負擔就會出現加重,響應緩慢,導致網站打開延遲等問題,影響用戶體驗。

這時就需要Memcached軟件出馬了。使用Memcached的主要目的是,通過在自身內存中緩存關系型數據庫的查詢結果,減少數據庫被訪問的次數,以提高動態Web應用的速度,提高網站架構的並發能力和可擴展性。

Memcached服務的運行原理是通過在事先規劃好的系統內存空間中臨時緩存數據庫中的各類數據,以達到減少前端業務服務對數據庫的直接高並發訪問,從而提升大規模網站集群中動態服務的並發訪問能力。


-生產場景的Memcached服務一般被用來保存網站中經常被讀取的對象或數據,就像我們的客戶端瀏覽器也會把經常訪問的網頁緩存起來一樣,通過內存緩存來存取對象或數據要比磁盤存取快很多,因為磁盤是機械的,因此,在當今的IT企業中,Memcached的應用範圍很廣泛。

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

技術分享圖片

二、Memcached的用戶與應用場景

  1、Memcached常見用途工作流程

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

  2、網站讀取Memcached數據時工作流程

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

技術分享圖片

如上圖所示:使用Memcached緩存查詢的數據來減少數據庫壓力的具體工作流程如下:

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

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

  3、網站更新Memcached數據時的工作流程

具體流程如下:

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

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

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

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

技術分享圖片

下圖為Memcached服務作為緩存應用通過相關軟件更新數據的流程

技術分享圖片

  4、Memcached在企業中的應用場景

(1)作為數據庫的查詢數據緩存

  完整數據緩存

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

  熱點數據緩存

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

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

  • 如果碰到電商雙11,秒殺高並發的業務場景,必須要事先預熱各種緩存,包括前端的Web緩存和後端的數據庫緩存。
  • 也就是先把數據放入內存預熱,然後逐步動態更新。此時,會先讀取緩存,如果緩存裏沒有對應的數據,再去讀取數據庫,然後把讀到的數據放入緩存。如果數據庫裏的數據更新,需要同時觸發緩存更新,防止給用戶過期的數據,當然對於百萬級別並發還有很多其他的工作要做。
  • 絕大多數的網站動態數據都是保存在數據庫當中的,每次頻繁地存取數據庫,會導致數據庫性能急劇下降,無法同時服務更多的用過戶(比如MySQL特別頻繁的鎖表就存在此問題),那麽,就可以讓Memcached來分擔數據庫的壓力。增加Memcached服務的好處除了可以分擔數據庫的壓力以外,還包括無須改動整個網站架構,只須簡單地修改下程序邏輯,讓程序先讀取Memcached緩存查詢數據即可,當然別忘了,更新數據時也要更新Memcached緩存。

(2)作為集群節點的session會話共享存儲

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

下圖為Memcached服務在企業集群架構中的常見工作位置:

技術分享圖片

三、Memcached的特點與工作機制

  1、Memcached的特點

  • 協議簡單。Memcached的協議實現很簡單,采用的是基於文本行的協議,能通過telnet/nc等命令直接操作memcached服務存儲數據。
  • 支持epoll/kqueue異步I/O模型,使用libevent作為事件處理通知機制。
  • 簡單的說,libevent是一套利用c開發的程序庫,它將BSD系統的kqueue,Linux系統的epoll等事件處理功能封裝成一個接口,確保即使服務器端的連接數增加也能發揮很好的性能。Memcached就是利用這個libevent庫進行異步事件處理的。
  • 采用key/value鍵值數據類型。被緩存的數據以key/value鍵值形式存在,例如:
benet-->36,key=benet,value=36
yunjisuan-->28,key=yunjisuan,value=28
#通過benet key可以獲取到36值,同理通過yunjisuan key可以獲取28值
  • 全內存緩存,效率高。Memcached管理內存的方式非常高效,即全部的數據都存放於Memcached服務事先分配好的內存中,無持久化存儲的設計,和系統的物理內存一樣,當重啟系統或Memcached服務時,Memcached內存中的數據就會丟失。
  • 如果希望重啟後,數據依然能保留,那麽就可以采用redis這樣的持久性內存緩存系統。
  • 當內存中緩存的數據容量達到服務啟動時設定的內存值時,就會自動使用LRU算法(最近最少被使用的)刪除過期的緩存數據。也可以在存放數據時對存儲的數據設置過期時間,這樣過期後數據就自動被清除,Memcached服務本身不會監控數據過期,而是在訪問的時候查看key的時間戳判斷是否過期。
  • 可支持分布式集群
  • Memcached沒有像MySQL那樣的主從復制方式,分布式Memcached集群的不同服務器之間是互不通信的,每一個節點都獨立存取數據,並且數據內容也不一樣。通過對Web應用端的程序設計或者通過支持hash算法的負載均衡軟件,可以讓Memcached支持大規模海量分布式緩存集群應用。

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

"memcached_servers" ==>array(
10.4.4.4:11211,
10.4.4.5:11211,
10.4.4.6:11211,

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

http {
upstream test {
consistent_hash $request_uri;
server 127.0.0.1:11211 id=1001 weight=3;
server 127.0.0.1:11212 id=1002 weight=10;
server 127.0.0.1:11213 id=1003 weight=20;
}
}

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

  2、Memcached工作原理與機制

  (1)Memcached工作原理

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

  (2)Socket時間處理機制

Memcached軟件是由C語言來實現的,全部代碼僅有2000多行,采用的是異步epoll/kqueue非阻塞I/O網絡模型,其實現方式是基於異步的libevent事件單進程,單線程模式。使用libevent作為事件通知機制,應用程序端通過指定服務器的IP地址及端口,就可以連接Memcached服務進行通信。

  (3)數據存儲機制

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

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

開發Memcached的初衷僅是通過內存緩存提升訪問效率,並沒有過多考慮數據的永久存儲問題。因此,如果使用Memcached作為緩存數據服務,要考慮數據丟失後帶來的問題,例如:是否可以重新生成數據,還有,在高並發場合下緩存宕機或重啟會不會導致大量請求直接到數據庫,導致數據庫無法承受,最終導致網站架構雪崩等。

  (4)內存管理機制

Memcached采用了如下機制:

  • 采用slab內存分配機制
  • 采用LRU對象清除機制
  • 采用hash機制快速檢索item

  (5)多線程處理機制

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

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

鎖機制不夠完善

負載過重時,可以開啟多線程(-t 線程數為CPU核數)

  3、Memcached預熱理念及集群節點的正確重啟方法

  Memcached預熱理念

當需要大面積重啟Memcached時,首先要在前端控制網站入口的訪問流量,然後,重啟Memcached集群並進行數據預熱,所有數據都預熱完畢之後,再逐步放開前端網站入口的流量。

為了滿足Memcached服務數據可以持久化存儲的需求,在較早時期,新浪網基於Memcached服務開發了一款NoSQL軟件,名字為MemcacheDB,實現了在緩存的基礎上增加了持久存儲的特性,不過目前逐步被更優秀的Redis軟件取代了。

  正確開啟網站集群服務器

如果由於機房斷電或者搬遷服務器集群到新機房,那麽啟動集群服務器時,一定要從網站集群的後端依次往前端開啟,特別是開啟Memcached緩存服務器時要提前預熱。

四、Memcached內存管理

  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),這些內存塊不會釋放,可以重復利用,如下圖所示。

技術分享圖片

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

技術分享圖片

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

(3)Slab Allocation的主要術語

技術分享圖片

(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的空間會有浪費等。

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

(1)chunk存儲item浪費空間

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

技術分享圖片

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

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

(2)Slab尾部剩余空間

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

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

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

memcached -f 2 w

啟動後的verbose

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

可見,從128字節的組開始,組的大小依次增大為原來的2倍。這樣設置的問題是,Slab之間的差別比較大,有些情況下就相當浪費內存。因此,為盡量減少內存浪費,兩年前追加了growth factor這個選項。

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

slab class 1:chunk size 88 perslab 11915 <---88*11915=1048520
slab class 2:chunk size 112 perslab 9362
slab class 3:chunk size 144 perslab 7281
slab class 4:chunk size 184 perslab 5698
slab class 5:chunk size 232 perslab 4519
slab class 6:chunk size 296 perslab 3542
slab class 7:chunk size 376 perslab 2788
slab class 8:chunk size 472 perslab 2221
slab class 9:chunk size 592 perslab 1771
slab class 10:chunk size 744 perslab 1409 <---744*1409=1048520

此時每個Slab的大小是一樣的,即1048520,1MB。組間的差距比因子為2時小得多,可見,這個值越小,Slab中chunk size的差距就越小,內存浪費也就越小。可見,默認值1.25更適合緩存幾百字節的對象。從上面的輸出結果來看,可能會覺得有些計算誤差,這些誤差是為了保持字節數的對齊而故意設置的。

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

  4、Memcached的檢測過期與刪除機制

  Memcached懶惰檢測對象過期機制

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

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

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

  Memcached懶惰刪除對象機制

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

Memcached在分配空間時,會優先使用已經過期的key/value對空間;若分配的內存空間占滿,Memcached就會使用LRU算法來分配空間,刪除最近最少使用的key/value對,從而將其空間分配給新的key/value對。在某些情況下(完整緩存),如果不想使用LRU算法,那麽可以通過“-M”參數來啟動Memcached,這樣,Memcached在內存耗盡時,會返回一個報錯信息,如下:

-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為例進行講解。

  安裝libevent及連接Memcached工具nc,需要公網源

[root@6 yum.repos.d]# pwd
/etc/yum.repos.d
[root@6 yum.repos.d]# wget http://mirrors.163.com/.help/CentOS6-Base-163.repo
[root@6 yum.repos.d]# ls
bak  CentOS6-Base-163.repo  CentOS-Media.repo
[root@6 yum.repos.d]# yum -y clean all
[root@6 yum.repos.d]# yum makecache
[root@6 yum.repos.d]# yum -y install libevent libevent-devel nc
[root@6 yum.repos.d]# rpm -qa install libevent libevent-devel nc
libevent-1.4.13-4.el6.x86_64
libevent-devel-1.4.13-4.el6.x86_64
nc-1.84-24.el6.x86_64

  安裝Memcached(可用光盤安裝)

[root@6 yum.repos.d]# yum -y install memcached

六、Memcached服務的基本管理

  1、啟動Memcached

[root@6 yum.repos.d]# which memcached
/usr/bin/memcached
[root@6 yum.repos.d]# memcached -m 16m -p 11211 -d -u root -c 8192
[root@6 yum.repos.d]# ss -antup | grep mem
udp    UNCONN     0      0                      *:11211                 *:*      users:(("memcached",1632,28))
udp    UNCONN     0      0                     :::11211                :::*      users:(("memcached",1632,29))
tcp    LISTEN     0      128                   :::11211                :::*      users:(("memcached",1632,27))
tcp    LISTEN     0      128                    *:11211                 *:*      users:(("memcached",1632,26))

可以起多實例修改-p端口即可

-m指定占用內存的大小,詢問開發人員 -p指定端口

-d以守護進程的方式 -u指定用戶 -c可並發連接數

  修改端口再次啟動

[root@6 yum.repos.d]# memcached -m 16m -p 11212 -d -u root -c 8192
[root@6 yum.repos.d]# ss -antup | grep mem

技術分享圖片

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

技術分享圖片

  2、Memcached啟動命令相關參數說明

  • -d 以守護進程(daemon)方式運行服務
  • -u 指定運行Memcached的用戶,如果當前用戶為root,需要使用此參數指定用戶
  • -l 指定Memcached進程監聽的服務器IP地址,可以不設置此參數
  • -p(小寫)|指定Memcached服務監聽TCP端口號。默認為11211
  • -P(大寫)|設置保存Memcached的pid文件($$),保存PID到指定文件

內存相關設置

命令參數說明
-m 指定Memcached服務可以緩存數據的最大內存,默認為64MB
-M Memcached服務內存不夠時禁止LRU,如果內存滿了會報錯
-n 為key+value——flags分配的最小內存空間,默認為48字節
-f chunk size增長因子,默認為1.25
-L 啟用大內存頁,可以降低內存浪費,改進性能

並發連接設置

並發連接設置說明
-c 最大的並發連接數,默認是1024
-t 線程數,默認4.由於Memcached采用的是NIO,所以太多線程作用不大
-R 每個event最大請求數,默認是20
-C 禁用CAS(可以禁止版本計數,減少開銷)

測試參數

-v打印較少的errors/warnings
-vv 打印非常多調試信息和錯誤輸出到控制臺
-vvv 打印極多的調試信息和錯誤輸出,也打印內部狀態轉變

其他選項可通過“memcached -h”命令來顯示。

  3、向Memcached中寫入數據並檢查

向Memcached中添加數據時,註意添加的數據一般為鍵值對的形式,例如:key1-->values1,key2-->values2

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

MySQL數據庫管理Memcached管理
MySQL的insert語句 Memcached的set命令
MySQL的select語句 Memcached的get命令
MySQL的delete語句 Memcached的delete命令

(1)通過printf配合nc向Memcached中寫入數據

[root@6 ~]# which printf
/usr/bin/printf
[root@6 ~]# printf "set key1 0 0 5\r\nbenet\r\n" | nc 127.0.0.1 11211
STORED

技術分享圖片

  通過printf配置ncMemcached中讀取數據

[root@6 ~]# printf "get key1\r\n" | nc 127.0.0.1 11211
VALUE key1 0 5
benet
END

技術分享圖片

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

[root@6 ~]# printf "delete key1\r\n" | nc 127.0.0.1 11211
DELETED
[root@6 ~]# printf "get key1\r\n" | nc 127.0.0.1 11211
END

技術分享圖片

(2)通過telnet命令寫入數據

  安裝telnet工具

[root@6 ~]# yum -y install telnet
[root@6 ~]# which telnet
/usr/bin/telnet

  通過telnet向Memcached中寫入數據

[root@6 ~]# telnet 127.0.0.1 11211

技術分享圖片

技術分享圖片

  4、操作Memcached相關命令的語法

以下為操作Memcached的相關命令基本語法:

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

下表為操作Memcached相關命令的詳細說明:

技術分享圖片

  5、關閉Memcached

單實例關閉Memcached的方法如下:

[root@6 ~]# ps -ef | grep mem | grep -v grep
root        537      2  0 04:19 ?        00:00:00 [vmmemctl]
root       1632      1  0 04:45 ?        00:00:00 memcached -m 16m -p 11211 -d -u root -c 8192
root       1670      1  0 04:48 ?        00:00:00 memcached -m 16m -p 11212 -d -u root -c 8192
[root@6 ~]# killall memcached
[root@6 ~]# netstat -antup | grep 11211

若啟動了多個實例Memcached,使用killall或pkill方式就會同時關閉這些實例!因此最好在啟動時增加-P參數指定固定的pid文件,這樣便於管理不同的實例。示例如下:

[root@6 ~]# memcached -m 16m -p 11211 -d -u root -c 8192 -P /var/run/11211.pid
[root@6 ~]# memcached -m 16m -p 11212 -d -u root -c 8192 -P /var/run/11212.pid

技術分享圖片

此時,即可通過kill命令關閉Memcached

[root@6 run]# kill `cat /var/run/11211.pid`
[root@6 run]# netstat -antup | grep 11211
[root@6 run]# netstat -antup | grep 11212

技術分享圖片

  6、企業工作場景中如何配置Memcached

在企業實際工作中,一般是開發人員提出需求,說要部署一個Memcached數據緩存。運維人員在接到這個不確定的需求後,需要和開發人員深入溝通,進而確定要將內存指定為多大,或者和開發人員商量如何根據具體業務來指定內存緩存的大小。此外,還要確定業務的重要性,進而決定是否采取負載均衡,分布式緩存集群等架構,最後確定要使用多大的並發連接數等。

對於運維人員,部署Memcached一般就是安裝Memcached服務器端,把服務啟動起來,做好監控,配好開機自啟動,基本就OK了,客戶端的PHP程序環境一般在安裝LNMP環境時都會提前安裝Memcached客戶端插件,Java程序環境下,開發人員會用第三方的JAR包直接連接Memcached服務。

Memcached數據庫緩存