Memcache存儲(chǔ)機(jī)制與指令匯總-創(chuàng)新互聯(lián)

1、memcache基本簡介

創(chuàng)新互聯(lián)公司長期為1000多家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺(tái),與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為井岡山企業(yè)提供專業(yè)的成都網(wǎng)站設(shè)計(jì)、做網(wǎng)站,井岡山網(wǎng)站改版等技術(shù)服務(wù)。擁有十余年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。

memcached是高性能的分布式內(nèi)存緩存服務(wù)器。一般的使用目的是,通過緩存數(shù)據(jù)庫查詢結(jié)果,減少數(shù)據(jù)庫訪問次數(shù),以提高動(dòng)態(tài)Web應(yīng)用的速度、提高可擴(kuò)展性。

Memcache的運(yùn)行圖:

Memcache存儲(chǔ)機(jī)制與指令匯總

Memcache的特征

memcached作為高速運(yùn)行的分布式緩存服務(wù)器,具有以下的特點(diǎn)。

1、基于C/S架構(gòu)協(xié)議簡單

memcached的服務(wù)器客戶端通信并不使用復(fù)雜的XML等格式,而使用簡單的基于文本行的協(xié)議。 因此,通過telnet也能在memcached上保存數(shù)據(jù)、取得數(shù)據(jù)。

2、基于libevent的事件處理

libevent是個(gè)程序庫,它將Linux的epoll、BSD類操作系統(tǒng)的kqueue等事件處理功能封裝成統(tǒng)一的接口。即使對(duì)服務(wù)器的連接數(shù)增加,也能發(fā)揮O(1)的性能。memcached使用這個(gè)libevent庫,因此 能在Linux、BSD、Solaris等操作系統(tǒng)上發(fā)揮其高性能。

3、內(nèi)置內(nèi)存存儲(chǔ)方式

為了提高性能,memcached中保存的數(shù)據(jù)都存儲(chǔ)在memcached內(nèi)置的內(nèi)存存儲(chǔ)空間中。由于數(shù)據(jù)僅存在于內(nèi)存中,因此重啟memcached、重啟操作系統(tǒng)會(huì)導(dǎo)致全部數(shù)據(jù)消失。另外,內(nèi)容容量達(dá)到指值之后,就基于LRU(Least Recently Used)算法自動(dòng)刪除不使用的緩存。memcached本身是為緩存 而設(shè)計(jì)的服務(wù)器,因此并沒有過多考慮數(shù)據(jù)的永久性問題。

4、memcached不互相通信的分布式

memcached盡管是“分布式”緩存服務(wù)器,但服務(wù)器端并沒有分布式功能。各個(gè)memcached不會(huì)互 相通信以共享信息。那么,怎樣進(jìn)行分布式呢?這完全取決于客戶端的實(shí)現(xiàn)。(如下圖所示)

Memcache存儲(chǔ)機(jī)制與指令匯總

回到頂部

2、理解memcache的內(nèi)存存儲(chǔ)

回到頂部

  2.1、存儲(chǔ)機(jī)制

Memcache采用的是Slab Allocator方式進(jìn)行存儲(chǔ)數(shù)據(jù)。這一機(jī)制可以很好的整理內(nèi)存,以便重復(fù)利用,從而解決了內(nèi)存碎片的問題。在該機(jī)制出現(xiàn)以前,內(nèi)存的分配是通過對(duì)所有記錄簡單地進(jìn)行malloc和free來進(jìn)行的。但是,這種方式會(huì)導(dǎo)致內(nèi)存碎片,加重操作系統(tǒng)內(nèi)存管理器的負(fù)擔(dān),最壞的情況下,會(huì)導(dǎo)致操作系統(tǒng)比memcached進(jìn)程本身還慢。

 2.2、Slab Allocator基本原理

1、按照預(yù)先規(guī)定的大小,將分配的內(nèi)存以page(默認(rèn)每個(gè)page為1M)為單位分為特定的塊(chunk),并且把相同大小的chunk分成組(chunk的集合);

2、存儲(chǔ)數(shù)據(jù)時(shí),將會(huì)尋找與value大小相近的chunk區(qū)域進(jìn)行存儲(chǔ);

3、內(nèi)存一旦以page的形式分配出去,在重啟前不會(huì)被回收或者重新分配,以解決內(nèi)存碎片問題。(分配的內(nèi)存不會(huì)釋放,而是重復(fù)利用)

