PHP核心技術(shù)與技術(shù)實(shí)踐---緩存詳解--Memcached

9.1 Memcached

?????? 9.2 Memcached的安裝及使用

????????????? 1、Memcached特點(diǎn):

???????????????????? 1、協(xié)議簡(jiǎn)單

???????????????????? 2、基于libevent的事件處理

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

???????????????????? 4、采用不互相通信的分布式

???????????????????? 5、把數(shù)據(jù)存儲(chǔ)在內(nèi)存中,只用重啟Mencached或者OS的話,數(shù)據(jù)都會(huì)丟失

???????????????????? 6、當(dāng)內(nèi)存中數(shù)據(jù)滿(mǎn)了,會(huì)采用LRU算法自動(dòng)刪除一些緩存

????????????? 2、memcached安裝使用:找對(duì)版本就可以了

????????????? 3、使用Memcached加速web應(yīng)用

???????????????????? 1、從數(shù)據(jù)庫(kù)中select出來(lái)數(shù)據(jù)

???????????????????? 2、把數(shù)據(jù)存到memcached中

?????? 9.3 深入了解memcached

????????????? 1、memcached如何支持高并發(fā):memcached利用IO多路復(fù)用模型實(shí)現(xiàn)高并發(fā)。(消息通知模式,用戶(hù)做好準(zhǔn)備后,系統(tǒng)會(huì)通知可以進(jìn)行IO操作,這樣就不會(huì)阻塞了)

????????????? 2、開(kāi)啟memcached設(shè)置線程數(shù)時(shí),一般設(shè)置為cpu的核數(shù)(線層調(diào)度)

????????????? 3、使用Slab分配算法保存數(shù)據(jù):該分配算法限制了一個(gè)slab頁(yè)只能為1M,但是該算法也可以減少內(nèi)存碎片的產(chǎn)生。

????????????? 4、Slab算法把1M大小的內(nèi)存稱(chēng)為一個(gè)slab頁(yè),然后通過(guò)分割算法把這個(gè)slab頁(yè)分為若干個(gè)小塊chunk,然后把chunk分配給用戶(hù)。

????????????? 5、Memcached向Slab層申請(qǐng)內(nèi)存存儲(chǔ)數(shù)據(jù)的時(shí)候,先調(diào)用一個(gè)slabs_clsid(size)函數(shù),根據(jù)size的大小找到一個(gè)適合的空閑的chunk,便把一個(gè)合適的chunk分配給Memcached用,分配工作由do_slabs_alloc()函數(shù)完成,該函數(shù)會(huì)先從slots(被回收的chunk快列表)中獲取可用的chunk塊,否則就從空閑的chunk快列表中獲取并返回。

????????????? 6、使用LRU算法淘汰數(shù)據(jù):當(dāng)申請(qǐng)內(nèi)存失敗時(shí),就開(kāi)始淘汰數(shù)據(jù),淘汰的步驟:從數(shù)據(jù)項(xiàng)列表的尾部開(kāi)始遍歷,釋放掉引用計(jì)數(shù)器為0 的item,(為什么要從尾部開(kāi)始遍歷呢?因?yàn)閙emcached會(huì)把剛剛訪問(wèn)過(guò)的數(shù)據(jù)項(xiàng)放到數(shù)據(jù)列表的最前面。這也是LRU的精髓)如果找不到為0的item,就找3個(gè)小時(shí)未被訪問(wèn)的item,如果還是找不到,就返回null? ,申請(qǐng)內(nèi)存失敗。

????????????? 7、Memcached多線程模型:Memcached是一個(gè)多線程的緩存服務(wù)器程序,可以分為:主線程和工作線程。

????????????? 8、主線程用來(lái)接收客戶(hù)端的連接信息,并把連接分配給工作線程。主線程監(jiān)聽(tīng)客戶(hù)端的連接,當(dāng)有連接的時(shí)候,會(huì)調(diào)用accept函數(shù)接受新的連接,并利用函數(shù)dispatch_conn_new()把該鏈接push到工作線程的CQ隊(duì)列中,并向工作線程發(fā)送一個(gè)信號(hào),通知工作線程有一個(gè)連接需要處理。

????????????? 9、工作線程處理客戶(hù)端連接的請(qǐng)求,當(dāng)工作線程收到主線程的信號(hào)后,會(huì)把CQ隊(duì)列上的客戶(hù)端注冊(cè)到libevent進(jìn)行偵聽(tīng)客戶(hù)端的讀寫(xiě)事件,并調(diào)用回調(diào)函數(shù)drive_machine進(jìn)行處理。

????9.4 Memcached分布式配置方案

????????????? 1、兩種分布:普通的Hash分布、一致性Hash分布

????????????? 2、普通Hash分布就是通過(guò)key轉(zhuǎn)換為整數(shù)后,利用這個(gè)整數(shù)與Memcached服務(wù)器取模,這樣就可以得到一個(gè)服務(wù)器的信息。但是對(duì)于突然增加一臺(tái)memcached服務(wù)器的時(shí)候,取模就會(huì)發(fā)生偏差,這樣就會(huì)導(dǎo)致丟失數(shù)據(jù),一致性Hahs分布就產(chǎn)生了。但是對(duì)于Mem服務(wù)器數(shù)量穩(wěn)定的時(shí)候,使用普通Hash就可以了

????????????? 3、一致性Hash分布分為6個(gè)步驟:

???????????????????? 1、將一個(gè)32位整數(shù)想象成一個(gè)環(huán)

???????????????????? 2、通過(guò)hash函數(shù)把key處理成整數(shù)(mhash函數(shù))

? ??????????? ?????? 3、把Memcached群服務(wù)器映射到環(huán)上,使用hash函數(shù)處理IP

???????????????????? 4、把數(shù)據(jù)映射到服務(wù)器上,沿著圓環(huán)順時(shí)針?lè)较?,?shù)據(jù)碰到ip后,就存儲(chǔ)在這個(gè)ip上

???????????????????? 5、移除服務(wù)器,變動(dòng)的只有該服務(wù)器與鄰近服務(wù)器之間的數(shù)據(jù)

???????????????????? 6、添加服務(wù)器,添加的位置和相鄰服務(wù)器之間的數(shù)據(jù)重新映射。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容