專利名稱:一種通用緩存的方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種數(shù)據(jù)處理方法,特別涉及一種數(shù)據(jù)的緩存方法。
技術(shù)背景目前在業(yè)務(wù)軟件系統(tǒng)應(yīng)用中,對于系統(tǒng)處理性能要求越來越高,所以應(yīng)該 避免頻繁的進(jìn)行數(shù)據(jù)庫操作和文件讀寫。為解決數(shù)據(jù)讀取低效的問題必然會考 慮到使用緩存技術(shù)。緩存就是將一定的數(shù)據(jù)存放在內(nèi)存中,當(dāng)系統(tǒng)需要訪問此 數(shù)據(jù)時,將可以直接從內(nèi)存中讀取,而減免了數(shù)據(jù)庫操作和文件讀寫的耗時。 在現(xiàn)實環(huán)境下,對于大數(shù)據(jù)量,系統(tǒng)不可能將所有數(shù)據(jù)緩存到內(nèi)存中,所以需 要使用一定的策略進(jìn)行緩存項的淘汰,并且緩存需要在它的緩存項發(fā)生變化的 時候?qū)ζ溥M(jìn)行更新處理。目前現(xiàn)有的緩存系統(tǒng)大多采用LRU(最近最少使用)算法,LRU算法是一 種比較簡單的淘汰選擇算法,它不能真實的反映緩存中內(nèi)容的使用情況。目前現(xiàn)有的一些緩存系統(tǒng)為了實現(xiàn)簡單,而沒有提供緩存同步功能,這將 導(dǎo)致緩存的數(shù)據(jù)和真實數(shù)據(jù)的偏差。有一些緩存系統(tǒng)雖然提供了緩存同步功 能,但是因為需要消耗大量的系統(tǒng)資源,導(dǎo)致緩存同步代價過大。發(fā)明內(nèi)容本發(fā)明所要解決的技術(shù)問題在于提出一種通用緩存的方法,在系統(tǒng)對外部 數(shù)據(jù)源需要進(jìn)行頻繁訪問時,能夠有效地提高讀取數(shù)據(jù)的性能。為實現(xiàn)上述目的,本發(fā)明提出了一種通用緩存的方法,用于獲取緩存中存 儲的數(shù)據(jù),其中,包括步驟--,在緩存中設(shè)置與外部數(shù)據(jù)源連接的用于獲取外部數(shù)據(jù)的接口;步驟二,將緩存分配成多個緩存段,將一個數(shù)據(jù)只存放在一個緩存段里, 設(shè)置每個緩存段的名稱和數(shù)據(jù)的主健值;步驟三,當(dāng)緩存系統(tǒng)收到數(shù)據(jù)訪問請求時,根據(jù)請求訪問的緩存段名稱和
數(shù)據(jù)的主健值,訪問對應(yīng)的緩存段,并判斷所述緩存段中是否已存儲所請求的 數(shù)據(jù),若已存儲,則輸出所請求的數(shù)據(jù),若未存儲,則通過所述接口從外部數(shù) 據(jù)源獲取所請求的數(shù)據(jù),保存所請求的數(shù)據(jù)至所述緩存段中并輸出。 上述的通用緩存的方法,其特征在于,還包括當(dāng)訪問或者修改所述緩存段時,設(shè)置段級鎖,鎖定所述緩存段的步驟;和 當(dāng)從所述外部數(shù)據(jù)源讀取所述請求的數(shù)據(jù)時,為所述緩存段中對應(yīng)的數(shù)據(jù) 設(shè)置行級鎖,鎖定所請求的數(shù)據(jù)的步驟。上述的通用緩存的方法,其中,所述步驟三還包括步驟31,當(dāng)所述緩存段中已存儲所請求的數(shù)據(jù)時,判斷所述已存儲的數(shù)據(jù)對應(yīng)的外部數(shù)據(jù)源中的數(shù)據(jù)是否已經(jīng)被更新;步驟32,若未被更新,則直接輸出所述已存儲的數(shù)據(jù),若已被更新,則調(diào)用所述接口從外部數(shù)據(jù)源獲取對應(yīng)的數(shù)據(jù)并更新所述緩存項中存儲的數(shù)據(jù)。上述的通用緩存的方法,其中,所述步驟三具體包括步驟41,根據(jù)緩存段的名稱和所請求的數(shù)據(jù)的主鍵值,訪問所述緩存項 并査找所請求的數(shù)據(jù);步驟42,為所述緩存段添加段級鎖,判斷所請求的數(shù)據(jù)是否存儲在所述 緩存項中,若已存儲,則進(jìn)入步驟43,若未存儲,則進(jìn)入步驟44;步驟43,判斷所請求的數(shù)據(jù)對應(yīng)的外部數(shù)據(jù)源中的數(shù)據(jù)是否被更新,若 未被更新,則進(jìn)入步驟47,若已被更新,則進(jìn)入歩驟46;步驟44,判斷所請求的數(shù)據(jù)是否已被添加了行級鎖,若沒有被添加,則 進(jìn)入步驟46,若所請求的數(shù)據(jù)已被添加了行級鎖,則進(jìn)入步驟45;步驟45,釋放段級鎖,在所述行級鎖被釋放后,進(jìn)入步驟47;步驟46,釋放所述段級鎖,在所請求的數(shù)據(jù)上添加行級鎖,通過所述接 口,從外部數(shù)據(jù)源獲取所請求的數(shù)據(jù),保存至所述緩存段中,然后進(jìn)入步驟 47;步驟47,輸出所述緩存段中存放的所請求的數(shù)據(jù)。上述的通用緩存的方法,其中,當(dāng)通過所述接口從外部數(shù)據(jù)源獲取所請求 的數(shù)據(jù)之后,還包括以下步驟-步驟51,對所述緩存段添加段級鎖;歩驟52,判斷所述緩存段是否存在足夠的剩余空間存儲所述通過接口獲
取的數(shù)據(jù),若存在足夠的剩余空間,則進(jìn)入步驟53,若不存在足夠的空間,則在所述緩存段中釋放出足夠的空間,然后進(jìn)入步驟53;步驟53,將從所述接口獲取的所請求的數(shù)據(jù)更新所述緩存段,釋放所述段級鎖和行級鎖,輸出更新后所請求的數(shù)據(jù)。上述的通用緩存的方法,其中,所述步驟52中,當(dāng)所述緩存段沒有足夠 的存儲空間時,采用接觸計數(shù)器法在所述緩存段中釋放足夠的存儲空間,具體包括以下步驟步驟61,査找出所述緩存段中被訪問次數(shù)最少的數(shù)據(jù);步驟62,若被訪問次數(shù)最少的數(shù)據(jù)只有一個,則從所述緩存段中刪除所述數(shù)據(jù),若被訪問次數(shù)最少的數(shù)據(jù)有多個,則將所述多個數(shù)據(jù)中占用空間最大的數(shù)據(jù)刪除;步驟63,判斷所述緩存段中的剩余空間是否能存儲所請求的數(shù)據(jù),若能 夠存儲,則進(jìn)入所述步驟53,若不能夠存儲,則返回所述步驟61。 上述的通用緩存的方法,其中,還包括根據(jù)所述緩存段中的各個數(shù)據(jù)的訪問次數(shù)和大小,使用單向鏈表或雙向鏈 表對所述各個數(shù)據(jù)進(jìn)行排序的步驟。上述的通用緩存的方法,其中,每個數(shù)據(jù)為所述鏈表中的一個鏈表節(jié)點,所述排序的步驟具體包括以下步驟步驟81,根據(jù)所述請求的數(shù)據(jù)的主鍵值,査找所述鏈表中是否存在對應(yīng) 的鏈表節(jié)點,若存在所述鏈表節(jié)點,則將所述鏈表節(jié)點的訪問次數(shù)增加l;步驟82,判斷所請求的數(shù)據(jù)的大小是否改變,若沒有改變,則進(jìn)入步驟 84,若所請求的數(shù)據(jù)被更新,所述數(shù)據(jù)大小的改變,則修改對應(yīng)的所述鏈表節(jié)點大小屬性,然后進(jìn)入步驟84;步驟83,若所述鏈表中不存在所述鏈表節(jié)點,則根據(jù)所請求的數(shù)據(jù)的主 鍵值、大小和訪問次數(shù),在所述鏈表中創(chuàng)建新的鏈表節(jié)點,然后進(jìn)入步驟84;步驟84,根據(jù)所述緩存段中各個數(shù)據(jù)的訪問次數(shù)和大小,將多對應(yīng)的鏈 表節(jié)點進(jìn)行排序,將被訪問次數(shù)較少的鏈表節(jié)電排在被訪問次數(shù)較多的鏈表節(jié) 點的前面,在被訪問次數(shù)相同的鏈表節(jié)點中,將數(shù)據(jù)較大的鏈表節(jié)點排在數(shù)據(jù) 較小的鏈表節(jié)點的前面。上述的通用緩存的方法,其中,將所述緩存段中的各個數(shù)據(jù)進(jìn)行排序時,
還包括添加熱點鏈表和冷點鏈表的步驟。 上述的通用緩存的方法,其中,還包括為所述緩存段中各個數(shù)據(jù)設(shè)置包括正常狀態(tài)、更新狀態(tài)或刪除狀態(tài)的狀態(tài) 標(biāo)識的步驟。上述的通用緩存的方法,其中,當(dāng)所述緩存段中的數(shù)據(jù)的狀態(tài)標(biāo)識為更新 狀態(tài)時,還包括當(dāng)所述數(shù)據(jù)被訪問時,通過所述接口從外部數(shù)據(jù)源獲取與所述數(shù)據(jù)對應(yīng)的 新數(shù)據(jù),并更新所述緩存段的步驟;當(dāng)所述緩存段中的數(shù)據(jù)的狀態(tài)標(biāo)識為刪除狀態(tài)時,還包括將通過所述接口從外部數(shù)據(jù)源獲取的數(shù)據(jù),覆蓋所述處于刪除狀態(tài)的數(shù)據(jù) 并存儲的步驟。上述的通用緩存的方法,其中,所述步驟二還包括步驟121,設(shè)置所述緩存段的最大存儲空間參數(shù)和從外部數(shù)據(jù)源讀取數(shù)據(jù) 的接口的實現(xiàn)類參數(shù);步驟122,在緩存系統(tǒng)啟動時,初始化緩存中各個緩存段的名稱和上述設(shè)置參數(shù)。本發(fā)明基于統(tǒng)一 User Interface (用戶調(diào)用接口 )接口的基于Touch Count (接觸計數(shù)器)算法的通用緩存實現(xiàn)方法,具有以下有益效果1. 簡單,統(tǒng)一的UI接口。2. 緩存分段管理,管理清晰(每段只存放各自數(shù)據(jù),與其他段沒有關(guān)系), 讀取性能高(査找只會在本段,而不需要到不相關(guān)的段査找費時),靈活性高(每 個段都可以有自己特殊的獲取外部數(shù)據(jù)接口實現(xiàn),也可以使用同一個)3. 通用性,通過獲取外部數(shù)據(jù)接口屏蔽了不同系統(tǒng)之間的不~-致性。4. 使用Touch Count (接觸計數(shù)器)算法,而不是一般緩存使用的LRU (最近最少使用)算法。5. 對緩存項的更新,不是立即產(chǎn)生而是在實際產(chǎn)生訪問請求的時候進(jìn)行 更新。
圖1是本發(fā)明的緩存模塊處理流程圖;圖2是本發(fā)明中touch count (接觸計數(shù)器)算法操作流程圖。
具體實施方式
本發(fā)明的實施方法如下(a)在緩存系統(tǒng)中設(shè)置一個獲取外部數(shù)據(jù)信息的接口,此接口負(fù)責(zé)當(dāng)緩存中沒有對應(yīng)數(shù)據(jù)時,通用緩存模塊會根據(jù)此接口的 實現(xiàn)去外部數(shù)據(jù)源獲取對應(yīng)數(shù)據(jù)。(b)本發(fā)明中緩存實行分段管理,每段只存放各自的數(shù)據(jù),與其他段沒 有關(guān)系,査找時只在本段不需要到不相關(guān)的緩存段査找,將緩存分成多個緩存段時,需要設(shè)置相關(guān)參數(shù)。包括以下主要參數(shù)緩存段的名稱(本發(fā)明對緩存是分段管理,這樣增加緩存的訪問性能和靈活性);緩存段的最大存儲空間;從外部數(shù)據(jù)源讀取數(shù)據(jù)接口的實現(xiàn)類(此實現(xiàn)類用于從外部數(shù)據(jù)源獲取相關(guān)數(shù)據(jù)到緩存系統(tǒng))。(C)在系統(tǒng)中設(shè)置二級鎖對象,分別包括 第一級段級鎖,在并發(fā)訪問或者并發(fā)修改緩存段時鎖定該緩存段。 第二級行級鎖,在緩存段從外部數(shù)據(jù)源讀取數(shù)據(jù)的時候加行級鎖,釋放段級鎖(一般情況從外部數(shù)據(jù)源讀數(shù)據(jù)是比較耗時的操作),增加緩存模塊的并發(fā)響應(yīng)。(d)當(dāng)緩存模塊收到一個數(shù)據(jù)訪問請求時,緩存模塊根據(jù)請求中攜帶的緩存段的名稱和數(shù)據(jù)Key值(主鍵值,每個數(shù)據(jù)在緩存段中都有一個唯一的 Key值,用于緩存段中快速定位和與其他數(shù)據(jù)區(qū)分)信息,到指定的緩存段去 査找數(shù)據(jù)并且添加段級鎖,當(dāng)所請求的數(shù)據(jù)找到的情況下如果找到并且數(shù)據(jù)對應(yīng)的外部數(shù)據(jù)沒有被更新,將數(shù)據(jù)返回給訪問請求并 且更新數(shù)據(jù)的訪問次數(shù),釋放段級鎖;如果找到但是數(shù)據(jù)對應(yīng)的外部數(shù)據(jù)已經(jīng)被更新,緩存模塊在此緩存段中釋 放段級鎖然后對此數(shù)據(jù)Key值加行級鎖并且調(diào)用獲取外部數(shù)據(jù)接口獲取更新 數(shù)據(jù),將更新數(shù)據(jù)并且更新訪問次數(shù)和數(shù)據(jù)大小,釋放行級鎖;如果緩存段沒 有足夠的空間更新數(shù)據(jù),將根據(jù)Touch Count (接觸計數(shù)器)算法在緩存段中 釋放足夠的空間供數(shù)據(jù)更新當(dāng)所請求的數(shù)據(jù)找不到的情況下如果找不到并且對應(yīng)的數(shù)據(jù)Key沒有加行級鎖時,緩存模塊在此緩存段 中為此數(shù)據(jù)Key加行級鎖并且調(diào)用獲取外部數(shù)據(jù)信息接口獲取新數(shù)據(jù),將新 數(shù)據(jù)加入緩存段并且更新訪問次數(shù)和數(shù)據(jù)大小,釋放此行級鎖;如果緩存段沒 有足夠的空間更新數(shù)據(jù),將根據(jù)Touch Count (接觸計數(shù)器)算法釋放足夠的 空間供數(shù)據(jù)添加。如果找不到并且對應(yīng)的數(shù)據(jù)Key己經(jīng)加行級鎖時,訪問請求將在此行級鎖上等 待,直到解鎖然后從緩存段中輸出所請求的數(shù)據(jù)。(e) 在系統(tǒng)緩存對應(yīng)的數(shù)據(jù)發(fā)生更新的時候,通過緩存更新接口通知緩存 模塊將對應(yīng)的數(shù)據(jù)狀態(tài)位標(biāo)示為更新狀態(tài)(數(shù)據(jù)狀態(tài)包括正常狀態(tài),更新狀態(tài)和 刪除狀態(tài)),此時并不立即更新數(shù)據(jù),只有在該數(shù)據(jù)被再次訪問時才產(chǎn)生實際的 更新操作。(f) 在系統(tǒng)緩存對應(yīng)的數(shù)據(jù)被刪除的時候,通過緩存刪除接口通知緩存模 塊將對應(yīng)的數(shù)據(jù)狀態(tài)標(biāo)識為刪除狀態(tài)(數(shù)據(jù)狀態(tài)包括正常狀態(tài),更新狀態(tài)和刪除 狀態(tài)),此時并不立即刪除數(shù)據(jù),而是在添加新的數(shù)據(jù)時才覆蓋此刪除的數(shù)據(jù)。進(jìn)一步地,上述通用緩存的實現(xiàn)方法具有以下特點系統(tǒng)對緩存的更新是 通過將數(shù)據(jù)的狀態(tài)標(biāo)識修改為更新狀態(tài)(數(shù)據(jù)狀態(tài)包括正常狀態(tài),更新狀態(tài)和刪 除狀態(tài))。被標(biāo)示為更新狀態(tài)的數(shù)據(jù)只有被再次訪問的時候才會實際的更新內(nèi) 容,然后將此數(shù)據(jù)的狀態(tài)位修改為正常狀態(tài);如果此數(shù)據(jù)一直沒有被訪問內(nèi)容 更新的操作就不會產(chǎn)生。此方法可以有效的避免不必要的實際內(nèi)容更新,避免 實際內(nèi)容更新時的系統(tǒng)消耗。1) 當(dāng)數(shù)據(jù)在被訪問前產(chǎn)生的N次更新,此方法只產(chǎn)生1次實際內(nèi)容更新, 避免了N-1次內(nèi)容更新。2) 當(dāng)數(shù)據(jù)有更新,但是一直沒有被訪問,此方法避免了 l此內(nèi)容更新。 此外,系統(tǒng)對緩存項中數(shù)據(jù)的更新和刪除可以通過Web Service (Web服務(wù))或者Socket (套接字)在遠(yuǎn)端操作。使用本發(fā)明所述的通用緩存系統(tǒng)時,需要注意要在系統(tǒng)啟動時初始化配置
信息,包括緩存段的名稱,緩存段空間的最大閥值,外部數(shù)據(jù)讀取類。 下面結(jié)合附圖及具體實施例對本發(fā)明進(jìn)行詳細(xì)說明。圖1是本發(fā)明的處理流程示意圖。如圖1所示,用戶訪問緩存系統(tǒng)流程包 括如下步驟步驟S101:用戶提供緩存段的名稱(本發(fā)明的緩存系統(tǒng)是分段管理)和所請 求的數(shù)據(jù)Key值,訪問緩存系統(tǒng)請求相關(guān)數(shù)據(jù);步驟S102:緩存系統(tǒng)根據(jù)用戶提供的緩存段的名稱,為該緩存段添加段 級鎖;步驟S103:緩存系統(tǒng)根據(jù)用戶提供的所請求的數(shù)據(jù)Key值,在指定的緩 存段里査找數(shù)據(jù),判斷所請求的數(shù)據(jù)是否被緩存;步驟S104:如果步驟S103結(jié)果為數(shù)據(jù)已經(jīng)被緩存,緩存系統(tǒng)將判斷此數(shù) 據(jù)是否需要更新;步驟S105:如果步驟S103結(jié)果為數(shù)據(jù)沒有被緩存,緩存系統(tǒng)將判斷該請 求的數(shù)據(jù)在該緩存段中是否已添加了行級鎖;步驟S106:如果步驟S104結(jié)果為數(shù)據(jù)不需要更新,緩存系統(tǒng)將該所請求 的數(shù)據(jù)輸出返回給用戶,流程結(jié)束;步驟S107:如果步驟S104結(jié)果為數(shù)據(jù)需要更新,緩存系統(tǒng)將釋放步驟 S102為該緩存段添加的段級鎖,然后為該數(shù)據(jù)在緩存段中添加行級鎖;步驟S108:如果步驟S105結(jié)果為數(shù)據(jù)已經(jīng)添加了行級鎖,緩存系統(tǒng)將釋 放步驟S102為該緩存段添加的段級鎖,然后在該數(shù)據(jù)的行級鎖上等待,直到 該數(shù)據(jù)的行級鎖被釋放;步驟S109:緩存系統(tǒng)通過"獲取外部數(shù)據(jù)接口 "獲取該數(shù)據(jù)的更新數(shù)據(jù)。步驟S110:緩存系統(tǒng)根據(jù)用戶提供的緩存段的名稱,為緩存段添加段級鎖。步驟Slll:緩存系統(tǒng)判斷該緩存段是否有足夠的剩余空間存放數(shù)據(jù)。步驟S112:如果步驟Slll結(jié)果為有足夠的剩余空間或者步驟S113結(jié)束 后,緩存系統(tǒng)將用步驟S109獲取的數(shù)據(jù)更新緩存段。步驟S113:如果步驟S111結(jié)果為沒有足夠的剩余空間,緩存系統(tǒng)將使用 Touch Count (接觸計數(shù)器)算法在該緩存段中釋放足夠的空間。步驟S114:在步驟S112結(jié)束后,緩存系統(tǒng)釋放步驟S107為該緩存段添
加的行級鎖和步驟SI 10添加的段級鎖。步驟S115:在步驟S108結(jié)束后,緩存系統(tǒng)將該請求的數(shù)據(jù)返回給用戶, 流程結(jié)束。步驟S116:在步驟S114結(jié)束后,緩存系統(tǒng)將此數(shù)據(jù)返回給用戶,流程結(jié)束。在緩存項訪問次數(shù)和緩存項本身大小發(fā)生變化時,可以使用單向鏈表或雙向鏈表對緩存項進(jìn)行Touch Count (接觸計數(shù)器)排序。為了避免在每次緩存段空間不足時對緩存項排序造成的單點性能瓶頸,當(dāng) 緩存段空間不足的情形下能快捷的獲取淘汰項,本實施例中,采用雙向鏈表對 緩存項進(jìn)行Touch Count排序。在緩存項排序時添加熱點鏈表和冷點鏈表,更合理的使用Touch Count(接 觸計數(shù)器)算法。Touch Count (接觸計數(shù)器)算法是根據(jù)數(shù)據(jù)的訪問次數(shù)和數(shù)據(jù)本身的大 小來決定在緩存段超過指定大小的時候,選擇需要淘汰的緩存項。具體算法是 當(dāng)系統(tǒng)對數(shù)據(jù)訪問時,數(shù)據(jù)的訪問次數(shù)累加一。當(dāng)緩存段的剩余空間不夠存放 新創(chuàng)建的數(shù)據(jù)時,將根據(jù)下面的步驟淘汰數(shù)據(jù)(1) 找到訪問次數(shù)最少的數(shù)據(jù)。(2) 如果找到的訪問次數(shù)最少的數(shù)據(jù)只有一項,則跳轉(zhuǎn)到(3),否則跳 轉(zhuǎn)到(4)(3) 從緩存段中淘汰此數(shù)據(jù),然后跳轉(zhuǎn)到(5)(4) 然后在找到的多個數(shù)據(jù)中就數(shù)據(jù)內(nèi)容的大小,把最大的淘汰掉,然 后跳轉(zhuǎn)到(5)(5) 判斷緩存段中剩余的空間是否能存放下新添加的數(shù)據(jù)。如果可以跳 轉(zhuǎn)到(6),否則跳轉(zhuǎn)到(l)(6) 在緩存段中添加新的數(shù)據(jù)。這里要說明的是,系統(tǒng)中設(shè)置的緩存大小是有限的。這主要是因為系統(tǒng)的 內(nèi)存是有限的,稀缺的資源。如果緩存系統(tǒng)占用的內(nèi)存過大,可能會影響其他 進(jìn)程運行并且會導(dǎo)致系統(tǒng)頻繁的使用虛擬緩存或swap (交換區(qū))區(qū),嚴(yán)重影 響系統(tǒng)性能;所以在實際的系統(tǒng)中,必須為緩存大小設(shè)置最大閥值。而此緩存 系統(tǒng)是分段管理的,所以對緩存大小的限制是分散到每個緩存段上面的,系統(tǒng)
對每個緩存段都使用一個長整型變量來表示此段最大允許的緩存大小,當(dāng)緩存段的數(shù)據(jù)內(nèi)容的大小超過緩存段的最大值時,系統(tǒng)會通過touch count (接觸計數(shù)器)算法釋放足夠的空間,緩存此項內(nèi)容。圖2是本發(fā)明中touch count (接觸計數(shù)器)算法操作流程圖。如圖2所 示,具體包括以下步驟步驟S201,根據(jù)請求訪問的數(shù)據(jù)的內(nèi)容Key獲取對應(yīng)的鏈表節(jié)點;步驟S202,判斷雙向鏈表中是否有對應(yīng)的鏈表節(jié)點;步驟S203,如果不存在該鏈表節(jié)點,則根據(jù)所請求的數(shù)據(jù)Key值,內(nèi)容 大小和訪問次數(shù)(初始取值為1)創(chuàng)建該鏈表節(jié)點,步驟S204,如果存在該鏈表節(jié)點,則將該鏈表節(jié)點的訪問次數(shù)增加1;步驟S205,步驟S203結(jié)束后,判斷雙向鏈表的鏈表頭和鏈表尾是否為空, 如果不為空進(jìn)入步驟S208,如果鏈表頭或鏈表尾有空,則進(jìn)入步驟S207;步驟S206,步驟S204結(jié)束后,判斷鏈表節(jié)點對應(yīng)的所請求的數(shù)據(jù)是否改 變(如果更新了緩存中的數(shù)據(jù),則數(shù)據(jù)的內(nèi)容大小會改變),如果改變,進(jìn)入 步驟S209,如果沒有改變,進(jìn)入步驟S208;步驟S207,將鏈表頭和鏈表尾都指向剛創(chuàng)建的鏈表節(jié)點;步驟S208,根據(jù)節(jié)點對象的訪問次數(shù)和內(nèi)容大小進(jìn)行排序,訪問次數(shù)越 小的節(jié)點越靠前,在訪問次數(shù)相同的情況下,內(nèi)容越大的越靠前,根據(jù)前述規(guī) 則將新創(chuàng)建的節(jié)點添加到鏈表中,然后修改前后節(jié)點和本節(jié)點的相應(yīng)的屬性。下面分別介紹本發(fā)明的四個實施例。第一實施例當(dāng)前所請求的數(shù)據(jù)不在指定的緩存段中并且對應(yīng)的緩存段有足夠的剩余 空間,存放請求的數(shù)據(jù)。當(dāng)系統(tǒng)新收到一個用戶請求內(nèi)容時,系統(tǒng)判斷該數(shù)據(jù)不在指定的緩存段 中,系統(tǒng)為所請求的數(shù)據(jù)key分配行級鎖,然后從外部數(shù)據(jù)源獲取所請求的數(shù) 據(jù),調(diào)用段級鎖將此內(nèi)容添加到緩存系統(tǒng)中對應(yīng)的緩存段中,釋放添加的鎖, 然后返回此內(nèi)容給用戶。第二實施例當(dāng)所請求的數(shù)據(jù)已經(jīng)在緩存段中時,緩存系統(tǒng)獲取所請求的數(shù)據(jù)并輸出返 回給用戶。
第三實施例當(dāng)所請求的數(shù)據(jù)不在緩存段中并且該緩存段沒有足夠的剩余空間時,緩存系統(tǒng)為所請求的數(shù)據(jù)key分配行級鎖,然后通過獲取外部數(shù)據(jù)接口從外部數(shù)據(jù) 源獲取所請求的數(shù)據(jù),并且通過touch count (接觸計數(shù)器)算法釋放足夠的空 間,將所請求的數(shù)據(jù)添加對應(yīng)的緩存段中,然后釋放所加的鎖,最后輸出所請 求的數(shù)據(jù)給用戶。 第四實施例當(dāng)緩存系統(tǒng)新收到一個用戶的數(shù)據(jù)訪問請求時,緩存系統(tǒng)發(fā)現(xiàn)所請求的數(shù) 據(jù)被添加行級鎖,正在被另一個用戶請求時,讓用戶等待,直到該行級鎖被釋 放。然后緩存系統(tǒng)喚醒用戶,輸出所請求的數(shù)據(jù)輸出返回給用戶。當(dāng)然,本發(fā)明還可有其它多種實施例,在不背離本發(fā)明精神及其實質(zhì)的情 況下,熟悉本領(lǐng)域的普通技術(shù)人員當(dāng)可根據(jù)本發(fā)明做出各種相應(yīng)的改變和變 形,但這些相應(yīng)的改變和變形都應(yīng)屬于本發(fā)明所附的權(quán)利要求的保護(hù)范圍。
權(quán)利要求
1.一種通用緩存的方法,用于獲取緩存中存儲的數(shù)據(jù),其特征在于,包括步驟一,在緩存中設(shè)置與外部數(shù)據(jù)源連接的用于獲取外部數(shù)據(jù)的接口;步驟二,將緩存分配成多個緩存段,將一個數(shù)據(jù)只存放在一個緩存段里,設(shè)置每個緩存段的名稱和數(shù)據(jù)的主健值;步驟三,當(dāng)緩存系統(tǒng)收到數(shù)據(jù)訪問請求時,根據(jù)請求訪問的緩存段名稱和數(shù)據(jù)的主健值,訪問對應(yīng)的緩存段,并判斷所述緩存段中是否已存儲所請求的數(shù)據(jù),若已存儲,則輸出所請求的數(shù)據(jù),若未存儲,則通過所述接口從外部數(shù)據(jù)源獲取所請求的數(shù)據(jù),保存所請求的數(shù)據(jù)至所述緩存段中并輸出。
2. 根據(jù)權(quán)利要求1所述的通用緩存的方法,其特征在于,還包括 當(dāng)訪問或者修改所述緩存段時,設(shè)置段級鎖,鎖定所述緩存段的步驟;和 當(dāng)從所述外部數(shù)據(jù)源讀取所述請求的數(shù)據(jù)時,為所述緩存段中對應(yīng)的數(shù)據(jù)設(shè)置行級鎖,鎖定所請求的數(shù)據(jù)的步驟。
3. 根據(jù)權(quán)利要求1所述的通用緩存的方法,其特征在于,所述步驟三還 包括步驟31,當(dāng)所述緩存段中已存儲所請求的數(shù)據(jù)時,判斷所述已存儲的數(shù) 據(jù)對應(yīng)的外部數(shù)據(jù)源中的數(shù)據(jù)是否已經(jīng)被更新;步驟32,若未被更新,則直接輸出所述已存儲的數(shù)據(jù),若已被更新,則 調(diào)用所述接口從外部數(shù)據(jù)源獲取對應(yīng)的數(shù)據(jù)并更新所述緩存項中存儲的數(shù)據(jù)。
4. 根據(jù)權(quán)利要求2或3所述的通用緩存的方法,其特征在于,所述步驟 三具體包括步驟41,根據(jù)緩存段的名稱和所請求的數(shù)據(jù)的主鍵值,訪問所述緩存項 并查找所請求的數(shù)據(jù);步驟42,為所述緩存段添加段級鎖,判斷所請求的數(shù)據(jù)是否存儲在所述 緩存項中,若已存儲,則進(jìn)入步驟43,若未存儲,則進(jìn)入歩驟44;步驟43,判斷所請求的數(shù)據(jù)對應(yīng)的外部數(shù)據(jù)源中的數(shù)據(jù)是否被更新,若 未被更新,則進(jìn)入步驟47,若已被更新,則進(jìn)入步驟46;步驟44,判斷所請求的數(shù)據(jù)是否已被添加了行級鎖,若沒有被添加,則進(jìn)入步驟46,若所請求的數(shù)據(jù)已被添加了行級鎖,則進(jìn)入步驟45;步驟45,釋放段級鎖,在所述行級鎖被釋放后,進(jìn)入步驟47;步驟46,釋放所述段級鎖,在所請求的數(shù)據(jù)上添加行級鎖,通過所述接 口,從外部數(shù)據(jù)源獲取所請求的數(shù)據(jù),保存至所述緩存段中,然后進(jìn)入步驟47;步驟47,輸出所述緩存段中存放的所請求的數(shù)據(jù)。
5. 根據(jù)權(quán)利要求4所述的通用緩存的方法,其特征在于,當(dāng)通過所述接口從外部數(shù)據(jù)源獲取所請求的數(shù)據(jù)之后,還包括以下步驟步驟51,對所述緩存段添加段級鎖;步驟52,判斷所述緩存段是否存在足夠的剩余空間存儲所述通過接口獲 取的數(shù)據(jù),若存在足夠的剩余空間,則進(jìn)入步驟53,若不存在足夠的空間, 則在所述緩存段中釋放出足夠的空間,然后進(jìn)入步驟53;步驟53,將從所述接口獲取的所請求的數(shù)據(jù)更新所述緩存段,釋放所述 段級鎖和行級鎖,輸出更新后所請求的數(shù)據(jù)。
6. 根據(jù)權(quán)利要求5所述的通用緩存的方法,其特征在于,所述步驟52 中,當(dāng)所述緩存段沒有足夠的存儲空間時,采用接觸計數(shù)器法在所述緩存段中 釋放足夠的存儲空間,具體包括以下步驟步驟61,査找出所述緩存段中被訪問次數(shù)最少的數(shù)據(jù);步驟62,若被訪問次數(shù)最少的數(shù)據(jù)只有一個,則從所述緩存段中刪除所述數(shù)據(jù),若被訪問次數(shù)最少的數(shù)據(jù)有多個,則將所述多個數(shù)據(jù)中占用空間最大的數(shù)據(jù)刪除;步驟63,判斷所述緩存段中的剩余空間是否能存儲所請求的數(shù)據(jù),若能 夠存儲,則進(jìn)入所述步驟53,若不能夠存儲,則返回所述步驟61。
7. 根據(jù)權(quán)利要求6所述的通用緩存的方法,其特征在于,還包括 根據(jù)所述緩存段中的各個數(shù)據(jù)的訪問次數(shù)和大小,使用單向鏈表或雙向鏈表對所述各個數(shù)據(jù)進(jìn)行排序的歩驟。
8. 根據(jù)權(quán)利要求7所述的通用緩存的方法,其特征在于,每個數(shù)據(jù)為所 述鏈表中的一個鏈表節(jié)點,所述排序的步驟具體包括以下步驟步驟81,根據(jù)所述請求的數(shù)據(jù)的主鍵值,查找所述鏈表中是否存在對應(yīng) 的鏈表節(jié)點,若存在所述鏈表節(jié)點,則將所述鏈表節(jié)點的訪問次數(shù)增加l; 步驟82,判斷所請求的數(shù)據(jù)的大小是否改變,若沒有改變,則進(jìn)入步驟 84,若所請求的數(shù)據(jù)被更新,所述數(shù)據(jù)大小的改變,則修改對應(yīng)的所述鏈表節(jié) 點大小屬性,然后進(jìn)入步驟84;步驟83,若所述鏈表中不存在所述鏈表節(jié)點,則根據(jù)所請求的數(shù)據(jù)的主 鍵值、大小和訪問次數(shù),在所述鏈表中創(chuàng)建新的鏈表節(jié)點,然后進(jìn)入步驟84;步驟84,根據(jù)所述緩存段中各個數(shù)據(jù)的訪問次數(shù)和大小,將多對應(yīng)的鏈 表節(jié)點進(jìn)行排序,將被訪問次數(shù)較少的鏈表節(jié)電排在被訪問次數(shù)較多的鏈表節(jié) 點的前面,在被訪問次數(shù)相同的鏈表節(jié)點中,將數(shù)據(jù)較大的鏈表節(jié)點排在數(shù)據(jù) 較小的鏈表節(jié)點的前面。
9. 根據(jù)權(quán)利要求7或8所述的通用緩存的方法,其特征在于,將所述緩 存段中的各個數(shù)據(jù)進(jìn)行排序時,還包括添加熱點鏈表和冷點鏈表的步驟。
10. 根據(jù)權(quán)利要求2或3所述的通用緩存的方法,其特征在于,還包括 為所述緩存段中各個數(shù)據(jù)設(shè)置包括正常狀態(tài)、更新狀態(tài)或刪除狀態(tài)的狀態(tài)標(biāo)識的步驟。
11. 根據(jù)權(quán)利要求10所述的通用緩存的方法,其特征在于,當(dāng)所述緩存段中的數(shù)據(jù)的狀態(tài)標(biāo)識為更新狀態(tài)時,還包括當(dāng)所述數(shù)據(jù)被訪問時,通過所述接口從外部數(shù)據(jù)源獲取與所述數(shù)據(jù)對應(yīng)的新數(shù)據(jù),并更新所述緩存段的步驟;當(dāng)所述緩存段中的數(shù)據(jù)的狀態(tài)標(biāo)識為刪除狀態(tài)時,還包括將通過所述接口從外部數(shù)據(jù)源獲取的數(shù)據(jù),覆蓋所述處于刪除狀態(tài)的數(shù)據(jù) 并存儲的步驟。
12. 根據(jù)權(quán)利要求1所述的通用緩存的方法,其特征在于,所述步驟二還包括步驟121,設(shè)置所述緩存段的最大存儲空間參數(shù)和從外部數(shù)據(jù)源讀取數(shù)據(jù)的接口的實現(xiàn)類參數(shù);步驟122,在緩存系統(tǒng)啟動時,初始化緩存中各個緩存段的名稱和上述設(shè)置參數(shù)。
全文摘要
本發(fā)明提出了一種通用緩存的方法,用于獲取緩存中存儲的數(shù)據(jù),其中,包括步驟一,在緩存中設(shè)置與外部數(shù)據(jù)源連接的用于獲取外部數(shù)據(jù)的接口;步驟二,將緩存分配成多個緩存段,將一個數(shù)據(jù)只存放在一個緩存段里,設(shè)置每個緩存段的名稱和數(shù)據(jù)的主健值;步驟三,當(dāng)緩存系統(tǒng)收到數(shù)據(jù)訪問請求時,根據(jù)請求訪問的緩存段名稱和數(shù)據(jù)的主健值,訪問對應(yīng)的緩存段,并判斷緩存段中是否已存儲所請求的數(shù)據(jù),若已存儲,則輸出所請求的數(shù)據(jù),若未存儲,則通過接口從外部數(shù)據(jù)源獲取所請求的數(shù)據(jù),保存所請求的數(shù)據(jù)至緩存段中并輸出。
文檔編號G06F12/08GK101131673SQ20061011251
公開日2008年2月27日 申請日期2006年8月22日 優(yōu)先權(quán)日2006年8月22日
發(fā)明者良 單, 吉 呂, 唐鯤鵬 申請人:中興通訊股份有限公司