一種基于磁盤的對象緩存方法
【專利摘要】本發(fā)明涉及磁盤緩存【技術領域】,具體涉及一種基于磁盤的對象緩存方法。本發(fā)明的一種,包括:劃分文件存儲空間,構建二級索引的文件存儲結構,并依據(jù)二級索引的文件存儲結構實現(xiàn)該往磁盤緩存中添加對象過程、從磁盤緩存中獲取緩存對象過程、從磁盤緩存中刪除緩存對象過程、緩存失效機制和緩存優(yōu)化整理過程,本發(fā)明通過本發(fā)明通過固定大小的文件塊來存儲對象的數(shù)據(jù),將多個小對象合并存儲在一個文件塊中,將大對象分拆成多個對象分塊(ObjectBlock)分別存儲在多個文件塊(Chunk)中,能夠實現(xiàn)任意大小和任意類型的對象的緩存,緩存效率更高。
【專利說明】一種基于磁盤的對象緩存方法
【技術領域】
[0001]本發(fā)明涉及磁盤緩存【技術領域】,具體涉及一種基于磁盤的對象緩存方法。
【背景技術】
[0002]在現(xiàn)代軟件開發(fā)的過程中,緩存的使用對系統(tǒng)性能的提升起到相當關鍵的作用。在通常情況下,使用的最多的是內(nèi)存緩存,即將緩存對象存儲到內(nèi)存中,便于快速的讀取。但是,內(nèi)存緩存的存儲空間有限,即使是分布式內(nèi)存緩存,能夠提供的內(nèi)存存儲空間也是有限的,當需要緩存大量的大對象(如圖片、音頻、視頻以及其他大對象等)時,內(nèi)存緩存就顯得不太合適,而基于磁盤的緩存能夠很好的滿足大對象的存儲需求。在基于磁盤的緩存實現(xiàn)中,如果是直接將每個待緩存的對象作為單獨文件存儲在磁盤中,如果緩存對象數(shù)量眾多,就會在磁盤中產(chǎn)生大量的問題,這樣會大大降低磁盤的讀寫效率。而緩存對象通常都有一定的生命周期,會根據(jù)不同的策略失效,此時,磁盤文件就會頻繁的增加和刪除,導致大量磁盤碎片產(chǎn)生,從而進一步降低磁盤讀寫效率。
【發(fā)明內(nèi)容】
[0003]解決上述技術問題,本發(fā)明提供了本發(fā)明提供了一種基于磁盤的對象緩存方法,能夠實現(xiàn)任意大小的對象緩存(如圖片、音頻、視頻以及其他任意對象),通過優(yōu)化的數(shù)據(jù)存儲結構來實現(xiàn)對象的快速寫入和存取,同時,還能夠解決大量文件的頻繁存取所導致的磁盤碎片問題,從而實現(xiàn)磁盤的空間的高效利用。
[0004]為了達到上述目的,本發(fā)明所采用的技術方案是,一種基于磁盤的對象緩存方法,包括:劃分文件存儲空間,構建二級索引的文件存儲結構,該文件存儲結構由一個一級索引
文件1.1dx、一個二級索引文件2.1dx、以及一至多個文件塊N1.dat (i=l, 2,3,......η, η為
正整數(shù))組成,每一文件塊N1.dat劃分為一至多個數(shù)據(jù)槽Si (i=l,2,3,……n,n為正整數(shù)),該每一數(shù)據(jù)槽Si的大小為2n KB,其中η為正整數(shù),且該數(shù)據(jù)槽Si大小<文件塊N1.dat大小,所述一級索引文件1.1dx用于存放一級索引項,一個二級索引文件2.1dx用于存放二級索引項;每一個數(shù)據(jù)槽在二級索引文件中存在一個二級索引項與之對應,該二級索引項記錄該數(shù)據(jù)槽在哪一個文件塊中,以及在文件塊中的位置、大小、使用情況等信息。
[0005]往磁盤緩存中添加對象過程:根據(jù)對象的主鍵K設置一級索引項的對象主鍵ObjKey,根據(jù)文件塊的設定容量將對象進行分割,形成一個或多個對象分塊,每一對象分塊大小<文件塊大小,將一個或多個對象分塊存儲到一至多個文件塊的數(shù)據(jù)槽Si中,所述一級索引項記錄第一個對象分塊所在的數(shù)據(jù)槽SI的二級索引項在二級索引文件的位置,該數(shù)據(jù)槽SI對應的二級索引項又記錄下一個對象分塊所在的數(shù)據(jù)槽S2的二級索引項在二級索引文件的位置,依次類推,數(shù)據(jù)槽Si對應的二級索引項又記錄下一個對象分塊所在的數(shù)據(jù)槽Si+Ι的二級索引項在二級索引文件2.1dx的位置;
從磁盤緩存中獲取緩存對象過程:掃描一級索引文件1.1dx,查找到對象主鍵ObjKey與對象主鍵K 一致的一級索引項,該一級索引項記錄了該對象的第一個對象分塊所在的數(shù)據(jù)槽SI的二級索引項在二級索引文件2.1dx的位置,從二級索引文件中獲取第一個對象分塊所在的數(shù)據(jù)槽SI的二級索引項,通過該二級索引項定位到數(shù)據(jù)槽SI所在的文件塊中獲取第一個對象分塊的數(shù)據(jù),然后依據(jù)數(shù)據(jù)槽SI的二級索引項中記錄的第二個對象分塊所在的數(shù)據(jù)槽S2的二級索引項的位置,從二級索引文件2.1dx中獲取第二個對象分塊所在的數(shù)據(jù)槽S2的二級索引項,再通過該二級索引項定位到數(shù)據(jù)槽S2所在的文件塊中獲取第二個對象分塊的數(shù)據(jù),依次類推,得到所有對象分塊數(shù)據(jù),將所有對象分塊數(shù)據(jù)依序排列拼接,得到完整的對象數(shù)據(jù);
從磁盤緩存中刪除緩存對象過程:掃描一級索引文件1.1dx,查找到對象主鍵ObjKey與對象主鍵K 一致的一級索引項,從二級索引文件2.1dx中獲取到該對象的第一個對象分塊所在的數(shù)據(jù)槽SI的二級索引項,在該二級索引項中將數(shù)據(jù)槽SI標記為未使用,再通過該二級索引項獲取第二個對象分塊所在的數(shù)據(jù)槽S2的二級索引項,在該二級索引項中將數(shù)據(jù)槽S2標記為未使用,依次類推,在二級索引文件中標記刪除所有對象分塊。最后,在將該該對象對應的一級索引項標記為無效,實現(xiàn)該對象在緩存的刪除。
[0006]進一步的,每一文件塊N1.dat (i=l, 2, 3,......η, η為正整數(shù))的大小相同。
[0007]更進一步的,每一文件塊N1.dat (i=l, 2,3,......η, η為正整數(shù))的大小可以為任
意值,推薦為64ΜΒ。
[0008]進一步的,所述一級索引項的長度是34字節(jié),所述一級索引項記錄一個緩存對象信息,一級索引項的字段包括:
1)對象主鍵(ObjKey,20字節(jié)):該字段用于存儲緩存對象的主鍵K,每個緩存對象都是通過主鍵來進行唯一標識;
2)對象創(chuàng)建時間(CreateTime,4字節(jié)):該字段用于記錄對象添加到緩存中的時間,該字段主要用于對象緩存失效的判斷;
3)對象最后訪問時間(LastAccessTime,4字節(jié)):該字段用于記錄對象最后一次被訪問的時間,該字段主要用于對象緩存失效的判斷;
4)有效性標識(ValidFlag,I字節(jié)):該字段用于標記對象在緩存中是否已經(jīng)失效,O表不失效,I表不有效;當對象被緩存失效機制判定為無效而從緩存中剔除時,緩存系統(tǒng)并不是將該對象對應的一級索引項刪除,而是將該對象對應的一級索引項中的ValidFlag字段標記為0,從而實現(xiàn)對象的標記刪除;
5)檢驗和(Checksum,I字節(jié)):該字段用于記錄對象數(shù)據(jù)通過特定校驗算法(如采用CRC循環(huán)校驗算法)計算得到的校驗和;當從緩存中讀取對象數(shù)據(jù)時,利用該字段來校驗對象數(shù)據(jù)是否完備,從而判斷讀取到的對象數(shù)據(jù)是否與與存儲時的對象數(shù)據(jù)一致;
6)第一個數(shù)據(jù)槽索引(FirstSlotIndex,4字節(jié)):該字段用于記錄存儲對象的第一個分包的數(shù)據(jù)槽的二級索引項編號,對于小對象,通常只有一個分包;而對于大對象,可以有一至多個分塊;
所述二級索引項的長度是21字節(jié),每個二級索引項存儲一個數(shù)據(jù)槽Si的元信息,二級索引項中的字段組成如下:
I)文件塊ID (ChunkID,4字節(jié)):該字段表示數(shù)據(jù)槽所在的文件塊ID,用整數(shù)表示;每個文件塊在文件系統(tǒng)中的名稱為“〈ChunkID〉.dat” ;2)數(shù)據(jù)槽偏移量(Slot0ffset,4字節(jié)):該字段表示數(shù)據(jù)槽起始位置在文件塊中的偏移量(字節(jié)數(shù));
3)數(shù)據(jù)槽大小(SlotSize,4字節(jié)):該字段表示數(shù)據(jù)槽的字節(jié)數(shù),即數(shù)據(jù)槽所能容納的最大數(shù)據(jù)長度;
4)使用標志(UseFlag,I字節(jié)):該字段表示數(shù)據(jù)槽是否被用于存儲對象數(shù)據(jù):0表示未被使用;1表示被使用;當緩存對象被刪除時,存儲該對象數(shù)據(jù)所占用的數(shù)據(jù)槽并沒有被刪除,而是將二級索引中該數(shù)據(jù)槽對應的二級索引項中的UseFlag標記為O,即將數(shù)據(jù)槽標記刪除實現(xiàn)回收,該數(shù)據(jù)槽可利用于存儲其他的對象數(shù)據(jù);
5)數(shù)據(jù)大小(DataSize,4字節(jié)):該字段表示被使用的數(shù)據(jù)槽中,實際存儲的數(shù)據(jù)的大??;因為數(shù)據(jù)槽在分配時,其大小為2n KB,將數(shù)據(jù)槽用于存儲對象數(shù)據(jù)時,通常對象數(shù)據(jù)不會把數(shù)據(jù)槽的整個空間都占用,會留有小部分的剩余空間,該剩余空間不能被使用,即所謂的空洞;隨著大量文件塊中的數(shù)據(jù)槽不斷地回收利用,其中的空洞就會越來越多,必須對緩存優(yōu)化整理,將其中的空洞減少到最小; 6)下一個數(shù)據(jù)槽索引(NextSlotIndex,4字節(jié)):表示存儲下一個對象分塊的數(shù)據(jù)槽的二級索引項編號,如果NextSlotIndex為-1,表示該數(shù)據(jù)槽存儲著對象的最后一個對象分塊。
[0009]更進一步的,所述對象包括對象主鍵K和對象數(shù)據(jù)V,往磁盤緩存中添加對象具體過程為:
Al:掃描一級索引文件1.1dx,判斷是否存在一個一級索引項,該一級索引項中的ObjKey與待添加的對象主鍵K 一致,且ValidFlag為1,如果存在滿足條件的一級索引項,則表明緩存中已經(jīng)存在一個主鍵為K的對象,轉至步驟A2執(zhí)行;否則,轉至步驟A3執(zhí)行;
A2:返回失敗信息,并告知緩存中已經(jīng)存在主鍵為K的對象;
A3:計算待緩存的對象大小,若該對象大小>文件塊大小,將該對象拆分成若干個對象分塊,每個對象分塊大小<文件塊大??;若對象大小<文件塊大小,則將該對象整個作為一個對象分塊,轉至步驟A4執(zhí)行;
A4:掃描二級索引文件2.1dx,判斷是否存在一個滿足“SlotSize值的3/4≤對象分塊大小< SlotSize值”條件的空閑數(shù)據(jù)槽Si,若是,則將該對象分塊存儲在該空閑數(shù)據(jù)槽Si中,并在二級索引文件中修改該數(shù)據(jù)槽Si對應的二級索引項JfUseFlagSE為I ;DataSize設置為對象分塊的大??;如果該對象分塊是對象的最后一個分塊,則將NextSlotIndex設置為_1,如果該對象分塊不是對象的第一個分塊,則將存儲前一個對象分塊的數(shù)據(jù)槽S1-1的二級索引項的NextSlotIndex修改為當前數(shù)據(jù)槽Si的二級索引項,轉至步驟A7執(zhí)行;否則,若不存在滿足“SlotSize值的3/4 <對象分塊大小SSlotSize值”條件的空閑數(shù)據(jù)槽Si,轉至步驟A5執(zhí)行;
A5:遍歷文件塊N1.dat,判斷是否存在一個文件塊,該文件塊存在空閑空間,且該空閑空間大小必須大于容得下該對象分塊的數(shù)據(jù)槽Si大小,該數(shù)據(jù)槽Si大小為2n KB,且該數(shù)據(jù)槽Si大小>該對象分塊大小,η計算公式為:[log2 (對象分塊大小)]值向上取整數(shù),否貝U,則新增一個文件塊(Ni+1).dat,在文件塊(Ni+1).dat中創(chuàng)建新數(shù)據(jù)槽Si,該數(shù)據(jù)槽Si大小為2n KB,且該數(shù)據(jù)槽Si+Ι大小>該對象分塊大小,η計算公式為:[log2 (對象分塊大小)]值向上取整數(shù);A6:將該對象分塊存儲到該數(shù)據(jù)槽Si中,并在二級索引文件2.1dx末尾添加該數(shù)據(jù)槽Si對應的二級索引項:設置ChunkID、SlotOffSet和SlotSize為新數(shù)據(jù)槽在文件塊中的位置和大小^fUseFlag標記為I ;DataSize設置為數(shù)據(jù)槽中存儲的對象分塊的大小;如果該對象分塊是最后對象的一個分塊,則將NextSlotIndex設置為-1,轉至步驟A7執(zhí)行。[0010]A7:對象的所有對象分塊都存儲到數(shù)據(jù)槽后,在一級索引文件1.1dx末尾添加一個一級索引項:將ObjKey設置為該對象主鍵;將CreateTime和LastAccessTime設置為當前時間^fValidFlag設置為I ;將CheckSum設置為從該對象數(shù)據(jù)計算得到的校驗和;將FirstSlotIndex設置為存儲第一個對象分包的數(shù)據(jù)槽SI的二級索引項,返回對象添加成功應答。
[0011]進一步的,從磁盤緩存中獲取緩存對象具體方法如下:
B1:利用一級索引掃描一級索引文件1.1dx,查詢到一級索引的ObjKey字段等于對象主鍵K,且ValidFlag字段等于I時,則讀取FirstSlotIndex字段,得到存儲第一個對象分塊的數(shù)據(jù)槽SI的二級索引項,轉至B2執(zhí)行,否則返回失敗應答,
B2:將該二級索引項的編號乘以二級索引項數(shù)據(jù)長度得到該二級索引項在二級索引文件2.1dx中的偏移位置,通過該偏移位置從二級索引文件2.1dx中讀取相應的二級索引項,再根據(jù)該二級索引項中的ChunkID、SlotOffset和DataSize字段,從文件塊中將對象分塊數(shù)據(jù)讀取出來,判斷該二級索引項中的NextSlotIndex是否為_1,若是,則表示是最后一個對象分塊,轉至B3執(zhí)行;否則,讀取NextSlotIndex字段,得到存儲下一個對象分塊的數(shù)據(jù)槽的二級索引項的編號,轉至B2繼續(xù)執(zhí)行;
B3:獲取到所有對象分塊后,將所有對象分塊按照先后順序拼接起來,得到完整的對象數(shù)據(jù),計算讀取到的對象數(shù)據(jù)的校驗和,如果該對象數(shù)據(jù)的校驗和等于對應的一級索引項中的CheckSum值,則表明該對象數(shù)據(jù)完備,修改該一級索引項的LastAccessTime為當前時間,然后成功返回該對象數(shù)據(jù);如果對象數(shù)據(jù)校驗失敗,則在緩存中刪除該對象,并返回獲取緩存對象失敗應答。
[0012]進一步的,從磁盤緩存中刪除緩存對象具體方法如下,輸入待刪除的對象主鍵K: Cl:利用一級索引掃描一級索引文件1.1dx,查詢到一級索引的ObjKey字段等于對象
主鍵K,且ValidFlag字段等于I時,則讀取FirstSlotIndex字段,得到存儲第一個對象分塊的數(shù)據(jù)槽的二級索引項編號,轉至C2執(zhí)行,否則返回失敗應答,
C2:將該二級索引項的編號乘以二級索引項數(shù)據(jù)長度得到該二級索引項在二級索引文件中的偏移位置,通過該偏移位置從二級索引文件中讀取相應的二級索引項,將該二級索引項的UseFlag設置為0,標記刪除對應的數(shù)據(jù)槽,回收再利用,判斷該二級索引項中的NextSlotIndex是否為_1,若是,則表示是最后一個對象分塊,轉至C3執(zhí)行;否則,讀取NextSlotIndex字段,得到存儲下一個對象分塊的數(shù)據(jù)槽對應的二級索引項的編號,轉至C2繼續(xù)執(zhí)行;
C3:將對象主鍵K對應的一級索引項的ValidFlag標記為0,最后返回緩存對象刪除成功應答。
[0013]進一步的,本發(fā)明還包括過程D:磁盤緩存中緩存的對象通過緩存失效機制來剔除過期的對象,釋放磁盤空間,所述緩存失效機制包括兩種:LRU(Least Recently Used,最近最少使用)機制和FIFO (First In First Out,先入先出)機制。[0014]更進一步的,通過事先設置的最大緩存時間(MaxCacheTime)參數(shù),兩種緩存失效機制工作過程如下:
Dl:LRU機制。定時掃描一級索引文件,對于每一個一級索引項,如果當前時間減去LastAccessTime的值超過MaxCacheTime參數(shù)值,貝U認為該一級索引項對應的緩存對象已經(jīng)過期,則從緩存中刪除該對象(參考過程C中描述的步驟進行)。
[0015]D2:FIF0機制。定時掃描一級索引文件,對于每一個一級索引項,如果當前時間減去CreateTime的值超過MaxCacheTime參數(shù)值,貝U認為該一級索引項對應的緩存對象已經(jīng)過期,則從緩存中刪除該對象(參考過程C中描述的步驟進行)。
[0016]進一步的,本發(fā)明還包括過程E:緩存優(yōu)化整理過程,包括以下步驟:
El:掃描二級索引文件,得到一個二級索引項列表,該列表中二級索引項按照DataSize值從小到大排列。
[0017]E2:逐個遍歷二級索引項列表中的每個二級索引項,從舊文件塊中讀取二級索引項中指定的舊的數(shù)據(jù)槽中的數(shù)據(jù);
步驟E 3,將舊數(shù)據(jù)槽中的數(shù)據(jù)拷貝到新文件塊中,然后,修改該二級索引項中的ChunkID、SlotOffset和SlotSize字段指向新文件塊的數(shù)據(jù)槽,如果舊文件塊中的數(shù)據(jù)槽數(shù)據(jù)都已經(jīng)搬移到新文件塊中,則可以將舊文件塊刪除。
[0018]進一步的,上述步驟E3:將舊數(shù)據(jù)槽中的數(shù)據(jù)拷貝到新文件塊中,具體包括如下步驟:
E31:首先根據(jù)待搬移的數(shù)據(jù)大小,計算新數(shù)據(jù)槽大小,新數(shù)據(jù)槽大小為2n KB且剛好能夠容納待搬移的數(shù)據(jù);
E32:然后在新文件塊中創(chuàng)建新的數(shù)據(jù)槽,然后將數(shù)據(jù)從舊數(shù)據(jù)槽中復制到新數(shù)據(jù)槽中。
[0019]本發(fā)明通過本發(fā)明通過固定大小的文件塊來存儲對象的數(shù)據(jù),將多個小對象合并存儲在一個文件塊中,將大對象分拆成多個對象分塊(Object Block)分別存儲在多個文件塊(Chunk)中,每個文件塊大小可以設置為任意值,但是經(jīng)過經(jīng)驗測試,每個文件塊大小設置為64MB時磁盤能夠更加充分利用,讀寫效率更高。本發(fā)明采用上述技術方案,與現(xiàn)有技術相比,具有如下優(yōu)點:
1)能夠實現(xiàn)任意大小和任意類型的對象的緩存,在實際應用中,可用于圖片、音頻、視頻、其它靜態(tài)文件以及運行時對象的緩存;
2)將大量小對象合并存儲在固定大小的文件塊中,能夠避免緩存小對象時產(chǎn)生的大量磁盤碎片,導致訪問效率低下的問題。
[0020]3)通過設計獨特的二級索引方法,能夠有效提高緩存對象的存取效率。
[0021]4)通過緩存失效機制和緩存優(yōu)化整理機制,將文件塊中的空洞消除,能夠實現(xiàn)高效的空間回收利用。
【專利附圖】
【附圖說明】
[0022]圖1是本發(fā)明的實施例的數(shù)據(jù)存儲結構;
圖2是本發(fā)明的實施例的二級索引字段定義;
圖3是本發(fā)明的實施例的一級索引字段定義?!揪唧w實施方式】
[0023]現(xiàn)結合附圖和【具體實施方式】對本發(fā)明進一步說明。
[0024]作為一個具體的實施例,本發(fā)明采用基于二級索引的文件存儲結構,如圖1至圖3所示,一種基于磁盤的對象緩存方法,包括:
劃分文件存儲空間,構建二級索引的文件存儲結構,該文件存儲結構由一個一級索引
文件1.1dx、一個二級索引文件2.1dx、以及一至多個文件塊N1.dat (i=l, 2,3,......η, η為
正整數(shù))組成,每一文件塊N1.dat劃分為一至多個數(shù)據(jù)槽Si (i=l,2,3,……n,n為正整數(shù)),該每一數(shù)據(jù)槽Si的大小為2n KB,其中η為正整數(shù),且該數(shù)據(jù)槽Si大小<文件塊N1.dat大小,所述一級索引文件1.1dx用于存放一級索引項,一個二級索引文件2.1dx用于存放二級索引項;每一個數(shù)據(jù)槽在二級索引文件中存在一個二級索引項與之對應,該二級索引項記錄該數(shù)據(jù)槽在哪一個文件塊中,以及數(shù)據(jù)槽在文件塊中的位置、大小、使用情況等信息。
[0025]每一文件塊N1.dat (i=l, 2,3,……η,η為正整數(shù))的大小相同且可以設置為任意值。但是經(jīng)過經(jīng)驗測試,每一文件塊N1.dat (i=l,2,3,……η,η為正整數(shù))的大小設置為為64ΜΒ時,磁盤能夠更加充分利用,讀寫效率更高。
[0026]參考圖3所示,所述一級索引項的長度是34字節(jié),所述一級索引項記錄一個緩存對象信息,一級索引項的字段包括:
1)對象主鍵(ObjKey,20字節(jié)):該字段用于存儲緩存對象的主鍵K,每個緩存對象都是通過主鍵來進行唯一標識;
2)對象創(chuàng)建時間(CreateTime,4字節(jié)):該字段用于記錄對象添加到緩存中的時間,該字段主要用于對象緩存失效的判斷;
3)對象最后訪問時間(LastAccessTime,4字節(jié)):該字段用于記錄對象最后一次被訪問的時間,該字段主要用于對象緩存失效的判斷;
4)有效性標識(ValidFlag,I字節(jié)):該字段用于標記對象在緩存中是否已經(jīng)失效,O表不失效,I表不有效;當對象被緩存失效機制判定為無效而從緩存中剔除時,緩存系統(tǒng)并不是將該對象對應的一級索引項刪除,而是將該對象對應的一級索引項中的ValidFlag字段標記為0,從而實現(xiàn)對象的標記刪除;
5)檢驗和(Checksum,I字節(jié)):該字段用于記錄對象數(shù)據(jù)通過特定校驗算法(如采用CRC循環(huán)校驗算法)計算得到的校驗和;當從緩存中讀取對象數(shù)據(jù)時,利用該字段來校驗對象數(shù)據(jù)是否完備,從而判斷讀取到的對象數(shù)據(jù)是否與與存儲時的對象數(shù)據(jù)一致;
6)第一個數(shù)據(jù)槽索引(FirstSlotIndex,4字節(jié)):該字段用于記錄存儲對象的第一個分包的數(shù)據(jù)槽的二級索引項編號,對于小對象,通常只有一個分包;而對于大對象,可以有一至多個分塊;
參考圖2所示,所述二級索引項的長度是21字節(jié),每個二級索引項存儲一個數(shù)據(jù)槽Si的元信息,二級索引項中的字段組成如下:
O文件塊ID (ChunkID,4字節(jié)):該字段表示數(shù)據(jù)槽所在的文件塊ID,用整數(shù)表示;每個文件塊在文件系統(tǒng)中的名稱為“〈ChunkID〉.dat” ;
2)數(shù)據(jù)槽偏移量(Slot0ffset,4字節(jié)):該字段表示數(shù)據(jù)槽起始位置在文件塊中的偏移量(字節(jié)數(shù));3)數(shù)據(jù)槽大小(SlotSize,4字節(jié)):該字段表示數(shù)據(jù)槽的字節(jié)數(shù),即數(shù)據(jù)槽所能容納的最大數(shù)據(jù)長度;
4)使用標志(UseFlag,I字節(jié)):該字段表示數(shù)據(jù)槽是否被用于存儲對象數(shù)據(jù):0表示未被使用;1表示被使用;當緩存對象被刪除時,存儲該對象數(shù)據(jù)所占用的數(shù)據(jù)槽并沒有被刪除,而是將二級索引中該數(shù)據(jù)槽對應的二級索引項中的UseFlag標記為0,即將數(shù)據(jù)槽標記刪除實現(xiàn)回收,該數(shù)據(jù)槽可利用于存儲其他的對象數(shù)據(jù);
5)數(shù)據(jù)大小(DataSize,4字節(jié)):該字段表示被使用的數(shù)據(jù)槽中,實際存儲的數(shù)據(jù)的大小;因為數(shù)據(jù)槽在分配時,其大小為2n KB,將數(shù)據(jù)槽用于存儲對象數(shù)據(jù)時,通常對象數(shù)據(jù)不會把數(shù)據(jù)槽的整個空間都占用,會留有小部分的剩余空間,該剩余空間不能被使用,即所謂的空洞;隨著大量文件塊中的數(shù)據(jù)槽不斷地回收利用,其中的空洞就會越來越多,必須對緩存優(yōu)化整理,將其中的空洞減少到最小;
6)下一個數(shù)據(jù)槽索引(NextSlotIndex,4字節(jié)):表示存儲下一個對象分塊的數(shù)據(jù)槽的二級索引項編號,如果NextSlotIndex為-1,表示該數(shù)據(jù)槽存儲著對象的最后一個對象分塊。
[0027]往磁盤緩存中添加對象過程:根據(jù)對象的主鍵K設置一級索引項的對象主鍵ObjKey,根據(jù)文件塊的設定容量將對象進行分割,形成一個或多個對象分塊,每一對象分塊大小<文件塊大小,將一個或多個對象分塊存儲到一至多個文件塊的數(shù)據(jù)槽Si中,所述一級索引項記錄了第一個對象分塊所在的數(shù)據(jù)槽SI的二級索引項在二級索引文件的位置,而數(shù)據(jù)槽SI對應的二級索引項又記錄了下一個對象分塊所在的數(shù)據(jù)槽S2的二級索引項在二級索引文件的位置,依次類推;數(shù)據(jù)槽Si對應的二級索引項又記錄下一個對象分塊所在的數(shù)據(jù)槽Si+Ι的二級索引項在二級索引文件2.1dx的位置;
本實施例中,所述對象包括對象主鍵K和對象數(shù)據(jù)V,往磁盤緩存中添加對象具體過程
為:
Al:掃描一級索引文件1.1dx,判斷是否存在一個一級索引項,該一級索引項中的ObjKey與待添加的對象主鍵K 一致,且ValidFlag為1,如果存在滿足條件的一級索引項,則表明緩存中已經(jīng)存在一個主鍵為K的對象,轉至步驟A2執(zhí)行;否則,轉至步驟A3執(zhí)行;
A2:返回失敗信息,并告知緩存中已經(jīng)存在主鍵為K的對象;
A3:計算待緩存的對象大小,若該對象大小>文件塊大小,將該對象拆分成若干個對象分塊,每個對象分塊大小<文件塊大??;若對象大小<文件塊大小,則將該對象整個作為一個對象分塊,轉至步驟A4執(zhí)行;
A4:掃描二級索引文件2.1dx,判斷是否存在一個滿足“SlotSize值的3/4≤對象分塊大小< SlotSize值”條件的空閑數(shù)據(jù)槽Si,若是,則將該對象分塊存儲在該空閑數(shù)據(jù)槽Si中,并在二級索引文件中修改該數(shù)據(jù)槽Si對應的二級索引項:將UseFlag標記為I ;DataSize設置為對象分塊的大?。蝗绻搶ο蠓謮K是對象的最后一個分塊,則將NextSlotIndex設置為_1,如果該對象分塊不是對象的第一個分塊,則將存儲前一個對象分塊的數(shù)據(jù)槽S1-1的二級索引項的NextSlotIndex修改為當前數(shù)據(jù)槽Si的二級索引項,轉至步驟A7執(zhí)行;否則,若不存在滿足“SlotSize值的3/4 <對象分塊大小SSlotSize值”條件的空閑數(shù)據(jù)槽Si,轉至步驟A5執(zhí)行;
A5:遍歷文件塊N1.dat,判斷是否存在一個文件塊,該文件塊存在空閑空間,且該空閑空間大小必須大于容得下該對象分塊的數(shù)據(jù)槽Si大小,該數(shù)據(jù)槽Si大小為2n KB,且該數(shù)據(jù)槽Si大小>該對象分塊大小,η計算公式為:[log2 (對象分塊大小)]值向上取整數(shù),并將剩下的空閑空間記錄起來供后續(xù)創(chuàng)建數(shù)據(jù)槽使用,否則,則新增一個文件塊(Ni+1).dat,在文件塊(Ni+1).dat中創(chuàng)建新數(shù)據(jù)槽Si,該數(shù)據(jù)槽Si大小為2n KB,且該數(shù)據(jù)槽Si+Ι大小>該對象分塊大小,η計算公式為:[log2 (對象分塊大小)]值向上取整數(shù),并將剩下的空閑空間記錄起來供后續(xù)創(chuàng)建數(shù)據(jù)槽使用;
A6:將該對象分塊存儲到該數(shù)據(jù)槽Si中,并在二級索引文件2.1dx末尾添加該數(shù)據(jù)槽Si對應的二級索引項:設置ChunkID、SlotOffset和SlotSize為新數(shù)據(jù)槽在文件塊中的位置和大小^fUseFlag標記為I ;DataSize設置為數(shù)據(jù)槽中存儲的對象分塊的大??;如果該對象分塊是最后對象的一個分塊,則將NextSlotIndex設置為-1,轉至步驟A7執(zhí)行。
[0028]A7:對象的所有對象分塊都存儲到數(shù)據(jù)槽后,在一級索引文件1.1dx末尾添加一個一級索引項:將ObjKey設置為該對象主鍵;將CreateTime和LastAccessTime設置為當前時間^fValidFlag設置為I ;將CheckSum設置為從該對象數(shù)據(jù)計算得到的校驗和;將FirstSlotIndex設置為存儲第一個對象分包的數(shù)據(jù)槽SI的二級索引項,返回對象添加成功應答。
[0029]從磁盤緩存中獲取緩存對象過程:掃描一級索引文件1.1dx,查找到對象主鍵ObjKey與對象主鍵K 一致的一級索引項,該一級索引項記錄了該對象的第一個對象分塊所在的數(shù)據(jù)槽SI的二級索引項在二級索引文件2.1dx的位置,從二級索引文件中獲取第一個對象分塊所在的數(shù)據(jù)槽SI的二級索引項,通過該二級索引項定位到數(shù)據(jù)槽SI所在的文件塊中獲取第一個對象分塊的數(shù)據(jù),然后依據(jù)數(shù)據(jù)槽SI的二級索引項中記錄的第二個對象分塊所在的數(shù)據(jù)槽S2的二級索引項的位置,從二級索引文件2.1dx中獲取第二個對象分塊所在的數(shù)據(jù)槽S2的二級索引項,再通過該二級索引項定位到數(shù)據(jù)槽S2所在的文件塊中獲取第二個對象分塊的數(shù)據(jù) ,依次類推,得到所有對象分塊數(shù)據(jù),將所有對象分塊數(shù)據(jù)依序排列拼接,得到完整的對象數(shù)據(jù);
本實施例中,從磁盤緩存中獲取緩存對象具體方法如下:
B1:利用一級索引掃描一級索引文件1.1dx,查詢到一級索引的ObjKey字段等于對象主鍵K,且ValidFlag字段等于I時,則讀取FirstSlotIndex字段,得到存儲第一個對象分塊的數(shù)據(jù)槽SI的二級索引項,轉至B2執(zhí)行,否則返回失敗應答,
B2:將該二級索引項的編號乘以二級索引項數(shù)據(jù)長度得到該二級索引項在二級索引文件2.1dx中的偏移位置,通過該偏移位置從二級索引文件2.1dx中讀取相應的二級索引項,再根據(jù)該二級索引項中的ChunkID、SlotOffset和DataSize字段,從文件塊中將對象分塊數(shù)據(jù)讀取出來,判斷該二級索引項中的NextSlotIndex是否為_1,若是,則表示是最后一個對象分塊,轉至B3執(zhí)行;否則,讀取NextSlotIndex字段,得到存儲下一個對象分塊的數(shù)據(jù)槽的二級索引項的編號,轉至B2繼續(xù)執(zhí)行;
B3:獲取到所有對象分塊后,將所有對象分塊按照先后順序拼接起來,得到完整的對象數(shù)據(jù),計算讀取到的對象數(shù)據(jù)的校驗和,如果該對象數(shù)據(jù)的校驗和等于對應的一級索引項中的CheckSum值,則表明該對象數(shù)據(jù)完備,修改該一級索引項的LastAccessTime為當前時間,然后成功返回該對象數(shù)據(jù);如果對象數(shù)據(jù)校驗失敗,則在緩存中刪除該對象,并返回獲取緩存對象失敗應答。[0030]從磁盤緩存中刪除緩存對象過程:掃描一級索引文件1.1dx,查找到對象主鍵ObjKey與對象主鍵K 一致的一級索引項,從二級索引文件2.1dx中獲取到該對象的第一個對象分塊所在的數(shù)據(jù)槽SI的二級索引項,在該二級索引項中將數(shù)據(jù)槽SI標記為未使用,再通過該二級索引項獲取第二個對象分塊所在的數(shù)據(jù)槽S2的二級索引項,在該二級索引項中將數(shù)據(jù)槽S2標記為未使用,依次類推,在二級索引文件中標記刪除所有對象分塊。最后,在將該該對象對應的一級索引項標記為無效,實現(xiàn)該對象在緩存的刪除。
[0031]本實施例中,從磁盤緩存中刪除緩存對象具體方法如下,輸入待刪除的對象主鍵K,:
Cl:利用一級索引掃描一級索引文件1.1dx,查詢到一級索引的ObjKey字段等于對象主鍵K,且ValidFlag字段等于I時,則讀取FirstSlotIndex字段,得到存儲第一個對象分塊的數(shù)據(jù)槽的二級索引項編號,轉至C2執(zhí)行,否則返回失敗應答,
C2:將該二級索引項的編號乘以二級索引項數(shù)據(jù)長度得到該二級索引項在二級索引文件中的偏移位置,通過該偏移位置從二級索引文件中讀取相應的二級索引項,將該二級索引項的UseFlag設置為0,標記刪除對應的數(shù)據(jù)槽,回收再利用,判斷該二級索引項中的NextSlotIndex是否為-1,若是,則表示是最后一個對象分塊,轉至C3執(zhí)行;否則,讀取NextSlotIndex字段,得到存儲下一個對象分塊的數(shù)據(jù)槽對應的二級索引項的編號,轉至C2繼續(xù)執(zhí)行;
C3:將對象主鍵K對應的一級索引項的ValidFlag標記為0,最后返回緩存對象刪除成功應答。
[0032]本實施例還包括過程D:磁盤緩存中緩存的對象通過緩存失效機制來剔除過期的對象,釋放磁盤空間,所述緩存失效機制包括兩種:LRU(Least Recently Used,最近最少使用)機制和FIFO (First In First Out,先入先出)機制。
[0033]通過事先設置的最大緩存時間(MaxCacheTime)參數(shù),兩種緩存失效機制工作過程如下:
Dl:LRU機制。定時掃描一級索引文件,對于每一個一級索引項,如果當前時間減去LastAccessTime的值超過MaxCacheTime參數(shù)值,貝U認為該一級索引項對應的緩存對象已經(jīng)過期,則從緩存中刪除該對象(參考過程C中描述的步驟進行)。
[0034]D2:FIF0機制。定時掃描一級索引文件,對于每一個一級索引項,如果當前時間減去CreateTime的值超過MaxCacheTime參數(shù)值,貝U認為該一級索引項對應的緩存對象已經(jīng)過期,則從緩存中刪除該對象(參考過程C中描述的步驟進行)。
[0035]本實施例還包括過程E:緩存優(yōu)化整理過程,包括以下步驟:經(jīng)過一段時間使用后,文件塊中數(shù)據(jù)槽就會出現(xiàn)很多空洞,為了使磁盤空間實現(xiàn)充分利用,以及維持對象的高效存取速度,需要定期對緩存進行優(yōu)化整理,減少文件塊中的空洞。緩存優(yōu)化整理過程如下:
El:掃描二級索引文件,得到一個二級索引項列表,該列表中二級索引項按照DataSize值從小到大排列。
[0036]E2:逐個遍歷二級索引項列表中的每個二級索引項,從舊文件塊中讀取二級索引項中指定的舊的數(shù)據(jù)槽中的數(shù)據(jù);
步驟E 3,將舊數(shù)據(jù)槽中的數(shù)據(jù)拷貝到新文件塊中,然后,修改該二級索引項中的ChunkID, SlotOffset和SlotSize字段指向新文件塊的數(shù)據(jù)槽,如果舊文件塊中的數(shù)據(jù)槽數(shù)據(jù)都已經(jīng)搬移到新文件塊中,則可以將舊文件塊刪除。
[0037]進一步的,上述步驟E3:將舊數(shù)據(jù)槽中的數(shù)據(jù)拷貝到新文件塊中,具體包括如下步驟:
E31:首先根據(jù)待搬移的數(shù)據(jù)大小,計算新數(shù)據(jù)槽大小,新數(shù)據(jù)槽大小為2n KB且剛好能夠容納待搬移的數(shù)據(jù);
E32:然后在新文件塊中創(chuàng)建新的數(shù)據(jù)槽,然后將數(shù)據(jù)從舊數(shù)據(jù)槽中復制到新數(shù)據(jù)槽中。
[0038]盡管結合優(yōu)選實施方案具體展示和介紹了本發(fā)明,但所屬領域的技術人員應該明白,在不脫離所附權利要求書所限定的本發(fā)明的精神和范圍內(nèi),在形式上和細節(jié)上可以對本發(fā)明做出各種變化,均為本發(fā)明的保護范圍。
【權利要求】
1.一種基于磁盤的對象緩存方法,其特征在于,包括: 劃分文件存儲空間,構建二級索引的文件存儲結構,該文件存儲結構由一個一級索引文件1.1dx、一個二級索引文件2.1dx、以及一至多個文件塊N1.dat (i=l, 2,3,......η, η為正整數(shù))組成,每一文件塊N1.dat劃分為一至多個數(shù)據(jù)槽Si (i=l,2,3,……n,n為正整數(shù)),該每一數(shù)據(jù)槽Si的大小為2n KB,其中η為正整數(shù),且該數(shù)據(jù)槽Si大小<文件塊N1.dat大小,所述一級索引文件1.1dx用于存放一級索引項,一個二級索引文件2.1dx用于存放二級索引項;每一個數(shù)據(jù)槽Si在二級索引文件2.1dx中存在一個二級索引項與之對應,該二級索引項記錄該數(shù)據(jù)槽Si在哪一個文件塊中,以及數(shù)據(jù)槽Si在文件塊中的位置、大小、使用情況等信息, 往磁盤緩存中添加對象過程:根據(jù)對象的主鍵K設置一級索引項的對象主鍵ObjKey,根據(jù)文件塊的設定容量將對象進行分割,形成一個或多個對象分塊,每一對象分塊大小<文件塊大小,將一個或多個對象分塊存儲到一至多個文件塊的數(shù)據(jù)槽Si中,所述一級索引項記錄第一個對象分塊所在的數(shù)據(jù)槽SI的二級索引項在二級索引文件2.1dx的位置,該數(shù)據(jù)槽SI對應的二級索引項又記錄下一個對象分塊所在的數(shù)據(jù)槽S2的二級索引項在二級索引文件2.1dx2.1dx的位置,依次類推,數(shù)據(jù)槽Si對應的二級索引項又記錄第i+Ι個對象分塊所在的數(shù)據(jù)槽Si+Ι的二級索引項在二級索引文件2.1dx的位置; 從磁盤緩存中獲取緩存對象過程:掃描一級索引文件1.1dx,查找到對象主鍵ObjKey與對象主鍵K 一致的一級索引項,該一級索引項記錄了該對象的第一個對象分塊所在的數(shù)據(jù)槽SI的二級索引項在二級索引文件2.1dx的位置,從二級索引文件2.1dx中獲取第一個對象分塊所在的數(shù)據(jù)槽SI的二級索引項,通過該二級索引項定位到數(shù)據(jù)槽SI所在的文件塊中獲取第一個對象分塊的數(shù)據(jù),然后依據(jù)數(shù)據(jù)槽SI的二級索引項中記錄的第二個對象分塊所在的數(shù)據(jù)槽S`2的二級索引項的位置,從二級索引文件2.1dx中獲取第二個對象分塊所在的數(shù)據(jù)槽S2的二級索引項,再通過該二級索引項定位到數(shù)據(jù)槽S2所在的文件塊中獲取第二個對象分塊的數(shù)據(jù),依次類推,得到所有對象分塊數(shù)據(jù),將所有對象分塊數(shù)據(jù)依序排列拼接,得到完整的對象數(shù)據(jù); 從磁盤緩存中刪除緩存對象過程:掃描一級索引文件1.1dx,查找到對象主鍵ObjKey與對象主鍵K 一致的一級索引項,從二級索引文件2.1dx中獲取到該對象的第一個對象分塊所在的數(shù)據(jù)槽SI的二級索引項,在該二級索引項中將數(shù)據(jù)槽SI標記為未使用,再通過該二級索引項獲取第二個對象分塊所在的數(shù)據(jù)槽S2的二級索引項,在該二級索引項中將數(shù)據(jù)槽S2標記為未使用,依次類推,在二級索引文件2.1dx中標記刪除所有對象分塊,最后,在將該該對象對應的一級索引項標記為無效,實現(xiàn)該對象在緩存的刪除。
2.根據(jù)權利要求1所述的一種基于磁盤的對象緩存方法,其特征在于:每一文件塊N1.dat (i=l,2,3,……η,η為正整數(shù))的大小相同。
3.根據(jù)權利要求1所述的一種基于磁盤的對象緩存方法,其特征在于:所述一級索引項的長度是34字節(jié),所述一級索引項記錄一個緩存對象信息,一級索引項的字段包括: 1)對象主鍵(ObjKey,20字節(jié)):該字段用于存儲緩存對象的主鍵K,每個緩存對象都是通過主鍵來進行唯一標識; 2)對象創(chuàng)建時間(CreateTime,4字節(jié)):該字段用于記錄對象添加到緩存中的時間,該字段主要用于對象緩存失效的判斷;3)對象最后訪問時間(LastAccessTime,4字節(jié)):該字段用于記錄對象最后一次被訪問的時間,該字段主要用于對象緩存失效的判斷; 4)有效性標識(ValidFlag,I字節(jié)):該字段用于標記對象在緩存中是否已經(jīng)失效,O表示失效,I表示有效; 5)檢驗和(Checksum,I字節(jié)):該字段用于記錄對象數(shù)據(jù)通過特定校驗算法(如采用CRC循環(huán)校驗算法)計算得到的校驗和; 6)第一個數(shù)據(jù)槽索引(FirstSlotIndex,4字節(jié)):該字段用于記錄存儲對象的第一個分包的數(shù)據(jù)槽的二級索引項編號; 所述二級索引項的長度是21字節(jié),每個二級索引項存儲一個數(shù)據(jù)槽Si的元信息,二級索引項中的字段組成如下: O文件塊ID (ChunkID,4字節(jié)):該字段表示數(shù)據(jù)槽所在的文件塊ID,用整數(shù)表示;每個文件塊在文件系統(tǒng)中的名稱為“〈ChunkID〉.dat” ; 2)數(shù)據(jù)槽偏移量(Slot0ffset,4字節(jié)):該字段表示數(shù)據(jù)槽起始位置在文件塊中的偏移量(字節(jié)數(shù)); 3)數(shù)據(jù)槽大小(SlotSize,4字節(jié)):該字段表示數(shù)據(jù)槽的字節(jié)數(shù),即數(shù)據(jù)槽所能容納的最大數(shù)據(jù)長度; 4)使用標志(UseFlag,I字節(jié)):該字段表示數(shù)據(jù)槽是否被用于存儲對象數(shù)據(jù):0表示未被使用;I表示被使用; 5)數(shù)據(jù)大小(DataSize,4字節(jié)):該字段表示被使用的數(shù)據(jù)槽中,實際存儲的數(shù)據(jù)的大小; 6)下一個數(shù)據(jù)槽索引(NextSlotIndex,4字節(jié)):用于存儲下一個對象分塊的數(shù)據(jù)槽的二級索引項編號,如果NextSlotIndex為-1,表示該數(shù)據(jù)槽存儲著對象的最后一個對象分塊。
4.根據(jù)權利要求3所述的一種基于磁盤的對象緩存方法,其特征在于: 所述對象包括對象主鍵K和對象數(shù)據(jù)V,往磁盤緩存中添加對象具體過程為: Al:掃描一級索引文件1.1dx,判斷是否存在一個一級索引項,該一級索引項中的ObjKey與待添加的對象主鍵K 一致,且ValidFlag為1,如果存在滿足條件的一級索引項,則表明緩存中已經(jīng)存在一個主鍵為K的對象,轉至步驟A2執(zhí)行;否則,轉至步驟A3執(zhí)行; A2:返回失敗信息,并告知緩存中已經(jīng)存在主鍵為K的對象; A3:計算待緩存的對象大小,若該對象大小>文件塊大小,將該對象拆分成若干個對象分塊,每個對象分塊大小<文件塊大小;若對象大小<文件塊大小,則將該對象整個作為一個對象分塊,轉至步驟A4執(zhí)行; A4:掃描二級索引文件2.1dx,判斷是否存在一個滿足“SlotSize值的3/4≤對象分塊大小< SlotSize值”條件的空閑數(shù)據(jù)槽Si,若是,則將該對象分塊存儲在該空閑數(shù)據(jù)槽Si中,并在二級索引文件2.1dx中修改該數(shù)據(jù)槽Si對應的二級索引項JfUseFlag#記為I ;DataSize設置為對象分塊的大小;如果該對象分塊是對象的最后一個分塊,則將NextSlotIndex設置為_1,如果該對象分塊不是對象的第一個分塊,則將存儲前一個對象分塊的數(shù)據(jù)槽S1-1的二級索引項的NextSlotIndex修改為當前數(shù)據(jù)槽Si的二級索引項,轉至步驟A7執(zhí)行;否則,若不存在滿足“SlotSize值的3/4 <對象分塊大小SSlotSize值”條件的空閑數(shù)據(jù)槽Si,轉至步驟A5執(zhí)行; A5:遍歷文件塊N1.dat,判斷是否存在一個文件塊,該文件塊存在空閑空間,且該空閑空間大小必須大于容得下該對象分塊的數(shù)據(jù)槽Si大小,該數(shù)據(jù)槽Si大小為2n KB,且該數(shù)據(jù)槽Si大小>該對象分塊大小,η計算公式為:[log2 (對象分塊大小)]值向上取整數(shù),否則,則新增一個文件塊(Ni+1).dat,在文件塊(Ni+1).dat中創(chuàng)建新數(shù)據(jù)槽Si,該數(shù)據(jù)槽Si大小為2nKB,且該數(shù)據(jù)槽Si大小>該對象分塊大小,η計算公式為:[log2 (對象分塊大小)]值向上取整數(shù), A6:將該對象分塊存儲到該數(shù)據(jù)槽Si中,并在二級索引文件2.1dx末尾添加該數(shù)據(jù)槽Si對應的二級索引項:設置ChunkID、SlotOffSet和SlotSize為新數(shù)據(jù)槽在文件塊中的位置和大小^fUseFlag標記為I ;DataSize設置為數(shù)據(jù)槽中存儲的對象分塊的大??;如果該對象分塊是最后對象的一個分塊,則將NextSlotIndex設置為-1,轉至步驟A7執(zhí)行, A7:對象的所有對象分塊都存儲到數(shù)據(jù)槽后,在一級索引文件1.1dx末尾添加一個一級索引項:將ObjKey設置為該對象主鍵;將CreateTime和LastAccessTime設置為當前時間^fValidFlag設置為I ;將CheckSum設置為從該對象數(shù)據(jù)計算得到的校驗和;將FirstSlotIndex設置為存儲第一個對象分包的數(shù)據(jù)槽SI的二級索引項,返回對象添加成功應答。
5.根據(jù)權利要求3所述的一種基于磁盤的對象緩存方法,其特征在于: 從磁盤緩存中獲取緩存對象具體方法如下: B1:利用一級索引掃 描一級索引文件1.1dx,查詢到一級索引的ObjKey字段等于對象主鍵K,且ValidFlag字段等于I時,則讀取FirstSlotIndex字段,得到存儲第一個對象分塊的數(shù)據(jù)槽SI的二級索引項,轉至B2執(zhí)行,否則返回失敗應答, B2:將該二級索引項的編號乘以二級索引項數(shù)據(jù)長度得到該二級索引項在二級索引文件2.1dx中的偏移位置,通過該偏移位置從二級索引文件2.1dx中讀取相應的二級索引項,再根據(jù)該二級索引項中的ChunkID、SlotOffset和DataSize字段,從文件塊中將對象分塊數(shù)據(jù)讀取出來,判斷該二級索引項中的NextSlotIndex是否為_1,若是,則表示是最后一個對象分塊,轉至B3執(zhí)行;否則,讀取NextSlotIndex字段,得到存儲下一個對象分塊的數(shù)據(jù)槽的二級索引項的編號,轉至B2繼續(xù)執(zhí)行; B3:獲取到所有對象分塊后,將所有對象分塊按照先后順序拼接起來,得到完整的對象數(shù)據(jù),計算讀取到的對象數(shù)據(jù)的校驗和,如果該對象數(shù)據(jù)的校驗和等于對應的一級索引項中的CheckSum值,則表明該對象數(shù)據(jù)完備,修改該一級索引項的LastAccessTime為當前時間,然后成功返回該對象數(shù)據(jù);如果對象數(shù)據(jù)校驗失敗,則在緩存中刪除該對象,并返回獲取緩存對象失敗應答。
6.根據(jù)權利要求3所述的一種基于磁盤的對象緩存方法,其特征在于: 從磁盤緩存中刪除緩存對象具體方法如下,輸入待刪除的對象主鍵K, Cl:利用一級索引掃描一級索引文件1.1dx,查詢到一級索引的ObjKey字段等于對象主鍵K,且ValidFlag字段等于I時,則讀取FirstSlotIndex字段,得到存儲第一個對象分塊的數(shù)據(jù)槽的二級索引項編號,轉至C2執(zhí)行,否則返回失敗應答, C2:將該二級索引項的編號乘以二級索引項數(shù)據(jù)長度得到該二級索引項在二級索引文件2.1dx中的偏移位置,通過該偏移位置從二級索引文件2.1dx中讀取相應的二級索引項,將該二級索引項的UseFlag設置為O,標記刪除對應的數(shù)據(jù)槽,回收再利用,判斷該二級索引項中的NextSlotIndex是否為-1,若是,則表示是最后一個對象分塊,轉至C3執(zhí)行;否貝1J,讀取NextSlotIndex字段,得到存儲下一個對象分塊的數(shù)據(jù)槽對應的二級索引項的編號,轉至C2繼續(xù)執(zhí)行; C3:將對象主鍵K對應的一級索引項的ValidFlag標記為0,最后返回緩存對象刪除成功應答。
7.根據(jù)權利要求3所述的一種基于磁盤的對象緩存方法,其特征在于:還包括過程D:磁盤緩存中緩存的對象通過緩存失效機制來剔除過期的對象,釋放磁盤空間,所述緩存失效機制包括兩種:LRU(Least Recently Used,最近最少使用)機制和FIFO(First In FirstOut,先入先出)機制。
8.根據(jù)權利要求7所述的一種基于磁盤的對象緩存方法,其特征在于: 通過事先設置的最大緩存時間(MaxCacheTime)參數(shù),兩種緩存失效機制工作過程如下: Dl:LRU機制:定時掃描一級索引文件,對于每一個一級索引項,如果當前時間減去LastAccessTime的值超過MaxCacheTime參數(shù)值,貝U認為該一級索引項對應的緩存對象已經(jīng)過期,則從緩存中刪除該對象; D2:FIF0機制:定時掃描一級索引文件,對于每一個一級索引項,如果當前時間減去CreateTime的值超過MaxCacheTime參數(shù)值,貝U認為該一級索引項對應的緩存對象已經(jīng)過期,則從緩存中 刪除該對象。
9.根據(jù)權利要求3所述的一種基于磁盤的對象緩存方法,其特征在于:還包括過程E:緩存優(yōu)化整理過程,包括以下步驟: El:掃描二級索引文件2.1dx,得到一個二級索引項列表,該列表中二級索引項按照DataSize值從小到大排列; E2:逐個遍歷二級索引項列表中的每個二級索引項,從舊文件塊中讀取二級索引項中指定的舊的數(shù)據(jù)槽中的數(shù)據(jù); 步驟E 3,將舊數(shù)據(jù)槽中的數(shù)據(jù)拷貝到新文件塊中,然后,修改該二級索引項中的ChunkID、SlotOffset和SlotSize字段指向新文件塊的數(shù)據(jù)槽,如果舊文件塊中的數(shù)據(jù)槽數(shù)據(jù)都已經(jīng)搬移到新文件塊中,則可以將舊文件塊刪除。
10.根據(jù)權利要求9所述的一種基于磁盤的對象緩存方法,其特征在于:所述步驟E3:將舊數(shù)據(jù)槽中的數(shù)據(jù)拷貝到新文件塊中,具體包括如下步驟: E31:首先根據(jù)待搬移的數(shù)據(jù)大小,計算新數(shù)據(jù)槽大小,新數(shù)據(jù)槽大小為2n KB且剛好能夠容納待搬移的數(shù)據(jù); E32:然后在新文件塊中創(chuàng)建新的數(shù)據(jù)槽,然后將數(shù)據(jù)從舊數(shù)據(jù)槽中復制到新數(shù)據(jù)槽中。
【文檔編號】G06F17/30GK103678638SQ201310710511
【公開日】2014年3月26日 申請日期:2013年12月20日 優(yōu)先權日:2013年12月20日
【發(fā)明者】程行榮, 劉志芳, 吳超民, 孫震, 黃文淮 申請人:廈門雅迅網(wǎng)絡股份有限公司