回到頂部

  2.3、理解四個(gè)名詞

【可參考下面的形象解析圖進(jìn)行理解】

Slab

用于表示存儲(chǔ)的大size數(shù)據(jù),僅僅只是用于定義(通俗的講就是表示可以存儲(chǔ)數(shù)據(jù)大小的范圍)。默認(rèn)情況下,前后兩個(gè)slab表示存儲(chǔ)的size以1.25倍進(jìn)行增長。例如slab1為96字節(jié),slab2為120字節(jié)

Page

分配給Slab的內(nèi)存空間,默認(rèn)為1MB。分給Slab后將會(huì)根據(jù)slab的大小切割成chunk

Chunk

用于緩存記錄的內(nèi)存空間

Slab calss

特定大小的Chunk集合

回到頂部

  2.4、Slab的內(nèi)存分配具體過程

Memcached在啟動(dòng)時(shí)通過-m參數(shù)指定大使用內(nèi)存,但是這個(gè)不會(huì)一啟動(dòng)就占用完,而是逐步分配給各slab的。如果一個(gè)新的數(shù)據(jù)要被存放,首先選擇一個(gè)合適的slab,然后查看該slab是否還有空閑的chunk,如果有則直接存放進(jìn)去;如果沒有則要進(jìn)行申請(qǐng),slab申請(qǐng)內(nèi)存時(shí)以page為單位,無論大小為多少,都會(huì)有1M大小的page被分配給該slab(該page不會(huì)被回收或者重新分配,永遠(yuǎn)都屬于該slab)。申請(qǐng)到page后,slab會(huì)將這個(gè)page的內(nèi)存按chunk的大小進(jìn)行切分,這樣就變成了一個(gè)chunk的數(shù)組,再從這個(gè)chunk數(shù)組中選擇一個(gè)用于存儲(chǔ)數(shù)據(jù)。若沒有空閑的page的時(shí)候,則會(huì)對(duì)改slab進(jìn)行LRU,而不是對(duì)整個(gè)memcache進(jìn)行LRU。

形象解析圖:(這圖湊合湊合就好了哈,不是很專業(yè)2333

 Memcache存儲(chǔ)機(jī)制與指令匯總

回到頂部

  2.5、Memcache存儲(chǔ)具體過程

Memcached并不是將所有大小的數(shù)據(jù)都放在一起的,而是預(yù)先將數(shù)據(jù)空間劃分為一系列slabs,每個(gè)slab只負(fù)責(zé)一定范圍內(nèi)的數(shù)據(jù)存儲(chǔ)。memcached根據(jù)收到的數(shù)據(jù)的大小,選擇最適合數(shù)據(jù)大小的slab。假若這個(gè)slab仍有空閑chunk的列表,根據(jù)該列表選擇chunk,然后將數(shù)據(jù)緩存于其中;若無則申請(qǐng)page(1M)【可以參考上面我畫的形象圖23333】

具體分析:從上面我們了解到slab的作用。Slab的增長因子默認(rèn)以1.25倍進(jìn)行增長。那為什么會(huì)導(dǎo)致有些不是1.25倍呢?答案是受小數(shù)的影響,你可以使用-f int測(cè)試個(gè)整數(shù)增長因子看看效果?!竞竺婢唧w講解】

以下圖進(jìn)行分析,例如slab中112字節(jié),表示可以存儲(chǔ)大于88字節(jié)且小于或等于112字節(jié)的value。

Memcache存儲(chǔ)機(jī)制與指令匯總

回到頂部

  2.6Slab Allocator缺點(diǎn)

Slab Allocator解決了當(dāng)初的內(nèi)存碎片問題,但新的機(jī)制也給memcached帶來了新的問題。

這個(gè)問題就是,由于分配的是特定長度的內(nèi)存,因此無法有效利用分配的內(nèi)存。例如,將100字節(jié) 的數(shù)據(jù)緩存到128字節(jié)的chunk中,剩余的28字節(jié)就浪費(fèi)了(如下圖所示)。

 Memcache存儲(chǔ)機(jī)制與指令匯總

回到頂部

  2.7、使用-f增長因子進(jìn)行調(diào)優(yōu)

增長因子就是相鄰兩個(gè)chunk之間的增長倍數(shù)。這個(gè)參數(shù)memcache默認(rèn)是1.25,但是我們先采用整數(shù)2來測(cè)試一下,看看效果。

Memcache存儲(chǔ)機(jī)制與指令匯總

由圖中我們可以看到chunk size的增長是2倍的。

我們?cè)賮砜纯?f 1.25的效果

