Memcached采用了名為Slab Allocation的機(jī)制分配,管理內(nèi)存。
Slab Allocation的原理相當(dāng)簡(jiǎn)單。將分配的內(nèi)存分割成各種尺寸的塊(chucnk),并把尺寸相同的塊分成組(chucnk的集合)如圖:
而且slab Allocation還有重復(fù)使用已分配內(nèi)存的目的。也就是說,分配到的內(nèi)存不會(huì)釋放,而是重復(fù)利用。Slab Allocation 的主要術(shù)語
Memcached根據(jù)收到的數(shù)據(jù)的大小,選擇最合適數(shù)據(jù)大小的Slab (圖2) memcached中保存著slab內(nèi)空閑chunk的列表,根據(jù)該列表選擇chunk,然后將數(shù)據(jù)緩存于其中。

Memcached內(nèi)部不會(huì)監(jiān)視記錄是否過期,而是在get此條記錄時(shí)查看其時(shí)間戳,檢查記錄是否過期。這種技術(shù)稱為lazy expiration.因此memcached不會(huì)再過期監(jiān)視上耗費(fèi)CPU時(shí)間。
添加新數(shù)據(jù)時(shí),Memcached會(huì)優(yōu)先使用已超時(shí)的記錄空間,如果空間不足,此時(shí)就要使用名為Least Recently Used (LRU最近最少使用)機(jī)制來分配空間。因此當(dāng)memcached的內(nèi)存空間不足時(shí)(無法從slab class)獲取到新空間時(shí),就從最近未使用的記錄中搜索,并將空間分配給新的記錄。
Memcached是通過客戶端來實(shí)現(xiàn)分布式的,以新數(shù)據(jù)(鍵值對(duì))的鍵通過一定的算法選擇一個(gè)服務(wù)器,保存在此服務(wù)器的Memcached中。
例如:
向memcached中添加“tokyo”。將“tokyo”傳給客戶端程序庫后,客戶端實(shí)現(xiàn)的算法就會(huì)根據(jù)“鍵”來決定保存數(shù)據(jù)的memcached服務(wù)器。服務(wù)器選定后,即命令它保存“tokyo”及其值。同樣,“kanagawa”“chiba”“saitama”“gunma”都是先選擇服務(wù)器再保存。接下來獲取保存的數(shù)據(jù)。獲取時(shí)也要將要獲取的鍵“tokyo”傳遞給函數(shù)庫。函數(shù)庫通過與數(shù)據(jù)保存時(shí)相同的算法,根據(jù)“鍵”選擇服務(wù)器。使用的算法相同,就能選中與保存時(shí)相同的服務(wù)器,然后發(fā)送get命令。只要數(shù)據(jù)沒有因?yàn)槟承┰虮粍h除,就能獲得保存的值。
這樣,將不同的鍵保存到不同的服務(wù)器上,就實(shí)現(xiàn)了memcached的分布式。 memcached服務(wù)器增多后,鍵就會(huì)分散,即使一臺(tái)memcached服務(wù)器發(fā)生故障無法連接,也不會(huì)影響其他的緩存,系統(tǒng)依然能繼續(xù)運(yùn)行。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注