欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

一種緩存分配方法、裝置及設(shè)備的制作方法

文檔序號:7776778閱讀:300來源:國知局
一種緩存分配方法、裝置及設(shè)備的制作方法
【專利摘要】本發(fā)明實施例提供了一種緩存分配方法、裝置及設(shè)備,當(dāng)接收到待緩存數(shù)據(jù)時,根據(jù)緩存隊列中寫入點指示的當(dāng)前可用緩存塊的當(dāng)前可用位置,將待緩存數(shù)據(jù)從所述當(dāng)前可用位置寫入所述當(dāng)前可用緩存塊;當(dāng)當(dāng)前可用緩存塊的當(dāng)前剩余可用空間不小于預(yù)設(shè)最大長度時,將寫入點指示的位置更新為當(dāng)前剩余可用空間的起始位置;當(dāng)當(dāng)前剩余可用空間小于預(yù)設(shè)最大長度時,從預(yù)設(shè)緩存池中獲取一個緩存塊加入所述緩存隊列的隊尾,并將寫入點指示的位置更新為加入緩存塊的起始位置,其中,預(yù)設(shè)緩存池用于存儲預(yù)先設(shè)置的多個長度不小于預(yù)設(shè)最大長度的緩存塊。本發(fā)明實施例提供的緩存分配方法使得緩存的分配更加合理。本發(fā)明涉及計算機【技術(shù)領(lǐng)域】。
【專利說明】一種緩存分配方法、裝置及設(shè)備
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及計算機【技術(shù)領(lǐng)域】,尤其涉及一種緩存分配方法、裝置及設(shè)備。
【背景技術(shù)】
[0002]緩存的管理和分配在計算機編程領(lǐng)域、網(wǎng)絡(luò)通信領(lǐng)域等領(lǐng)域中都有很廣泛的應(yīng)用。因為在很多情況下都需要對一些臨時數(shù)據(jù)進行臨時存儲,下面以網(wǎng)絡(luò)通信領(lǐng)域中,對接收到的數(shù)據(jù)包的緩存為例進行說明。
[0003]Web應(yīng)用防火墻(WAF, Web Application Firewall)作為Web客戶端和服務(wù)器端的中間設(shè)備,部署在Web服務(wù)器之前,對超文本傳輸協(xié)議(Hyper Text Transfer Protocol,簡稱:HTTP)或基于安全套接字的超文本傳輸協(xié)議(Hypertext Transfer Protocol overSecure Socket Layer,簡稱HTTPS)的雙向流量執(zhí)行檢測掃描來保證Web應(yīng)用的安全。WAF的“在線檢測”工作模式,通常是通過Web “代理(Proxy)”的方式,在Web客戶端和Web服務(wù)器之間分別建立TCP連接,作為兩者之間的中間人,對HTTP、HTTPS流量進行掃描,用以檢測來自惡意攻擊者的非法有害請求,并且對該類請求采取相應(yīng)的措施進行處理;而WAF的“離線檢測”工作模式,不是作為中間人的角色,而是作為旁觀者的角色,通過報文嗅探的方式,將Web客戶端和Web服務(wù)器之間的HTTP、HTTPS交互的TCP報文抓取到WAF中,并且在應(yīng)用層重組TCP連接,對重組后的TCP連接,進行安全檢測、審計等工作。
[0004]進一步地,在WAF “離線檢測”工作模式下,需要對嗅探后的報文進行緩存,現(xiàn)有技術(shù)中主要包括如下幾種方案:
[0005]第一種方案:隨時為接收到的報文申請緩存塊
[0006]由嗅探線程申請一塊能容納最大長度的報文(可以稱為“大報文”)的緩存作為嗅探報文的臨時存儲區(qū)。具體為當(dāng)報文嗅探成功后,根據(jù)嗅探報文的大小,從系統(tǒng)中申請相應(yīng)大小的緩存塊,將報文從臨時存儲區(qū)拷貝至新申請的緩存塊,并且將新申請的緩存塊插入到處理隊列,多個處理線程從處理隊列中獲取報文進行處理。但是,該種機制存在如下問題:首先,頻繁地從系統(tǒng)申請緩存,會造成頻繁地系統(tǒng)調(diào)用,降低工作效率;其次,從報文的臨時存儲區(qū)將報文拷貝至新申請的緩存塊的過程,也會耗費一定的時間,降低對報文的處理速度。
[0007]第二種方案:使用固定大小緩存池方案
[0008]這種方案的處理機制是在第一種方案的基礎(chǔ)上,對第一種方案存在的兩個問題進行優(yōu)化處理得到的。具體為在程序啟動時,創(chuàng)建一個固定大小緩存塊為基礎(chǔ)的“緩存池”,每個緩存塊大小為大報文的大小,該緩存池提供申請、釋放固定大報文的接口。在調(diào)用報文嗅探的系統(tǒng)調(diào)用時,直接使用從緩存池中獲得的大報文緩存,而不使用臨時存儲區(qū)。實現(xiàn)了所謂的“零拷貝”,解決了第一種方案中存在的兩個問題,但是卻引入了一個新問題:由于要嗅探的報文既可能包含幾KB的大報文、也可能包含幾十B的“小報文”,如果存儲每個報文都使用存儲大報文的緩存塊進行存儲,會造成大量的緩存浪費。當(dāng)網(wǎng)口瞬間流量較大,且包含大量小報文,而處理流程不夠迅速時,就會很快用完緩存池空間。如果從緩存池中申請不到緩存塊,也會造成一定的丟包率。

【發(fā)明內(nèi)容】