Memcache存儲(chǔ)機(jī)制與指令匯總

為什么1.25倍增長因子就不能保證全部相鄰的chunk size是1.25倍增長呢?

因?yàn)檫@些誤差是為了保持字節(jié)數(shù)的對(duì)齊而故意設(shè)置的。

兩圖一對(duì)比,可見,因子為1.25組間差距比因子為2時(shí)小得多,更適合緩存幾百字節(jié)的記錄。

因此,使用memcached時(shí),最好是重新計(jì)算一下數(shù)據(jù)的預(yù)期平均長度,調(diào)整growth factor,以獲得最恰當(dāng)?shù)脑O(shè)置。

回到頂部

3、memcache刪除機(jī)制

從上面我們知道,已經(jīng)分配出去的內(nèi)存是不會(huì)被釋放回收的,記錄超時(shí)后,客戶端就無法看到該記錄,其存儲(chǔ)空間即可重復(fù)使用。

回到頂部

  3.1、Lazy Expiration

memcached內(nèi)部不會(huì)監(jiān)視記錄是否過期,而是在get時(shí)查看記錄的時(shí)間戳,檢查記錄是否過期。這種技術(shù)被稱為lazy(惰性)expiration。因此,memcached不會(huì)在過期監(jiān)視上耗費(fèi)CPU時(shí)間。

回到頂部

  3.2、LRU刪除

memcached會(huì)優(yōu)先使用已超時(shí)的記錄的空間,但即使如此,也會(huì)發(fā)生追加新記錄時(shí)空間不足的情況, 此時(shí)就要使用名為Least Recently Used(LRU)機(jī)制來分配空間。顧名思義,這是刪除“最近最少 使用”的記錄的機(jī)制。因此,當(dāng)memcached的內(nèi)存空間不足時(shí)(無法從slab class獲取到新的空間時(shí)),就從最近未被使用的記錄中搜索,并將其空間分配給新的記錄。從緩存的實(shí)用角度來看,該模型十分理想。

不過,有些情況下LRU機(jī)制反倒會(huì)造成麻煩。memcached啟動(dòng)時(shí)通過“-M”參數(shù)可以禁止LRU。

Memcache存儲(chǔ)機(jī)制與指令匯總

啟動(dòng)時(shí)必須注意的是,小寫的“-m”選項(xiàng)是用來指定大內(nèi)存大小的。不指定具體數(shù)值則使用默認(rèn) 值64MB。

指定“-M”參數(shù)啟動(dòng)后,內(nèi)存用盡時(shí)memcached會(huì)返回錯(cuò)誤。話說回來,memcached畢竟不是存儲(chǔ)器,而是緩存,所以推薦使用LRU。

回到頂部

4、啟動(dòng)memcache參數(shù)

【黑體字的參數(shù)較為常用】

-p<num>

監(jiān)聽的TCP端口(默認(rèn):11211)

-U<num>

UDP監(jiān)聽端口(默認(rèn):11211 0關(guān)閉)

-d

以守護(hù)進(jìn)程方式運(yùn)行

-u<username>

指定用戶運(yùn)行

-m<num>.

大內(nèi)存使用,單位MB。默認(rèn)64MB

-c<num>

大同時(shí)連接數(shù),默認(rèn)是1024

-v

輸出警告和錯(cuò)誤消息

-vv

打印客戶端的請(qǐng)求和返回信息

-h

幫助信息

-l<ip>

綁定地址(默認(rèn)任何ip地址都可以訪問)

-P<file>

將PID保存在file文件

-i

打印memcached和libevent版權(quán)信息

-M

禁止LRU策略,內(nèi)存耗盡時(shí)返回錯(cuò)誤

-f<factor>

增長因子,默認(rèn)1.25

-n<bytes>

初始chunk=key+suffix+value+32結(jié)構(gòu)體,默認(rèn)48字節(jié)

-L

啟用大內(nèi)存頁,可以降低內(nèi)存浪費(fèi),改進(jìn)性能

-l

調(diào)整分配slab頁的大小,默認(rèn)1M,最小1k到128M

