99热99这里只有精品6国产,亚洲中文字幕在线天天更新,在线观看亚洲精品国产福利片 ,久久久久综合网

歡迎加入QQ討論群258996829
麥子學(xué)院 頭像
蘋果6袋
6
麥子學(xué)院

MemCache實(shí)現(xiàn)的原理是什么

發(fā)布時(shí)間:2016-08-20 22:34  回復(fù):0  查看:2150   最后回復(fù):2016-08-20 22:34  

想要深入學(xué)習(xí)MemCache,首先要了解MemCache實(shí)現(xiàn)原理。在這里,我們首先要說明一點(diǎn),MemCache的數(shù)據(jù)存放在內(nèi)存中,存放在內(nèi)存中個(gè)人認(rèn)為意味著幾點(diǎn):

1、訪問數(shù)據(jù)的速度比傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)要快,因?yàn)镺racle、MySQL這些傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)為了保持?jǐn)?shù)據(jù)的持久性,數(shù)據(jù)存放在硬盤中,IO操作速度慢

2、MemCache的數(shù)據(jù)存放在內(nèi)存中同時(shí)意味著只要MemCache重啟了,數(shù)據(jù)就會(huì)消失

3、既然MemCache的數(shù)據(jù)存放在內(nèi)存中,那么勢(shì)必受到機(jī)器位數(shù)的限制,這個(gè)之前的文章寫過很多次了,32位機(jī)器最多只能使用2GB的內(nèi)存空間,64位機(jī)器可以認(rèn)為沒有上限

然后我們來看一下MemCache的原理,MemCache最重要的莫不是內(nèi)存分配的內(nèi)容了,MemCache采用的內(nèi)存分配方式是固定空間分配。

涉及了slab_class、slab、page、chunk四個(gè)概念,它們之間的關(guān)系是:

1、MemCache將內(nèi)存空間分為一組slab

2、每個(gè)slab下又有若干個(gè)page,每個(gè)page默認(rèn)是1M,如果一個(gè)slab占用100M內(nèi)存的話,那么這個(gè)slab下應(yīng)該有100個(gè)page

3、每個(gè)page里面包含一組chunk,chunk是真正存放數(shù)據(jù)的地方,同一個(gè)slab里面的chunk的大小是固定的

4、有相同大小chunk的slab被組織在一起,稱為slab_class

MemCache內(nèi)存分配的方式稱為allocator,slab的數(shù)量是有限的,幾個(gè)、十幾個(gè)或者幾十個(gè),這個(gè)和啟動(dòng)參數(shù)的配置相關(guān)。

MemCache中的value過來存放的地方是由value的大小決定的,value總是會(huì)被存放到與chunk大小最接近的一個(gè)slab中,比如slab[1]的chunk大小為80字節(jié)、slab[2]的chunk大小為100字節(jié)、slab[3]的chunk大小為128字節(jié)(相鄰slab內(nèi)的chunk基本以1.25為比例進(jìn)行增長(zhǎng),MemCache啟動(dòng)時(shí)可以用-f指定這個(gè)比例),那么過來一個(gè)88字節(jié)的value,這個(gè)value將被放到2號(hào)slab中。放slab的時(shí)候,首先slab要申請(qǐng)內(nèi)存,申請(qǐng)內(nèi)存是以page為單位的,所以在放入第一個(gè)數(shù)據(jù)的時(shí)候,無論大小為多少,都會(huì)有1M大小的page被分配給該slab。申請(qǐng)到page后,slab會(huì)將這個(gè)page的內(nèi)存按chunk的大小進(jìn)行切分,這樣就變成了一個(gè)chunk數(shù)組,最后從這個(gè)chunk數(shù)組中選擇一個(gè)用于存儲(chǔ)數(shù)據(jù)。

如果這個(gè)slab中沒有chunk可以分配了怎么辦,如果MemCache啟動(dòng)沒有追加-M(禁止LRU,這種情況下內(nèi)存不夠會(huì)報(bào)Out Of Memory錯(cuò)誤),那么MemCache會(huì)把這個(gè)slab中最近最少使用的chunk中的數(shù)據(jù)清理掉,然后放上最新的數(shù)據(jù)。針對(duì)MemCache的內(nèi)存分配及回收算法,總結(jié)三點(diǎn):

1、MemCache的內(nèi)存分配chunk里面會(huì)有內(nèi)存浪費(fèi),88字節(jié)的value分配在128字節(jié)(緊接著大的用)的chunk中,就損失了30字節(jié),但是這也避免了管理內(nèi)存碎片的問題

2、MemCache的LRU算法不是針對(duì)全局的,是針對(duì)slab的

3、應(yīng)該可以理解為什么MemCache存放的value大小是限制的,因?yàn)橐粋€(gè)新數(shù)據(jù)過來,slab會(huì)先以page為單位申請(qǐng)一塊內(nèi)存,申請(qǐng)的內(nèi)存最多就只有1M,所以value大小自然不能大于1M了


 

文章來自:五月的倉(cāng)頡

您還未登錄,請(qǐng)先登錄

熱門帖子

最新帖子

?