[0009]本發(fā)明實施例提供了一種緩存分配方法、裝置及設(shè)備,用以解決現(xiàn)有技術(shù)中緩存分配不合理的問題。
[0010]基于上述問題,本發(fā)明實施例提供的一種緩存分配方法,包括:
[0011]當(dāng)接收到待緩存數(shù)據(jù)時,根據(jù)緩存隊列中寫入點指示的當(dāng)前可用緩存塊的當(dāng)前可用位置,將所述待緩存數(shù)據(jù)從所述當(dāng)前可用位置寫入所述當(dāng)前可用緩存塊;
[0012]當(dāng)所述當(dāng)前可用緩存塊的當(dāng)前剩余可用空間不小于預(yù)設(shè)最大長度時,將所述寫入點指示的位置更新為所述當(dāng)前剩余可用空間的起始位置;
[0013]當(dāng)所述當(dāng)前剩余可用空間小于預(yù)設(shè)最大長度時,從預(yù)設(shè)緩存池中獲取一個緩存塊加入所述緩存隊列的隊尾,并將所述寫入點指示的位置更新為加入緩存塊的起始位置,其中,所述預(yù)設(shè)緩存池用于存儲預(yù)先設(shè)置的多個長度不小于所述預(yù)設(shè)最大長度的緩存塊。
[0014]本發(fā)明實施例提供的一種緩存分配裝置,包括:
[0015]寫入模塊,用于當(dāng)接收到待緩存數(shù)據(jù)時,根據(jù)緩存隊列中寫入點指示的當(dāng)前可用緩存塊的當(dāng)前可用位置,將所述待緩存數(shù)據(jù)從所述當(dāng)前可用位置寫入所述當(dāng)前可用緩存塊;
[0016]更新模塊,用于當(dāng)所述當(dāng)前可用緩存塊的當(dāng)前剩余可用空間不小于預(yù)設(shè)最大長度時,將所述寫入點指示的位置更新為所述當(dāng)前剩余可用空間的起始位置;當(dāng)所述當(dāng)前剩余可用空間小于預(yù)設(shè)最大長度時,從預(yù)設(shè)緩存池中獲取一個緩存塊加入所述緩存隊列的隊尾,并將所述寫入點指示的位置更新為加入緩存塊的起始位置,其中,所述預(yù)設(shè)緩存池用于存儲預(yù)先設(shè)置的多個長度不小于所述預(yù)設(shè)最大長度的緩存塊。
[0017]本發(fā)明實施例提供的一種緩存分配設(shè)備,包括上述緩存分配裝置。
[0018]本發(fā)明實施例的有益效果包括:
[0019]本發(fā)明實施例提供的一種緩存分配方法、裝置及設(shè)備,當(dāng)接收到待緩存數(shù)據(jù)時,根據(jù)緩存隊列中寫入點指示的當(dāng)前可用緩存塊的當(dāng)前可用位置,將待緩存數(shù)據(jù)從所述當(dāng)前可用位置寫入所述當(dāng)前可用緩存塊;當(dāng)當(dāng)前可用緩存塊的當(dāng)前剩余可用空間不小于預(yù)設(shè)最大長度時,將寫入點指示的位置更新為當(dāng)前剩余可用空間的起始位置;當(dāng)當(dāng)前剩余可用空間小于預(yù)設(shè)最大長度時,從預(yù)設(shè)緩存池中獲取一個緩存塊加入所述緩存隊列的隊尾,并將寫入點指示的位置更新為加入緩存塊的起始位置,其中,預(yù)設(shè)緩存池用于存儲預(yù)先設(shè)置的多個長度不小于預(yù)設(shè)最大長度的緩存塊。由于緩存隊列中的緩存塊長度大于預(yù)設(shè)最大長度,采用本發(fā)明實施例提供的一種緩存分配方法對嗅探數(shù)據(jù)包進行緩存分配,可以將預(yù)設(shè)最大長度設(shè)置為不小于“大報文”長度,當(dāng)嗅探到的數(shù)據(jù)包長度較大時,可以獨自占用一個緩存塊,當(dāng)嗅探到的數(shù)據(jù)包長度較小、且多個小數(shù)據(jù)包長度和不大于預(yù)設(shè)最大長度時,可以使多個小數(shù)據(jù)包共同占用一個緩存塊,不僅實現(xiàn)了所謂的“零拷貝”,還節(jié)省了緩存空間,減小了丟包率,使得緩存的分配更加合理。
【專利附圖】