-t<num>

線程數(shù),默認(rèn)4。由于memcached采用NIO,所以更多線程沒有太多作用

-R

每個(gè)event連接大并發(fā)數(shù),默認(rèn)20

-C

禁用CAS命令(可以禁止版本計(jì)數(shù),減少開銷)

-b

Set the backlog queue limit (default: 1024)

-B

Binding protocol-one of ascii, binary or auto (default)

-s<file>

UNIX socket

-a<mask>

access mask for UNIX socket, in octal (default: 0700)

回到頂部

5、Memcache指令匯總

指令

描述

例子

get key

#返回對(duì)應(yīng)的value

get mykey

set key 標(biāo)識(shí)符 有效時(shí)間 長度

key不存在添加,存在更新

set mykey 0 60 5

add key標(biāo)識(shí)符 有效時(shí)間 長度

#添加key-value值,返回stored/not_stored

add mykey 0 60 5

replace key標(biāo)識(shí)符 有效時(shí)間 長度

#替換key中的value,key存在成功返回stored,key不存在失敗返回not_stored

replace mykey 0 60 5

append key標(biāo)識(shí)符 有效時(shí)間 長度

#追加key中的value值,成功返回stored,失敗返回not_stored

append mykey 0 60 5

prepend key標(biāo)識(shí)符 有效時(shí)間 長度

#前置追加key中的value值,成功返回stored,失敗返回not_stored

prepend mykey 0 60 5

incr key num

#給key中的value增加num。若key中不是數(shù)字,則將使用num替換value值。返回增加后的value

Incre mykey 1

decr

#同上

同上

delete key [key2…]

刪除一個(gè)或者多個(gè)key-value。成功刪除返回deleted,不存在失敗則返回not_found

delete mykey

flush_all [timeount]

#清除所有[timeout時(shí)間內(nèi)的]鍵值,但不會(huì)刪除items,所以memcache依舊占用內(nèi)存

flush_all 20

version

#返回版本號(hào)

version

verbosity

#日志級(jí)別

verbosity

quit

#關(guān)閉連接

quit

stats

#返回Memcache通用統(tǒng)計(jì)信息

stats

stats slabs

#返回Memcache運(yùn)行期間創(chuàng)建的每個(gè)slab的信息

stats slabs

stats items

#返回各個(gè)slab中item的個(gè)數(shù),和最老的item秒數(shù)

stats items

stats malloc

#顯示內(nèi)存分配數(shù)據(jù)

stats malloc

stats detail [on|off|dump]

#on:打開詳細(xì)操作記錄、off:關(guān)閉詳細(xì)操作記錄、dump顯示詳細(xì)操作記錄(每一個(gè)鍵的get、set、hit、del的次數(shù))

stats detail on

stats detail off

stats detail dump

stats cachedump slab_id limit_num

#顯示slab_id中前l(fā)imit_num個(gè)key

stats cachedump 1 2

stats reset

#清空統(tǒng)計(jì)數(shù)據(jù)

stats reset

stats settings

#查看配置設(shè)置

stats settings

stats sizes

#展示了固定chunk大小中的items的數(shù)量

Stats sizes

注意:標(biāo)識(shí)符:一個(gè)十六進(jìn)制無符號(hào)的整數(shù)(以十進(jìn)制來表示),需和數(shù)據(jù)一起存儲(chǔ),get的時(shí)候一起返回

ps:最近老是思考以后的方向,感覺有點(diǎn)迷茫,都不能好好學(xué)習(xí)了。要盡快調(diào)整好心態(tài),切勿浮躁,欲速則不達(dá)。

參考資料:

1、Memcached原理與使用詳解           作者:heiyeluren(黑夜路人)

http://blog.csdn.net/heiyeshuwu

2 、memcached 全面剖析              作者:長野雅廣、前坂徹  charlee 譯

3、Memcache 內(nèi)存分配策略和性能(使用)狀態(tài)檢查  作者:jyzhou

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

當(dāng)前標(biāo)題:Memcache存儲(chǔ)機(jī)制與指令匯總-創(chuàng)新互聯(lián)
瀏覽地址:http://muchs.cn/article44/cedshe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站導(dǎo)航、網(wǎng)站內(nèi)鏈、做網(wǎng)站、建站公司搜索引擎優(yōu)化、服務(wù)器托管

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)