一種高并發(fā)和高空間利用率的分布式緩存方法
【專利摘要】本發(fā)明公開了一種高并發(fā)和高空間利用率的分布式緩存方法,包括:1)哈希算法的優(yōu)化;2)頁(yè)面置換算法的優(yōu)化,對(duì)原有LRU置換機(jī)制進(jìn)行改進(jìn)優(yōu)化,將近期最少使用LRU算法基于雙向鏈表的實(shí)現(xiàn)替換為雙向循環(huán)鏈表,并且添加hand指針指向需要置換的數(shù)據(jù);3)判斷Hopscotch哈希算法在并發(fā)改進(jìn)后數(shù)據(jù)是否存在;4)判斷內(nèi)存空間是否充足,如果內(nèi)存空間不足,則進(jìn)行下一步頁(yè)面置換機(jī)制;如果空間足夠,即可存儲(chǔ)數(shù)據(jù),自此,完成高并發(fā)和高空間利用率的分布式緩存。本發(fā)明通過(guò)替換和改進(jìn)緩存管理算法,優(yōu)化鎖機(jī)制,以及改進(jìn)哈希算法,不僅在空間利用率上有所提高,而且提高了并發(fā)訪問(wèn)控制能力,有效地解決因內(nèi)存碎片而造成無(wú)法高效地利用空間的問(wèn)題。
【專利說(shuō)明】一種高并發(fā)和高空間利用率的分布式緩存方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明屬于計(jì)算機(jī)科學(xué)與【技術(shù)領(lǐng)域】,涉及到一種高并發(fā)和高空間利用率的分布式緩存系統(tǒng),是一種基于Memcached系統(tǒng)而提出的提高并發(fā)執(zhí)行效率和空間利用率的方法。
【背景技術(shù)】
[0002]Memcached作為一個(gè)高性能分布式緩存系統(tǒng)在云計(jì)算中得到了廣泛的應(yīng)用,它通過(guò)在內(nèi)存中建立緩存來(lái)減少數(shù)據(jù)訪問(wèn)次數(shù),提高讀寫速度。然而,隨著大規(guī)模云計(jì)算技術(shù)和Web應(yīng)用的快速發(fā)展,數(shù)據(jù)存儲(chǔ)數(shù)量和速度成指數(shù)倍增長(zhǎng),Memcached在空間利用率和并發(fā)執(zhí)行效率上已無(wú)法滿足日益增長(zhǎng)的快速數(shù)據(jù)讀寫需求。因此,對(duì)Memcached的性能優(yōu)化成為目前亟待解決的問(wèn)題。
[0003]Memcached是偏重讀操作的工作負(fù)載情況,如果讀操作沒(méi)有被優(yōu)化,鎖被廣泛引用在查詢路徑中,就需要尋求移除查詢路徑中的所有障礙來(lái)提高M(jìn)emcached并發(fā)訪問(wèn),故提出一種哈希算法替換Memcached原有鏈地址哈希算法提高并發(fā)訪問(wèn)效率。
[0004]Hopscotch哈希表是一組桶。Hopscotch方法關(guān)鍵特征就是在任何給予items桶相鄰?fù)暗母拍睢_@相鄰的特性就是在任一個(gè)相鄰的桶中查找所想要的item的開銷與在本身桶中查找item的開銷相同或者相近。Hopscotch哈希算法將試圖將一個(gè)item放入近鄰點(diǎn),可能是以置換其他items為代價(jià)。Hopscotch哈希算法使用一個(gè)簡(jiǎn)單的哈希函數(shù)h。item散列到一個(gè)條目總是會(huì)在該條目中或者在其相鄰的Η-l個(gè)條目中發(fā)現(xiàn),且H(例如,Η可以是標(biāo)準(zhǔn)機(jī)器字節(jié),為32)是一個(gè)常數(shù)。換句話說(shuō),近鄰點(diǎn)是一個(gè)“虛擬”的桶,是一個(gè)固定大小和相鄰的Η-l個(gè)桶覆蓋的。每個(gè)條目包含一個(gè)跳躍信息字,一個(gè)Η比特的位圖。
[0005]下面是Hopscotch哈希算法如何添加X(jué)記錄使用:從位置i開始,使用線性探測(cè)找在索引j處找到空的條目;如果索引j處的條目為空并且j是在i的的范圍內(nèi),則將X放在j處并且返回;否則,j與i相距很遠(yuǎn),即超過(guò)了 Η的范圍。為了創(chuàng)建一個(gè)接近i的空條目,找到一個(gè)item y其散列值位于i與j之間,但要在j的范圍內(nèi),而且該散列值條目位于j的下面。置換y到索引j得到一個(gè)新的空槽與i接近。重復(fù)上述操作,如果沒(méi)有這樣的item存在,或者表已經(jīng)滿了,則擴(kuò)容和重新散列哈希表。
[0006]Memcached在數(shù)據(jù)刪除方面有效利用資源。數(shù)據(jù)不會(huì)真正從Memcached緩存中刪除,即不會(huì)釋放已經(jīng)分配的內(nèi)存,在記錄過(guò)期時(shí),該記錄對(duì)外是不可見(jiàn)的,而該記錄的位置可以重新插入數(shù)據(jù)。Memcached的廢除機(jī)制是采用惰性廢除方法,CPU不會(huì)監(jiān)視記錄的時(shí)間戳,只是在查詢記錄時(shí)檢查時(shí)間戳,獲取記錄的廢除時(shí)間,從而判斷是否過(guò)期,故Memcached不會(huì)在過(guò)期監(jiān)視上浪費(fèi)CPU時(shí)間。同時(shí)追加新紀(jì)錄空間不足時(shí),采用近期最少使用算法對(duì)新紀(jì)錄進(jìn)行空間分配。嚴(yán)格的LRU算法對(duì)內(nèi)存的管理,能夠確保關(guān)鍵字被安全廢除,同時(shí)也造成了同步的瓶頸,因?yàn)樗芯彺娓卤仨毿蛄谢?;同時(shí)也會(huì)讓一些短期使用的關(guān)鍵字長(zhǎng)期在內(nèi)存中存在,直到關(guān)鍵字到達(dá)LRU鏈表的末端,從而浪費(fèi)內(nèi)存。LRU算法在Memcached系統(tǒng)中是基于雙向鏈表實(shí)現(xiàn)的,但是其插入和讀取記錄時(shí)都需要調(diào)整記錄在LRU表中的位置,而且這兩個(gè)操作在Memcached中卻是上鎖的,這很不利于并發(fā)訪問(wèn),在Memcached偏重讀操作為主的工作負(fù)載情況下,對(duì)于讀取記錄操作過(guò)程中添加鎖機(jī)制是不合理的,所以這也是不利于并發(fā)控制機(jī)制和空間利用率的瓶頸之一。
【發(fā)明內(nèi)容】
[0007]本發(fā)明的目的在于針對(duì)上述已有技術(shù)的不足,提出了一種高并發(fā)和高空間利用率的分布式緩存方法。本發(fā)明通過(guò)替換和改進(jìn)緩存管理算法,優(yōu)化鎖機(jī)制,以及改進(jìn)哈希算法,不僅在空間利用率上有所提高,而且提高了并發(fā)訪問(wèn)控制能力,有效地解決因內(nèi)存碎片而造成無(wú)法高效地利用空間的問(wèn)題。
[0008]為了實(shí)現(xiàn)上述目的,提出一種改進(jìn)的哈希算法提高哈希表的讀寫并發(fā)訪問(wèn)效率,以及提高空間效率的方法,根據(jù)LRU頁(yè)面置換算法在Memcached緩存系統(tǒng)的實(shí)現(xiàn)方式,使得緩存管理的空間效率和并發(fā)更新緩存,本發(fā)明在LRU緩存置換的基礎(chǔ)上實(shí)現(xiàn)了一種可以提高空間效率和改進(jìn)一種哈希算法來(lái)提高并發(fā)控制效率的方法。
[0009]本發(fā)明的技術(shù)方案是這樣實(shí)現(xiàn)的:
[0010]一種高并發(fā)和高空間利用率的分布式緩存方法,該方法包括下述步驟:
[0011]步驟I,哈希算法的優(yōu)化,用Hopscotch hashing構(gòu)建四張哈希表,并對(duì)Hopscotchhashing的哈希數(shù)據(jù)結(jié)構(gòu)進(jìn)行改進(jìn);
[0012]步驟2,頁(yè)面置換算法的優(yōu)化,對(duì)原有LRU置換機(jī)制進(jìn)行改進(jìn)優(yōu)化,將近期最少使用LRU算法基于雙向鏈表的實(shí)現(xiàn)替換為雙向循環(huán)鏈表,并且添加hand指針指向需要置換的數(shù)據(jù);
[0013]步驟3,判斷Hopscotch哈希算法在并發(fā)改進(jìn)后數(shù)據(jù)是否存在,若存在,則進(jìn)入下一步,若不存在,則判斷內(nèi)存空間是否充足;
[0014]步驟4,判斷內(nèi)存空間是否充足,根據(jù)緩存系統(tǒng)的內(nèi)存大小判斷數(shù)據(jù)是否能夠存儲(chǔ),如果內(nèi)存空間不足,則進(jìn)行下一步頁(yè)面置換機(jī)制;如果空間足夠,即可存儲(chǔ)數(shù)據(jù),自此,完成高并發(fā)和高空間利用率的分布式緩存。
[0015]進(jìn)一步地,所述步驟I中,對(duì)Hopscotch hashing的哈希數(shù)據(jù)結(jié)構(gòu)進(jìn)行改進(jìn),包括下述步驟:
[0016]la) Hopscotch哈希算法初始化構(gòu)建四張哈希表,這些哈希表并行排列,通過(guò)二位數(shù)組來(lái)維護(hù)這一哈希表數(shù)據(jù)結(jié)構(gòu);
[0017]Ib)添加記錄時(shí),從O行開始,該記錄通過(guò)哈希函數(shù)得到其在O行的哈希表位置,如果該位置為空,則直接插入該位置;如果不為空,則繼續(xù)探測(cè)下一行相同位置,以此類推;
[0018]Ic)如果到達(dá)第3行,該位置不為空,故在此行再進(jìn)行Hopscotch hashing移位過(guò)程;
[0019]Id)如果第3行的哈希表的位置已滿,則移向上一行,在進(jìn)行Ic)的操作。
[0020]進(jìn)一步地,所述步驟I中,僅允許一次只有一個(gè)寫線程對(duì)一個(gè)哈希表進(jìn)行操作;每次只對(duì)一個(gè)哈希表進(jìn)行線性探測(cè)移位空間。
[0021]進(jìn)一步地,所述步驟2中,對(duì)原有LRU置換機(jī)制進(jìn)行改進(jìn)優(yōu)化,包括以下步驟:
[0022]2a) hand指針在循環(huán)鏈表中指向需要置換的元素;
[0023]2b)更新操作update,在緩存中查詢一個(gè)關(guān)鍵字后,更新該關(guān)鍵字的狀態(tài);
[0024]2c)刪除操作evict,當(dāng)追加新紀(jì)錄時(shí)緩存空間不足,需要選擇移除的關(guān)鍵字。
[0025]進(jìn)一步地,所述步驟3中,判斷Hopscotch哈希算法在并發(fā)改進(jìn)后數(shù)據(jù),執(zhí)行過(guò)程包括:
[0026]3a)從指針?biāo)赶虻漠?dāng)前位置為起點(diǎn),對(duì)循環(huán)隊(duì)列進(jìn)行搜索,搜索A = 0且Μ = 0的第一類頁(yè)面,每次將指向的第一類頁(yè)面作為所選中的淘汰頁(yè),不改變?cè)L問(wèn)位Α在第一次掃描鏈表時(shí);
[0027]3b)如果步驟3a)失敗,即搜索一圈后未遇到一類頁(yè)面,則開始進(jìn)行第二輪掃描,搜索A = 0且Μ = 1的二類頁(yè)面,將每次所遇到的第一個(gè)這類頁(yè)面作為淘汰頁(yè),將所有掃描過(guò)的頁(yè)面的訪問(wèn)位都清零在第二輪掃描時(shí);
[0028]3c)如果第步驟3b)失敗,即沒(méi)有找到二類頁(yè)面,則將指針指向開始的位置,并將所有的訪問(wèn)位清零;然后重復(fù)步驟(3a)?(3b),直至找到被淘汰頁(yè)。
[0029]進(jìn)一步地,所述步驟4中,判斷內(nèi)存空間是否充足,進(jìn)行數(shù)據(jù)存儲(chǔ),包括下述步驟:
[0030]4a) Update函數(shù)在每次關(guān)鍵字訪問(wèn)時(shí)簡(jiǎn)單地將其設(shè)置為1 ;
[0031]4b)Evict依據(jù)hand的指向來(lái)檢查此比特位所處狀態(tài),如果為0,我們則選擇相應(yīng)的key/value對(duì)象進(jìn)行替換;若為1,則將此位重置為0并且將hand在雙向循環(huán)鏈表中向前移動(dòng)直到出現(xiàn)比特位為0。
[0032]本發(fā)明相比于原系統(tǒng)現(xiàn)有技術(shù)具有以下優(yōu)點(diǎn):
[0033]第一,本發(fā)明方案的提出,將LRU置換算法造成的所有緩存更新都必須序列化的同步瓶頸問(wèn)題解決,實(shí)現(xiàn)同步更新,減少了鎖開銷;
[0034]第二,本發(fā)明在緩存管理上減少了內(nèi)存空間開銷,提升了空間效率;
[0035]第三,本發(fā)明使用改進(jìn)后的Hopscotch哈希算法替換開鏈算法,不僅使得Memcached在空間利用率上有所提升,而且解決了哈希表讀寫并發(fā)訪問(wèn)的障礙。
[0036]本發(fā)明適用的環(huán)境在于:Memcached作為一個(gè)高性能分布式緩存系統(tǒng)在Web服務(wù)器和云計(jì)算中得到了廣泛的應(yīng)用,本發(fā)明提出一種高并發(fā)和空間利用率的方法,有效地解決了哈希表讀寫并發(fā)訪問(wèn)的障礙、同步更新的瓶頸、并發(fā)管理緩存以及減少了內(nèi)存開銷問(wèn)題,故應(yīng)用于Memcached中使得云計(jì)算環(huán)境和web服務(wù)器在于緩存管理開銷問(wèn)題很有大改進(jìn),提升了并發(fā)訪問(wèn)效率并且提高了空間利用率。
【專利附圖】
【附圖說(shuō)明】
[0037]圖1為本發(fā)明的整體架構(gòu)圖。
[0038]圖2為本發(fā)明的整體流程圖。
[0039]圖3(A)和圖3(B)分別為本發(fā)明中哈希機(jī)制執(zhí)行流程圖。
[0040]圖4為本發(fā)明中改進(jìn)頁(yè)面置換算法流程圖。
【具體實(shí)施方式】
[0041]下面結(jié)合附圖及實(shí)施例對(duì)本發(fā)明做進(jìn)一步詳細(xì)說(shuō)明。
[0042]參照?qǐng)D1,本發(fā)明在原有的架構(gòu)上改進(jìn)LRU頁(yè)面置換算法結(jié)構(gòu)而得出的現(xiàn)在這個(gè)架構(gòu),主要包含兩個(gè)模塊:頁(yè)面置換機(jī)制模塊和快速查找的哈希機(jī)制。其中:
[0043]哈希機(jī)制可以提供快速的插入操作和查找操作,無(wú)論表中數(shù)據(jù)的大小多少,插入查找操作通過(guò)哈希算法直接定位到關(guān)鍵字的存儲(chǔ)位置,時(shí)間復(fù)雜度為0(1)。
[0044]基于LRU算法提出的高空間效率的頁(yè)面置換機(jī)制,這一模塊主要是為了淘汰過(guò)期記錄,在內(nèi)存空間足夠的情況下,如果沒(méi)有該記錄存在,則直接將該記錄存放在該鏈表中;如果存在了,則更新該記錄的狀態(tài)信息,以便空間不足時(shí)作為替換的依據(jù)。內(nèi)存空間不足的時(shí)候,就要根據(jù)hand所指向的記錄,檢查其狀態(tài)信息,如果不滿足,則將該記錄替換為新追加的記錄,如果滿足,則hand在鏈表中向前移動(dòng)一位,直到出現(xiàn)淘汰頁(yè)為止。
[0045]參照?qǐng)D2,本發(fā)明對(duì)于改進(jìn)LRU頁(yè)面置換算法后的整體流程圖。
[0046]步驟I,哈希算法的優(yōu)化,用Hopscotch hashing構(gòu)建四張哈希表,并對(duì)Hopscotchhashing的哈希數(shù)據(jù)結(jié)構(gòu)進(jìn)行改進(jìn);
[0047]對(duì)記錄進(jìn)行插入或者查找操作開始啟動(dòng),這一步驟主要就是提取出記錄的關(guān)鍵字,該關(guān)鍵字根據(jù)要求得出其目的狀態(tài)信息。
[0048]由于Hopscotch hashing在空間利用率上有著相比于鏈地址哈希算法明顯的優(yōu)勢(shì),但是在并發(fā)性上存在局限,這里我們使用Hopscotch hashing替換開鏈算法,并對(duì)Hopscotch hasing的哈希數(shù)據(jù)結(jié)構(gòu)進(jìn)行改進(jìn),提高空間利用率,解決了哈希表讀寫并發(fā)訪問(wèn)的障礙。
[0049]Hopscotch哈希算法在并發(fā)上會(huì)出現(xiàn)兩個(gè)問(wèn)題:一是死鎖風(fēng)險(xiǎn),二是錯(cuò)誤丟失。解決方法就是將插入操作分割成一系列的原子交換,而不是把整個(gè)哈希路徑鎖起來(lái),為每個(gè)桶添加三個(gè)額外的空間作為溢出哈希表來(lái)存儲(chǔ),在每行哈希表上就可以進(jìn)行線性探測(cè)移出空位,這樣可以避免了這些問(wèn)題。雖然增加哈希表會(huì)產(chǎn)生空間消耗,但是在維持內(nèi)存空間效率的前提下,允許多個(gè)讀線程并發(fā)訪問(wèn)哈希表,為了避免死鎖風(fēng)險(xiǎn),僅允許一次只有一個(gè)寫線程對(duì)一個(gè)哈希表進(jìn)行操作;為了消除錯(cuò)誤丟失,每次只對(duì)一個(gè)哈希表進(jìn)行線性探測(cè)移位空間。
[0050]具體步驟為:
[0051]la) Hopscotch哈希算法初始化構(gòu)建四張哈希表,這些哈希表并行排列,通過(guò)二位數(shù)組來(lái)維護(hù)這一哈希表數(shù)據(jù)結(jié)構(gòu);
[0052]Ib)添加記錄時(shí),從O行開始,該記錄通過(guò)哈希函數(shù)得到其在O行的哈希表位置,如果該位置為空,則直接插入該位置;如果不為空,則繼續(xù)探測(cè)下一行相同位置,以此類推;
[0053]Ic)如果到達(dá)第3行,該位置不為空,故在此行再進(jìn)行Hopscotch hashing移位過(guò)程;
[0054]Id)如果第3行的哈希表的位置已滿,則移向上一行,在進(jìn)行Ic)的操作。
[0055]步驟2,頁(yè)面置換算法的優(yōu)化,對(duì)原有LRU置換機(jī)制進(jìn)行改進(jìn)優(yōu)化,將近期最少使用LRU算法基于雙向鏈表的實(shí)現(xiàn)替換為雙向循環(huán)鏈表,并且添加hand指針指向需要置換的數(shù)據(jù);哈希機(jī)制定位出該記錄的位置。
[0056]Memcached緩存系統(tǒng)是以小對(duì)象為主的存儲(chǔ),通過(guò)這種方法節(jié)省的空間允許緩存有效地存儲(chǔ)更多記錄以增加命中率。同時(shí)該方法必須實(shí)現(xiàn)與置換策略相關(guān)的兩個(gè)函數(shù);
[0057]具體步驟為:
[0058]2a) hand指針在循環(huán)鏈表中指向需要置換的元素,方便檢查元素的狀態(tài),而不用在對(duì)元素進(jìn)行移位操作,對(duì)并發(fā)管理緩存空間有利;
[0059]2b)更新操作update,在緩存中查詢一個(gè)關(guān)鍵字后,更新該關(guān)鍵字的狀態(tài);
[0060]2c)刪除操作evict,當(dāng)追加新紀(jì)錄時(shí)緩存空間不足,需要選擇移除的關(guān)鍵字。
[0061]結(jié)合附圖3對(duì)本發(fā)明哈希機(jī)制的集體步驟描述如下:
[0062]首先白色部分代表著空槽,灰色部分是包含著其他記錄,改進(jìn)Hopscotch hashing機(jī)制對(duì)于添加v到位置6的時(shí)候,可以看到0、1、2和3行該位置6都被占據(jù)著,故此時(shí)我們沒(méi)有相應(yīng)的位置可以添加了,所以我們?cè)诘谌羞M(jìn)行相應(yīng)的Hopscotch hashing調(diào)整哈希表的位置。在圖3(A)中,我們添加記錄v到哈希值6出。線性探測(cè)查到條目13是空的,因?yàn)闂l目13離條目6超過(guò)閾值4,我們需找一個(gè)更近的條目來(lái)交換條目13。第一個(gè)查看的地方是在條目之前3個(gè)條目的距離,就是條目10。該條目的hop信息的位圖顯示在條目11的w可以被移到13.條目11仍然距離條目6比較遠(yuǎn),所以我們檢查條目8。其hop信息位圖顯示在條目9的z可以被移動(dòng)到條目11。最后X被移動(dòng)到條目9的位置。圖3(B)部分顯示了僅在添加v之前表的狀態(tài)。
[0063]查找基本過(guò)程為:根據(jù)記錄的關(guān)鍵字來(lái)找到其對(duì)應(yīng)的桶,如果該桶不存在這樣的關(guān)鍵字,則遍歷下一個(gè)桶鏈表,再進(jìn)行比較;如果存在這樣的關(guān)鍵字,則返回其狀態(tài)信息位置并進(jìn)行步驟4 ;如果沒(méi)有找到,則要進(jìn)行步驟3。
[0064]步驟3,判斷Hopscotch哈希算法在并發(fā)改進(jìn)后數(shù)據(jù)是否存在,若存在,則進(jìn)入下一步,若不存在,則判斷內(nèi)存空間是否充足;
[0065]執(zhí)行過(guò)程包括以下三步:
[0066]3a)從指針?biāo)赶虻漠?dāng)前位置為起點(diǎn),對(duì)循環(huán)隊(duì)列進(jìn)行搜索,搜索A = 0且Μ = 0的第一類頁(yè)面,每次將指向的第一類頁(yè)面作為所選中的淘汰頁(yè),不改變?cè)L問(wèn)位Α在第一次掃描鏈表時(shí);
[0067]3b)如果步驟3a)失敗,即搜索一圈后未遇到一類頁(yè)面,則開始進(jìn)行第二輪掃描,搜索A = 0且Μ = 1的二類頁(yè)面,將每次所遇到的第一個(gè)這類頁(yè)面作為淘汰頁(yè),將所有掃描過(guò)的頁(yè)面的訪問(wèn)位都清零在第二輪掃描時(shí);
[0068]3c)如果第步驟3b)失敗,即沒(méi)有找到二類頁(yè)面,則將指針指向開始的位置,并將所有的訪問(wèn)位清零;然后重復(fù)步驟(3a)?(3b),直至找到被淘汰頁(yè)。
[0069]這個(gè)時(shí)候根據(jù)記錄在哈希表中的情況,判斷出該記錄沒(méi)有在哈希表中存在任何信息,故要進(jìn)行內(nèi)存空間的檢查,如果內(nèi)存空間足夠容納該記錄,則就可以將該記錄存放于Memcached緩存系統(tǒng)中,也就是在哈希表中將該記錄插入其中,而且模擬出的LRU循環(huán)鏈表也保存著其狀態(tài)信息,跳轉(zhuǎn)到步驟5 ;如果內(nèi)存空間不足時(shí),也就意味著要進(jìn)行頁(yè)面置換了,將過(guò)期記錄置換出鏈表中,追加新的記錄到鏈表,并更新其狀態(tài)信息,這一過(guò)程跳轉(zhuǎn)步驟4。
[0070]步驟4,頁(yè)面置換機(jī)制模塊,根據(jù)記錄的狀態(tài)信息和內(nèi)存空間情況,在內(nèi)存空間不足夠的時(shí)候選擇要移除出空間的記錄;內(nèi)存空間充足時(shí),根據(jù)記錄是否包含在鏈表中進(jìn)行插入或更新記錄狀態(tài)信息,具體參見(jiàn)圖4。
[0071 ] 對(duì)于這樣基于LRU算法的實(shí)現(xiàn)提出的方法,在每個(gè)slab類中,我們改進(jìn)雙向鏈表,使它成為一個(gè)循環(huán)緩沖區(qū),即雙向循環(huán)鏈表,和一個(gè)hand指針;在緩沖區(qū)中的每一比特位代表著不同key/value對(duì)象近期狀態(tài)一一1代表近期使用過(guò)和0代表沒(méi)有使用過(guò)。
[0072]具體包括下述步驟:
[0073]4a) Update函數(shù)在每次關(guān)鍵字訪問(wèn)時(shí)簡(jiǎn)單地將其設(shè)置為1 ;
[0074]4b) Evict依據(jù)hand的指向來(lái)檢查此比特位所處狀態(tài)。如果為0,我們則選擇相應(yīng)的key/value對(duì)象進(jìn)行替換;若為I,則將此位重置為O并且將hand在雙向循環(huán)鏈表中向前移動(dòng)直到出現(xiàn)比特位為O。
[0075]這一步驟主要就是為了對(duì)記錄的狀態(tài)信息進(jìn)行更新以及追加新紀(jì)錄,通過(guò)哈希機(jī)制模塊進(jìn)行的操作,改進(jìn)后的頁(yè)面置換算法需要如此做。首先根據(jù)內(nèi)存空間是否足夠來(lái)判斷該進(jìn)行何種操作,如果內(nèi)存空間充足的話,這可以直接追加新紀(jì)錄,并且將該記錄的訪問(wèn)位設(shè)置為1,表示已訪問(wèn),同時(shí)更新其時(shí)間戳,并且結(jié)束這一操作流程;但是如果內(nèi)存空間不足夠容納或者說(shuō)到達(dá)指定容量時(shí),這個(gè)時(shí)候就要選擇一個(gè)記錄移除出內(nèi)存空間,hand指針指向需要替換的元素,如果根據(jù)指向的記錄的訪問(wèn)位以及時(shí)間戳進(jìn)行判斷,如果這個(gè)記錄沒(méi)有訪問(wèn)過(guò)且沒(méi)有超期,則hand指向下一個(gè)記錄,進(jìn)行下一次嘗試;如果已經(jīng)訪問(wèn)過(guò)但是超期了或者沒(méi)有訪問(wèn)過(guò)但是也已經(jīng)超期了,則需要將該記錄替換為新紀(jì)錄,從而進(jìn)行訪問(wèn)位的設(shè)置為I以及將時(shí)間戳更新為當(dāng)下,這樣就可以去除LRU在讀操作鎖機(jī)制的粒度,最后就跳轉(zhuǎn)到步驟5。
[0076]步驟5,就到了整體流程的結(jié)束階段了,對(duì)記錄的插入、查找以及刪除操作就結(jié)束了。
【權(quán)利要求】
1.一種高并發(fā)和高空間利用率的分布式緩存方法,其特征在于,該方法包括下述步驟: 步驟1,哈希算法的優(yōu)化,用Hopscotch hashing構(gòu)建四張哈希表,并對(duì)Hopscotchhashing的哈希數(shù)據(jù)結(jié)構(gòu)進(jìn)行改進(jìn); 步驟2,頁(yè)面置換算法的優(yōu)化,對(duì)原有LRU置換機(jī)制進(jìn)行改進(jìn)優(yōu)化,將近期最少使用LRU算法基于雙向鏈表的實(shí)現(xiàn)替換為雙向循環(huán)鏈表,并且添加hand指針指向需要置換的數(shù)據(jù);步驟3,判斷Hopscotch哈希算法在并發(fā)改進(jìn)后數(shù)據(jù)是否存在,若存在,則進(jìn)入下一步,若不存在,則判斷內(nèi)存空間是否充足; 步驟4,判斷內(nèi)存空間是否充足,根據(jù)緩存系統(tǒng)的內(nèi)存大小判斷數(shù)據(jù)是否能夠存儲(chǔ),如果內(nèi)存空間不足,則進(jìn)行下一步頁(yè)面置換機(jī)制;如果空間足夠,即可存儲(chǔ)數(shù)據(jù),自此,完成高并發(fā)和高空間利用率的分布式緩存。
2.根據(jù)權(quán)利要求1所述的分布式緩存方法,其特征在于,所述步驟1中,對(duì)Hopscotchhashing的哈希數(shù)據(jù)結(jié)構(gòu)進(jìn)行改進(jìn),包括下述步驟: la) Hopscotch哈希算法初始化構(gòu)建四張哈希表,這些哈希表并行排列,通過(guò)二位數(shù)組來(lái)維護(hù)這一哈希表數(shù)據(jù)結(jié)構(gòu); lb)添加記錄時(shí),從0行開始,該記錄通過(guò)哈希函數(shù)得到其在0行的哈希表位置,如果該位置為空,則直接插入該位置;如果不為空,則繼續(xù)探測(cè)下一行相同位置,以此類推; lc)如果到達(dá)第3行,該位置不為空,故在此行再進(jìn)行Hopscotch hashing移位過(guò)程; Id)如果第3行的哈希表的位置已滿,則移向上一行,在進(jìn)行l(wèi)c)的操作。
3.根據(jù)權(quán)利要求1所述的分布式緩存方法,其特征在于,所述步驟1中,僅允許一次只有一個(gè)寫線程對(duì)一個(gè)哈希表進(jìn)行操作;每次只對(duì)一個(gè)哈希表進(jìn)行線性探測(cè)移位空間。
4.根據(jù)權(quán)利要求1所述的分布式緩存方法,其特征在于,所述步驟2中,對(duì)原有LRU置換機(jī)制進(jìn)行改進(jìn)優(yōu)化,包括以下步驟: 2a)hand指針在循環(huán)鏈表中指向需要置換的元素; 2b)更新操作update,在緩存中查詢一個(gè)關(guān)鍵字后,更新該關(guān)鍵字的狀態(tài); 2c)刪除操作evict,當(dāng)追加新紀(jì)錄時(shí)緩存空間不足,需要選擇移除的關(guān)鍵字。
5.根據(jù)權(quán)利要求1所述的分布式緩存方法,其特征在于,所述步驟3中,判斷Hopscotch哈希算法在并發(fā)改進(jìn)后數(shù)據(jù),執(zhí)行過(guò)程包括: 3a)從指針?biāo)赶虻漠?dāng)前位置為起點(diǎn),對(duì)循環(huán)隊(duì)列進(jìn)行搜索,搜索A = 0且Μ = 0的第一類頁(yè)面,每次將指向的第一類頁(yè)面作為所選中的淘汰頁(yè),不改變?cè)L問(wèn)位Α在第一次掃描鏈表時(shí); 3b)如果步驟3a)失敗,即搜索一圈后未遇到一類頁(yè)面,則開始進(jìn)行第二輪掃描,搜索A=0且11=1的二類頁(yè)面,將每次所遇到的第一個(gè)這類頁(yè)面作為淘汰頁(yè),將所有掃描過(guò)的頁(yè)面的訪問(wèn)位都清零在第二輪掃描時(shí); 3c)如果第步驟3b)失敗,即沒(méi)有找到二類頁(yè)面,則將指針指向開始的位置,并將所有的訪問(wèn)位清零;然后重復(fù)步驟(3a)?(3b),直至找到被淘汰頁(yè)。
6.根據(jù)權(quán)利要求1所述的分布式緩存方法,其特征在于,所述步驟4中,判斷內(nèi)存空間是否充足,進(jìn)行數(shù)據(jù)存儲(chǔ),包括下述步驟: 4a) Update函數(shù)在每次關(guān)鍵字訪問(wèn)時(shí)簡(jiǎn)單地將其設(shè)置為1 ; 4b)Evict依據(jù)hand的指向來(lái)檢查此比特位所處狀態(tài),如果為0,我們則選擇相應(yīng)的key/value對(duì)象進(jìn)行替換;若為1,則將此位重置為0并且將hand在雙向循環(huán)鏈表中向前移動(dòng)直到出現(xiàn)比特位為0。
【文檔編號(hào)】G06F17/30GK104504076SQ201410811138
【公開日】2015年4月8日 申請(qǐng)日期:2014年12月22日 優(yōu)先權(quán)日:2014年12月22日
【發(fā)明者】馬建峰, 沈偉, 李金庫(kù), 盧笛, 沈玉龍 申請(qǐng)人:西安電子科技大學(xué)