【附圖說明】
[0020]圖1為本發(fā)明實施例提供的一種緩存分配方法的流程圖;[0021]圖2為本發(fā)明實施例1提供的一種緩存分配方法的流程圖;
[0022]圖3為本發(fā)明實施例2提供的判斷當(dāng)前待讀取數(shù)據(jù)之后是否存儲有待讀取數(shù)據(jù)的方法的流程圖;
[0023]圖4為本發(fā)明實施例3提供的緩存隊列的初始化的流程圖;
[0024]圖5a-圖5f為本發(fā)明實施例提供的以WAF “離線檢測”工作模式為例,對嗅探后的報文進行緩存過程的示意圖;
[0025]圖6為本發(fā)明實施例提供的一種緩存分配裝置的結(jié)構(gòu)示意圖。
【具體實施方式】
[0026]本發(fā)明實施例提供了一種緩存分配方法、裝置及設(shè)備,以下結(jié)合說明書附圖對本發(fā)明的優(yōu)選實施例進行說明,應(yīng)當(dāng)理解,此處所描述的優(yōu)選實施例僅用于說明和解釋本發(fā)明,并不用于限定本發(fā)明。并且在不沖突的情況下,本申請中的實施例及實施例中的特征可以相互組合。
[0027]本發(fā)明實施例提供一種緩存分配方法,如圖1所示,包括:
[0028]S101、當(dāng)接收到待緩存數(shù)據(jù)時,根據(jù)緩存隊列中寫入點指示的當(dāng)前可用緩存塊的當(dāng)前可用位置,將待緩存數(shù)據(jù)從當(dāng)前可用位置寫入當(dāng)前可用緩存塊。
[0029]S102、當(dāng)當(dāng)前可用緩存塊的當(dāng)前剩余可用空間不小于預(yù)設(shè)最大長度時,將寫入點指示的位置更新為當(dāng)前剩余可用空間的起始位置。
[0030]S103、當(dāng)當(dāng)前剩余可用空間小于預(yù)設(shè)最大長度時,從預(yù)設(shè)緩存池中獲取一個緩存塊加入緩存隊列的隊尾,并將寫入點指示的位置更新為加入緩存塊的起始位置,其中,預(yù)設(shè)緩存池用于存儲預(yù)先設(shè)置的多個長度不小于預(yù)設(shè)最大長度的緩存塊。
[0031]較佳地,本實施例更適用于能夠預(yù)先確定需要緩存的待緩存數(shù)據(jù)的最大長度的情況。
[0032]下面結(jié)合附圖,用具體實施例對本發(fā)明提供的方法及相關(guān)設(shè)備進行詳細(xì)描述。
[0033]實施例1:
[0034]本發(fā)明實施例1中,如圖2所示,具體包括如下步驟:
[0035]S201、當(dāng)接收到待緩存數(shù)據(jù)時,根據(jù)緩存隊列中寫入點指示的當(dāng)前可用緩存塊的當(dāng)前可用位置,將待緩存數(shù)據(jù)從當(dāng)前可用位置寫入當(dāng)前可用緩存塊。
[0036]S202、判斷當(dāng)前可用緩存塊的當(dāng)前剩余可用空間是否不小于預(yù)設(shè)最大長度,若是,則進入步驟S203 ;若否,則進入步驟S204。
[0037]S203、當(dāng)當(dāng)前可用緩存塊的當(dāng)前剩余可用空間不小于預(yù)設(shè)最大長度時,將寫入點指示的位置更新為當(dāng)前剩余可用空間的起始位置。進入步驟S201。
[0038]S204、當(dāng)當(dāng)前剩余可用空間小于預(yù)設(shè)最大長度時,從預(yù)設(shè)緩存池中獲取一個緩存塊加入緩存隊列的隊尾,并將寫入點指示的位置更新為加入緩存塊的起始位置,其中,預(yù)設(shè)緩存池用于存儲預(yù)先設(shè)置的多個長度不小于預(yù)設(shè)最大長度的緩存塊。進入步驟S201。
[0039]進一步地,本步驟中,當(dāng)當(dāng)前剩余可用空間小于預(yù)設(shè)最大長度時,將寫入點指示的位置更新為加入緩存塊的起始位置,那么,該當(dāng)前剩余可用空間會成為緩存隊列中的“碎片”。即使緩存隊列中存在一些碎片,由于碎片的長度比較小,因此,本發(fā)明實施例提供的緩存分配方法,與現(xiàn)有技術(shù)相比,仍然能夠更加充分地利用緩存資源,使緩存分配更合理。[0040]進一步地,當(dāng)當(dāng)前剩余可用空間為“碎片”時,將寫入點指示的位置更新為加入緩存塊的起始位置,而不更新為“碎片”的起始位置,原因如下:
[0041]由于“碎片”的長度小于預(yù)設(shè)最大長度,那么,就可能接收到的下一個待緩存數(shù)據(jù)的長度大于該“碎片”的長度,如果要利用該“碎片”存儲大于“碎片”長度的待緩存數(shù)據(jù),需要將該待緩存數(shù)據(jù)跨塊存儲,也就是說,將該待緩存數(shù)據(jù)拆分成兩個部分,第一部分存儲在該“碎片”中,另一部分存儲在下一個緩存塊中,并且在讀取時,將該跨塊存儲的數(shù)據(jù)進行組合。這些拆分和組合的工作需要耗費一定的內(nèi)存。
[0042]進一步地,本發(fā)明實施例提供的緩存分配方法,可以看作是一個生產(chǎn)者和消費者模型,當(dāng)生產(chǎn)和消費的速度平衡時,該模型能夠取得最佳效果。也就是說,可以將從緩存池中獲取緩存塊放入緩存隊列中看作是生產(chǎn)的過程,將在緩存塊中寫入待緩存數(shù)據(jù)看作是消費的過程。雖然從表面上看浪費了“碎片”的空間,但是寫入和讀取的速度變快了,緩存池中緩存塊的數(shù)量是有限的,寫入和讀取的速度變快也就加快了緩存塊被釋放及重新利用的速度,使得生產(chǎn)和消費達到了平衡。如果將“碎片”利用起來,跨塊存儲待緩存數(shù)據(jù),雖然將“碎片”的空間利用了,但是造成了時間上的浪費,也就減慢了緩存塊釋放重新利用的速度,甚至導(dǎo)致緩存池中沒有可以獲取的緩存塊,造成無緩存可以分配,破壞了生產(chǎn)和消費的平衡,得不償失。
[0043]較佳地,為了便于對預(yù)設(shè)緩存池中的緩存塊進行管理,預(yù)設(shè)緩存池中存儲的預(yù)先設(shè)置的多個緩存塊長度可以相同。
[0044]S205、當(dāng)讀取緩存隊列中的待讀取數(shù)據(jù)時,判斷讀取點指示的位置與寫入點指示的位置是否為同一位置,若是,則本讀取流程結(jié)束;若否,進入步驟S206 ;
[0045]本步驟中,當(dāng)讀取緩存隊列中的待讀取數(shù)據(jù)時,循環(huán)執(zhí)行步驟S206?S210,直到讀取點指示的位置與所述寫入點指示的位置為同一緩存塊的起始位置為止。
[0046]進一步地,在緩存隊列中,寫入點和讀取點為單向移動。當(dāng)讀取點的位置和寫入點的位置同為一個緩存塊的同一位置時,說明緩存隊列中已不存在待讀取的數(shù)據(jù),則讀取流程結(jié)束。
[0047]進一步地,可以在將待緩存數(shù)據(jù)寫入當(dāng)前可用緩存塊之后,即步驟S201之后,通過事件機制觸發(fā)對緩存隊列中的數(shù)據(jù)的讀取操作。也就是說,當(dāng)緩存隊列中有數(shù)據(jù)寫入時,可以通過事件機制通知讀取點對緩存中的數(shù)據(jù)進行讀取。
[0048]S206、根據(jù)緩存隊列中讀取點指示的當(dāng)前待讀取數(shù)據(jù)的起始位置,讀取上述當(dāng)前待讀取數(shù)據(jù)。
[0049]S207、判斷上述當(dāng)前待讀取數(shù)據(jù)所在緩存塊內(nèi),在上述當(dāng)前待讀取數(shù)據(jù)之后是否還存儲有待讀取數(shù)據(jù),若是,則進入步驟S208 ;若否,則進入步驟S209。
[0050]S208、當(dāng)上述當(dāng)前待讀取數(shù)據(jù)所在緩存塊內(nèi),在上述當(dāng)前待讀取數(shù)據(jù)之后還存儲有待讀取數(shù)據(jù)時,將讀取點指示的位置更新為緊鄰上述當(dāng)前待讀取數(shù)據(jù)存儲的待讀取數(shù)據(jù)的起始位置。進入步驟S206;
[0051]S209、當(dāng)上述當(dāng)前待讀取數(shù)據(jù)所在緩存塊內(nèi),在上述當(dāng)前待讀取數(shù)據(jù)之后不存在待讀取數(shù)據(jù)時,判斷當(dāng)前寫入點指示的位置是否為上述當(dāng)前待讀取數(shù)據(jù)的結(jié)束位置,若否,則進入步驟S210 ;若是,則進入步驟S212。
[0052]本步驟中,當(dāng)前待讀取數(shù)據(jù)的結(jié)束位置可以為該當(dāng)前待讀取數(shù)據(jù)的最后一個字符所在存儲位置的下一個存儲位置,即上述待讀取數(shù)據(jù)之后、且緊鄰上述待讀取數(shù)據(jù)的存儲位置。
[0053]S210、當(dāng)上述當(dāng)前待讀取數(shù)據(jù)所在緩存塊內(nèi),在上述當(dāng)前待讀取數(shù)據(jù)之后不存在待讀取數(shù)據(jù),且寫入點指示的位置不為上述當(dāng)前待讀取數(shù)據(jù)的結(jié)束位置時,將讀取點指示的位置更新為緩存隊列中,上述當(dāng)前待讀取數(shù)據(jù)所在緩存塊之后的下一個緩存塊的起始位置。
[0054]本步驟中,當(dāng)前待讀取數(shù)據(jù)所在緩存塊內(nèi),在當(dāng)前待讀取數(shù)據(jù)之后不存在待讀取數(shù)據(jù),且寫入點指示的位置不為當(dāng)前待讀取數(shù)據(jù)的結(jié)束位置,說明當(dāng)前待讀取數(shù)據(jù)所在緩存塊內(nèi),當(dāng)前待讀取數(shù)據(jù)之后剩余的存儲空間,長度不大于預(yù)設(shè)最大長度,也就是說該剩余的存儲空間為一塊“碎片”,此時,并不能說明緩存隊列中不存在待讀取數(shù)據(jù)了,待讀取數(shù)據(jù)可能存儲在當(dāng)前待讀取數(shù)據(jù)所在緩存塊之后的下一個緩存塊中,因此,可以將讀取點指示的位置更新為緩存隊列中,當(dāng)前待讀取數(shù)據(jù)所在緩存塊之后的下一個緩存塊的起始位置。若寫入點指示的位置也在該下一個緩存塊的起始位置,則在進入步驟S205時,會判斷出讀取點指示的位置與寫入點指示的位置為同一位置,說明緩存隊列中的待讀取數(shù)據(jù)已經(jīng)讀取完畢,讀取流程結(jié)束,若寫入點指示的位置不在該下一個緩存塊的起始位置,則在進入步驟S205時,會判斷出讀取點指示的位置與寫入點指示的位置為非同一位置,說明緩存隊列中還存在未讀取的數(shù)據(jù),則進入步驟S206,讀取當(dāng)前待讀取數(shù)據(jù)。
[0055]S211、將上述當(dāng)前待讀取數(shù)據(jù)所在緩存塊釋放到預(yù)設(shè)緩存池。進入步驟S205。
[0056]本步驟中,將當(dāng)前待讀取數(shù)據(jù)所在緩存塊釋放到預(yù)設(shè)緩存池中,可以供后續(xù)從預(yù)設(shè)緩存池中獲取緩存塊時使用。
[0057]S212、當(dāng)上述當(dāng)前待讀取數(shù)據(jù)所在緩存塊內(nèi),在上述當(dāng)前待讀取數(shù)據(jù)之后不存在待讀取數(shù)據(jù),且寫入點指示的位置為上述當(dāng)前待讀取數(shù)據(jù)的結(jié)束位置時,將讀取點指示的位置更新為寫入點指示的位置。本讀取流程結(jié)束。
[0058]本步驟中,當(dāng)前待讀取數(shù)據(jù)所在緩存塊內(nèi),在當(dāng)前待讀取數(shù)據(jù)之后不存在待讀取數(shù)據(jù),且寫入點指示的位置為當(dāng)前待讀取數(shù)據(jù)的結(jié)束位置,說明當(dāng)前待讀取數(shù)據(jù)所在緩存塊內(nèi),當(dāng)前待讀取數(shù)據(jù)之后剩余的存儲空間,長度大于預(yù)設(shè)最大長度,且緩存隊列中不存在未讀取數(shù)據(jù),將讀取點指示的位置更新為寫入點指示的位置。在進入步驟S205時,會判斷出讀取點指示的位置與寫入點指示的位置為同一位置,讀取流程結(jié)束。
[0059]實施例2:
[0060]針對本發(fā)明實施例1中的步驟S201,從當(dāng)前可用位置寫入當(dāng)前可用緩存塊的數(shù)據(jù)可以包括:順次存儲的待緩存數(shù)據(jù)的長度信息以及待緩存數(shù)據(jù)的內(nèi)容;因此,針對上述步驟S207、判斷當(dāng)前待讀取數(shù)據(jù)所在緩存塊內(nèi),在當(dāng)前待讀取數(shù)據(jù)之后是否還存儲有待讀取數(shù)據(jù),本發(fā)明實施例2提供了具體的實施方式,如圖3所示,可以包括如下步驟:
[0061 ] S301、確定緊鄰當(dāng)前待讀取數(shù)據(jù)的、用于存儲待緩存數(shù)據(jù)的長度的存儲位置,存儲的內(nèi)容是否為零,若否,則進入步驟S302 ;若是,則進入步驟S303。
[0062] 進一步地,本實施例中,當(dāng)寫入當(dāng)前可用緩存塊的數(shù)據(jù)包括待緩存數(shù)據(jù)的長度以及待緩存數(shù)據(jù)時,在讀取緩存塊中的數(shù)據(jù)時,首先讀取到待讀取數(shù)據(jù)的長度,再根據(jù)該長度,從存儲該長度的存儲位置之后,讀取該長度的數(shù)據(jù),即完成了當(dāng)前待讀取數(shù)據(jù)的讀取。如果該當(dāng)前待讀取數(shù)據(jù)之后,還存儲有待讀取數(shù)據(jù),那么在該當(dāng)前待讀取數(shù)據(jù)之后,緊鄰該當(dāng)前待讀取數(shù)據(jù)的存儲位置,應(yīng)該存儲有下一個待讀取數(shù)據(jù)的長度,如果存儲的內(nèi)容為零,說明當(dāng)前待讀取數(shù)據(jù)所在緩存塊內(nèi),在待讀取數(shù)據(jù)之后未存儲待讀取數(shù)據(jù),如果存儲的內(nèi)容不為零,說明當(dāng)前待讀取數(shù)據(jù)所在緩存塊內(nèi),在待讀取數(shù)據(jù)之后存儲有待讀取數(shù)據(jù)。
[0063]S302、若不為零,則確定當(dāng)前待讀取數(shù)據(jù)所在緩存塊內(nèi),在待讀取數(shù)據(jù)之后存儲有待讀取數(shù)據(jù)。
[0064]S303、否則,確定當(dāng)前待讀取數(shù)據(jù)所在緩存塊內(nèi),在待讀取數(shù)據(jù)之后未存儲待讀取數(shù)據(jù)。
[0065]實施例3:
[0066]本發(fā)明實施例3提供了緩存隊列的初始化流程,如圖4所示,具體包括如下步驟:
[0067]S401、從預(yù)設(shè)緩存池中獲取一個緩存塊作為緩存隊列中的第一個節(jié)點。
[0068]S402、將寫入點指示的位置和讀取點指示的位置初始化為上述第一個節(jié)點緩存塊的起始位置。
[0069]下面以WAF “離線檢測”工作模式下,對嗅探后的報文進行緩存為例,說明本發(fā)明實施例提供的緩存分配方法,假設(shè)預(yù)設(shè)最大長度為“大報文”長度加4個字節(jié)(4個字節(jié)可以存儲一個整型數(shù)據(jù),即用于存儲接收到的報文的長度信息),如圖5a-圖5f所示:
[0070]圖5a為預(yù)設(shè)緩存池中的緩存塊示意圖,在預(yù)設(shè)緩存池501中每個緩存塊大小相同,且為1.5倍的預(yù)設(shè)最大長度;
[0071]圖5b為初始化后的緩存隊列示意圖,隊列中包括一個從預(yù)設(shè)緩存池中獲取的第一個緩存塊502,指向緩存隊列的表頭指針,指向該第一個緩存塊502起始位置的讀取點指針和寫入點指針;
[0072]假設(shè)嗅探到的第一個數(shù)據(jù)包長度為“大報文”長度,則將該第一個數(shù)據(jù)包的長度信息,及該第一個數(shù)據(jù)包的內(nèi)容,從寫入點指針指示的位置(第一個緩存塊起始位置)寫入該第一個緩存塊502,將該第一個數(shù)據(jù)包寫入第一個緩存塊502之后,第一個緩存塊502中剩余存儲空間小于預(yù)設(shè)最大長度,從預(yù)設(shè)緩存池中獲取第二個緩存塊503放入緩存隊列的隊尾,并將寫入點指針更新為該第二個緩存塊503的起始位置;圖5c為將第一個數(shù)據(jù)包寫入第一個緩存塊502之后緩存隊列狀態(tài)示意圖;
[0073]假設(shè)嗅探到的第二個數(shù)據(jù)包長度為0.3倍的“大報文”長度,則將第二個數(shù)據(jù)包的長度信息,及該第二個數(shù)據(jù)包的內(nèi)容,從寫入點指針指示的位置(第二個緩存塊起始位置)寫入該第二個緩存塊503,將該第二個數(shù)據(jù)包寫入第二個緩存塊503之后,第二個緩存塊503中剩余存儲空間大于預(yù)設(shè)最大長度,將寫入點指針更新為該第二個緩存塊503中剩余存儲空間的起始位置;圖5d為將第二個數(shù)據(jù)包寫入第二個緩存塊503之后緩存隊列狀態(tài)示意圖;
[0074]當(dāng)將第一個數(shù)據(jù)包寫入第一個緩存塊502之后,通過事件機制觸發(fā)對緩存隊列中的數(shù)據(jù)的讀取操作。當(dāng)確定當(dāng)前讀取點指針指示的位置與寫入點指針指示的位置不同時,讀取讀取點指針?biāo)甘镜漠?dāng)前待讀取數(shù)據(jù),即第一個數(shù)據(jù)包的長度信息,以及根據(jù)讀取到的長度信息讀取的第一個數(shù)據(jù)包,由于第一個數(shù)據(jù)包之后,與第一個數(shù)據(jù)包緊鄰的存儲位置存儲的內(nèi)容為零(碎片),確定在第一個緩存塊502內(nèi),第一個數(shù)據(jù)包之后不存在待讀取數(shù)據(jù),又由于寫入點指針指示的位置不為第一個數(shù)據(jù)包之后,與第一個數(shù)據(jù)包緊鄰的存儲位置,將讀取點指針指示的位置更新為第二個緩存塊503的起始位置,并將第一個緩存塊502釋放回預(yù)設(shè)緩存池;圖5e為將第一個緩存塊502釋放之后緩存隊列狀態(tài)示意圖;
[0075]再次對讀取點指針指示的位置和寫入點指針指示的位置進行判斷,由于更新后的讀取點指針指示的位置與寫入點指針指示的位置不同,讀取讀取點指針?biāo)甘镜漠?dāng)前待讀取數(shù)據(jù),即第二個數(shù)據(jù)包的長度信息,以及根據(jù)讀取到的長度信息讀取的第二個數(shù)據(jù)包,由于第二個數(shù)據(jù)包之后,與第二個數(shù)據(jù)包緊鄰的存儲位置存儲的內(nèi)容為零,確定在第二個緩存塊503內(nèi),第一個數(shù)據(jù)包之后不存在待讀取數(shù)據(jù),又由于寫入點指針指示的位置為第一個數(shù)據(jù)包之后,與第一個數(shù)據(jù)包緊鄰的存儲位置,將讀取點指針指示的位置更新為寫入點指針指示的位置,由于更新后的讀取點指針指示的位置與寫入點指針指示的位置相同,讀取流程結(jié)束。圖5f為讀取第二個數(shù)據(jù)包之后緩存隊列狀態(tài)示意圖。
[0076]基于同一發(fā)明構(gòu)思,本發(fā)明實施例還提供了一種緩存分配裝置及設(shè)備,由于這些裝置和設(shè)備所解決問題的原理與前述緩存分配方法相似,因此該裝置和設(shè)備的實施可以參見前述方法的實施,重復(fù)之處不再贅述。
[0077]本發(fā)明實施例提供的一種緩存分配裝置,如圖6所示,包括如下模塊:
[0078]寫入模塊601,用于當(dāng)接收到待緩存數(shù)據(jù)時,根據(jù)緩存隊列中寫入點指示的當(dāng)前可用緩存塊的當(dāng)前可用位置,將所述待緩存數(shù)據(jù)從所述當(dāng)前可用位置寫入所述當(dāng)前可用緩存塊;
[0079]更新模塊602,用于當(dāng)所述當(dāng)前可用緩存塊的當(dāng)前剩余可用空間不小于預(yù)設(shè)最大長度時,將所述寫入點指示的位置更新為所述當(dāng)前剩余可用空間的起始位置;當(dāng)所述當(dāng)前剩余可用空間小于預(yù)設(shè)最大長度時,從預(yù)設(shè)緩存池中獲取一個緩存塊加入所述緩存隊列的隊尾,并將所述寫入點指示的位置更新為加入緩存塊的起始位置,其中,所述預(yù)設(shè)緩存池用于存儲預(yù)先設(shè)置的多個長度不小于所述預(yù)設(shè)最大長度的緩存塊。
[0080]進一步地,所述裝置,還包括:
[0081]讀取模塊603,用于當(dāng)讀取所述緩存隊列中的待讀取數(shù)據(jù)時,循環(huán)執(zhí)行如下步驟,直到所述讀取點指示的位置與所述寫入點指示的位置為同一位置為止:根據(jù)所述緩存隊列中讀取點指示的當(dāng)前待讀取數(shù)據(jù)的起始位置,讀取所述當(dāng)前待讀取數(shù)據(jù);當(dāng)所述當(dāng)前待讀取數(shù)據(jù)所在緩存塊內(nèi),在所述當(dāng)前待讀取數(shù)據(jù)之后還存儲有待讀取數(shù)據(jù)時,將所述讀取點指示的位置更新為緊鄰所述當(dāng)前待讀取數(shù)據(jù)存儲的待讀取數(shù)據(jù)的起始位置;當(dāng)所述當(dāng)前待讀取數(shù)據(jù)所在緩存塊內(nèi),在所述當(dāng)前待讀取數(shù)據(jù)之后不存在待讀取數(shù)據(jù),且所述寫入點指示的位置不為所述當(dāng)前待讀取數(shù)據(jù)的結(jié)束位置時,將所述讀取點指示的位置更新為所述緩存隊列中,所述當(dāng)前待讀取數(shù)據(jù)所在緩存塊之后的下一個緩存塊的起始位置,并將所述當(dāng)前待讀取數(shù)據(jù)所在緩存塊釋放到所述預(yù)設(shè)緩存池;當(dāng)所述當(dāng)前待讀取數(shù)據(jù)所在緩存塊內(nèi),在所述當(dāng)前待讀取數(shù)據(jù)之后不存在待讀取數(shù)據(jù),且所述寫入點指示的位置為所述當(dāng)前待讀取數(shù)據(jù)的結(jié)束位置時,將所述讀取點指示的位置更新為所述寫入點指示的位置。
[0082]進一步地,所述寫入模塊601從所述當(dāng)前可用位置順次寫入所述當(dāng)前可用緩存塊的數(shù)據(jù)包括:所述待緩存數(shù)據(jù)的長度信息以及所述待緩存數(shù)據(jù)的內(nèi)容;
[0083]所述讀取模塊603,具體用于采用如下方式確定所述當(dāng)前待讀取數(shù)據(jù)所在緩存塊內(nèi),在所述待讀取數(shù)據(jù)之后是否存儲有待讀取數(shù)據(jù):確定緊鄰所述當(dāng)前待讀取數(shù)據(jù)的、用于存儲待緩存數(shù)據(jù)的長度的存儲位置,存儲的內(nèi)容是否為零;若不為零,則確定所述當(dāng)前待讀取數(shù)據(jù)所在緩存塊內(nèi),在所述待讀取數(shù)據(jù)之后存儲有待讀取數(shù)據(jù);否則,確定所述當(dāng)前待讀取數(shù)據(jù)所在緩存塊內(nèi),在所述待讀取數(shù)據(jù)之后未存儲待讀取數(shù)據(jù)。
[0084]進一步地,所述裝置,還包括:
[0085]觸發(fā)模塊604,用于在所述寫入模塊將所述待緩存數(shù)據(jù)寫入所述當(dāng)前可用緩存塊之后,通過事件機制觸發(fā)對所述緩存隊列中的數(shù)據(jù)的讀取操作。
[0086]進一步地,所述裝置,還包括:
[0087]初始化模塊605,用于采用如下方式對所述緩存隊列進行初始化:從所述預(yù)設(shè)緩存池中獲取一個緩存塊作為緩存隊列中的第一個節(jié)點;并將寫入點指示的位置和讀取點指示的位置初始化為所述第一個節(jié)點緩存塊的起始位置。
[0088]本發(fā)明實施例提供的一種緩存分配設(shè)備,包括上述的緩存分配裝置。
[0089]上述各單元的功能可對應(yīng)于圖1至圖4所示流程中的相應(yīng)處理步驟,在此不再贅述。
[0090]本發(fā)明實施例提供的一種緩存分配方法、裝置及設(shè)備,當(dāng)接收到待緩存數(shù)據(jù)時,根據(jù)緩存隊列中寫入點指示的當(dāng)前可用緩存塊的當(dāng)前可用位置,將待緩存數(shù)據(jù)從所述當(dāng)前可用位置寫入所述當(dāng)前可用緩存塊;當(dāng)當(dāng)前可用緩存塊的當(dāng)前剩余可用空間不小于預(yù)設(shè)最大長度時,將寫入點指示的位置更新為當(dāng)前剩余可用空間的起始位置;當(dāng)當(dāng)前剩余可用空間小于預(yù)設(shè)最大長度時,從預(yù)設(shè)緩存池中獲取一個緩存塊加入所述緩存隊列的隊尾,并將寫入點指示的位置更新為加入緩存塊的起始位置,其中,預(yù)設(shè)緩存池用于存儲預(yù)先設(shè)置的多個長度不小于預(yù)設(shè)最大長度的緩存塊。由于緩存隊列中的緩存塊長度大于預(yù)設(shè)最大長度,采用本發(fā)明實施例提供的一種緩存分配方法對嗅探數(shù)據(jù)包進行緩存分配,可以將預(yù)設(shè)最大長度設(shè)置為不小于“大報文”長度,當(dāng)嗅探到的數(shù)據(jù)包長度較大時,可以獨自占用一個緩存塊,當(dāng)嗅探到的數(shù)據(jù)包長度較小、且多個小數(shù)據(jù)包長度和不大于預(yù)設(shè)最大長度時,可以使多個小數(shù)據(jù)包共同占用一個緩存塊,不僅實現(xiàn)了所謂的“零拷貝”,還節(jié)省了緩存空間,減小了丟包率,使得緩存的分配更加合理。
[0091]通過以上的實施方式的描述,本領(lǐng)域的技術(shù)人員可以清楚地了解到本發(fā)明實施例可以通過硬件實現(xiàn),也可以借助軟件加必要的通用硬件平臺的方式來實現(xiàn)?;谶@樣的理解,本發(fā)明實施例的技術(shù)方案可以以軟件產(chǎn)品的形式體現(xiàn)出來,該軟件產(chǎn)品可以存儲在一個非易失性存儲介質(zhì)(可以是⑶-R0M,U盤,移動硬盤等)中,包括若干指令用以使得一臺計算機設(shè)備(可以是個人計算機,服務(wù)器,或者網(wǎng)絡(luò)設(shè)備等)執(zhí)行本發(fā)明各個實施例所述的方法。
[0092]本領(lǐng)域技術(shù)人員可以理解附圖只是一個優(yōu)選實施例的示意圖,附圖中的模塊或流程并不一定是實施本發(fā)明所必須的。
[0093]本領(lǐng)域技術(shù)人員可以理解實施例中的裝置中的模塊可以按照實施例描述進行分布于實施例的裝置中,也可以進行相應(yīng)變化位于不同于本實施例的一個或多個裝置中。上述實施例的模塊可以合并為一個模塊,也可以進一步拆分成多個子模塊。
[0094]上述本發(fā)明實施例序號僅僅為了描述,不代表實施例的優(yōu)劣。
[0095]顯然,本領(lǐng)域的技術(shù)人員可以對本發(fā)明進行各種改動和變型而不脫離本發(fā)明的精神和范圍。這樣,倘若本發(fā)明的這些修改和變型屬于本發(fā)明權(quán)利要求及其等同技術(shù)的范圍之內(nèi),則本發(fā)明也意圖包含這些改動和變型在內(nèi)。
【權(quán)利要求】
1.一種緩存分配方法,其特征在于,包括: 當(dāng)接收到待緩存數(shù)據(jù)時,根據(jù)緩存隊列中寫入點指示的當(dāng)前可用緩存塊的當(dāng)前可用位置,將所述待緩存數(shù)據(jù)從所述當(dāng)前可用位置寫入所述當(dāng)前可用緩存塊; 當(dāng)所述當(dāng)前可用緩存塊的當(dāng)前剩余可用空間不小于預(yù)設(shè)最大長度時,將所述寫入點指示的位置更新為所述當(dāng)前剩余可用空間的起始位置; 當(dāng)所述當(dāng)前剩余可用空間小于預(yù)設(shè)最大長度時,從預(yù)設(shè)緩存池中獲取一個緩存塊加入所述緩存隊列的隊尾,并將所述寫入點指示的位置更新為加入緩存塊的起始位置,其中,所述預(yù)設(shè)緩存池用于存儲預(yù)先設(shè)置的多個長度不小于所述預(yù)設(shè)最大長度的緩存塊。
2.如權(quán)利要求1所述的方法,其特征在于,還包括: 當(dāng)讀取所述緩存隊列中的待讀取數(shù)據(jù)時,循環(huán)執(zhí)行如下步驟,直到所述讀取點指示的位置與所述寫入點指示的位置為同一位置為止: 根據(jù)所述緩存隊列中讀取點指示的當(dāng)前待讀取數(shù)據(jù)的起始位置,讀取所述當(dāng)前待讀取數(shù)據(jù); 當(dāng)所述當(dāng)前待讀取數(shù)據(jù)所在緩存塊內(nèi),在所述當(dāng)前待讀取數(shù)據(jù)之后還存儲有待讀取數(shù)據(jù)時,將所述讀取點指示的位置更新為緊鄰所述當(dāng)前待讀取數(shù)據(jù)存儲的待讀取數(shù)據(jù)的起始位置; 當(dāng)所述當(dāng)前待讀取數(shù)據(jù)所在緩存塊內(nèi),在所述當(dāng)前待讀取數(shù)據(jù)之后不存在待讀取數(shù)據(jù),且所述寫入點指示的位置不為所述當(dāng)前待讀取數(shù)據(jù)的結(jié)束位置時,將所述讀取點指示的位置更新為所述緩存隊列中,所述當(dāng)前待讀取數(shù)據(jù)所在緩存塊之后的下一個緩存塊的起始位置,并將所述當(dāng)前待讀取數(shù)據(jù)所在緩存塊釋放到所述預(yù)設(shè)緩存池; 當(dāng)所述當(dāng)前待讀取數(shù)據(jù)所在緩存塊內(nèi),在所述當(dāng)前待讀取數(shù)據(jù)之后不存在待讀取數(shù)據(jù),且所述寫入點指示的位置為所述當(dāng)前待讀取數(shù)據(jù)的結(jié)束位置時,將所述讀取點指示的位置更新為所述寫入點指示的位置。
3.如權(quán)利要求2所述的方法,其特征在于,從所述當(dāng)前可用位置寫入所述當(dāng)前可用緩存塊的數(shù)據(jù)包括:順次存儲的所述待緩存數(shù)據(jù)的長度信息以及所述待緩存數(shù)據(jù)的內(nèi)容; 所述方法,采用如下方式確定所述當(dāng)前待讀取數(shù)據(jù)所在緩存塊內(nèi),在所述待讀取數(shù)據(jù)之后是否存儲有待讀取數(shù)據(jù): 確定緊鄰所述當(dāng)前待讀取數(shù)據(jù)的、用于存儲待緩存數(shù)據(jù)的長度的存儲位置,存儲的內(nèi)容是否為零; 若不為零,則確定所述當(dāng)前待讀取數(shù)據(jù)所在緩存塊內(nèi),在所述待讀取數(shù)據(jù)之后存儲有待讀取數(shù)據(jù); 否則,確定所述當(dāng)前待讀取數(shù)據(jù)所在緩存塊內(nèi),在所述待讀取數(shù)據(jù)之后未存儲待讀取數(shù)據(jù)。
4.如權(quán)利要求1-3任一項所述的方法,其特征在于,還包括: 在將所述待緩存數(shù)據(jù)寫入所述當(dāng)前可用緩存塊之后,通過事件機制觸發(fā)對所述緩存隊列中的數(shù)據(jù)的讀取操作。
5.如權(quán)利要求1-3任一項所述的方法,其特征在于,采用如下方式對所述緩存隊列進行初始化: 從所述預(yù)設(shè)緩存池中獲取一個緩存塊作為緩存隊列中的第一個節(jié)點;并將寫入點指示的位置和讀取點指示的位置初始化為所述第一個節(jié)點緩存塊的起始位置。
6.一種緩存分配裝置,其特征在于,包括: 寫入模塊,用于當(dāng)接收到待緩存數(shù)據(jù)時,根據(jù)緩存隊列中寫入點指示的當(dāng)前可用緩存塊的當(dāng)前可用位置,將所述待緩存數(shù)據(jù)從所述當(dāng)前可用位置寫入所述當(dāng)前可用緩存塊; 更新模塊,用于當(dāng)所述當(dāng)前可用緩存塊的當(dāng)前剩余可用空間不小于預(yù)設(shè)最大長度時,將所述寫入點指示的位置更新為所述當(dāng)前剩余可用空間的起始位置;當(dāng)所述當(dāng)前剩余可用空間小于預(yù)設(shè)最大長度時,從預(yù)設(shè)緩存池中獲取一個緩存塊加入所述緩存隊列的隊尾,并將所述寫入點指示的位置更新為加入緩存塊的起始位置,其中,所述預(yù)設(shè)緩存池用于存儲預(yù)先設(shè)置的多個長度不小于所述預(yù)設(shè)最大長度的緩存塊。
7.如權(quán)利要求6所述的裝置,其特征在于,還包括: 讀取模塊,用于當(dāng)讀取所述緩存隊列中的待讀取數(shù)據(jù)時,循環(huán)執(zhí)行如下步驟,直到所述讀取點指示的位置與所述寫入點指示的位置為同一位置為止:根據(jù)所述緩存隊列中讀取點指示的當(dāng)前待讀取數(shù)據(jù)的起始位置,讀取所述當(dāng)前待讀取數(shù)據(jù);當(dāng)所述當(dāng)前待讀取數(shù)據(jù)所在緩存塊內(nèi),在所述當(dāng)前待讀取數(shù)據(jù)之后還存儲有待讀取數(shù)據(jù)時,將所述讀取點指示的位置更新為緊鄰所述當(dāng)前待讀取數(shù)據(jù)存儲的待讀取數(shù)據(jù)的起始位置;當(dāng)所述當(dāng)前待讀取數(shù)據(jù)所在緩存塊內(nèi),在所述當(dāng)前待讀取數(shù)據(jù)之后不存在待讀取數(shù)據(jù),且所述寫入點指示的位置不為所述當(dāng)前待讀取數(shù)據(jù)的結(jié)束位置時,將所述讀取點指示的位置更新為所述緩存隊列中,所述當(dāng)前待讀取數(shù)據(jù)所在緩存塊之后的下一個緩存塊的起始位置,并將所述當(dāng)前待讀取數(shù)據(jù)所在緩存塊釋放到所述預(yù)設(shè)緩存池;當(dāng)所述當(dāng)前待讀取數(shù)據(jù)所在緩存塊內(nèi),在所述當(dāng)前待讀取數(shù)據(jù)之后不存在待讀取數(shù)據(jù),且所述寫入點指示的位置為所述當(dāng)前待讀取數(shù)據(jù)的結(jié)束位置時,將所述讀取點指示的位置更新為所述寫入點指示的位置。
8.如權(quán)利要求7所述的裝置,其特征在于,所述寫入模塊從所述當(dāng)前可用位置寫入所述當(dāng)前可用緩存塊的數(shù)據(jù)包括:順次存儲的所述待緩存數(shù)據(jù)的長度信息以及所述待緩存數(shù)據(jù)的內(nèi)容; 所述讀取模塊,具體用于采用如下方式確定所述當(dāng)前待讀取數(shù)據(jù)所在緩存塊內(nèi),在所述待讀取數(shù)據(jù)之后是否存儲有待讀取數(shù)據(jù):確定緊鄰所述當(dāng)前待讀取數(shù)據(jù)的、用于存儲待緩存數(shù)據(jù)的長度的存儲位置,存儲的內(nèi)容是否為零;若不為零,則確定所述當(dāng)前待讀取數(shù)據(jù)所在緩存塊內(nèi),在所述待讀取數(shù)據(jù)之后存儲有待讀取數(shù)據(jù);否則,確定所述當(dāng)前待讀取數(shù)據(jù)所在緩存塊內(nèi),在所述待讀取數(shù)據(jù)之后未存儲待讀取數(shù)據(jù)。
9.如權(quán)利要求6-8任一項所述的裝置,其特征在于,還包括: 觸發(fā)模塊,用于在所述寫入模塊將所述待緩存數(shù)據(jù)寫入所述當(dāng)前可用緩存塊之后,通過事件機制觸發(fā)對所述緩存隊列中的數(shù)據(jù)的讀取操作。
10.如權(quán)利要求6-8任一項所述的裝置,其特征在于,還包括: 初始化模塊,用于采用如下方式對所述緩存隊列進行初始化:從所述預(yù)設(shè)緩存池中獲取一個緩存塊作為緩存隊列中的第一個節(jié)點;并將寫入點指示的位置和讀取點指示的位置初始化為所述第一個節(jié)點緩存塊的起始位置。
11.一種緩存分配設(shè)備,其特征在于,包括如權(quán)利要求6-10任一項所述的緩存分配裝置。
【文檔編號】H04L12/861GK103595653SQ201310577399
【公開日】2014年2月19日 申請日期:2013年11月18日 優(yōu)先權(quán)日:2013年11月18日
【發(fā)明者】劉冀鵬 申請人:福建星網(wǎng)銳捷網(wǎng)絡(luò)有限公司
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1
大关县| 皮山县| 新竹县| 望都县| 临桂县| 瓮安县| 乐清市| 紫金县| 渭源县| 磐石市| 景宁| 和龙市| 平武县| 民丰县| 于都县| 罗源县| 梧州市| 陵水| 遵化市| 礼泉县| 德化县| 临颍县| 永靖县| 留坝县| 交口县| 军事| 洛川县| 刚察县| 龙口市| 新营市| 阳春市| 宁陕县| 吴桥县| 田林县| 海安县| 太保市| 绵竹市| 营口市| 依兰县| 阜新市| 弥渡县|