數(shù)據(jù)存儲(chǔ)方法、查找方法及裝置制造方法
【專(zhuān)利摘要】本發(fā)明公開(kāi)了一種數(shù)據(jù)存儲(chǔ)方法及裝置,所述方法包括:對(duì)待存儲(chǔ)到三態(tài)內(nèi)容尋址存儲(chǔ)器TCAM中的關(guān)鍵字Key進(jìn)行哈希Hash運(yùn)算,得到所述Key的Hash值;并,從預(yù)設(shè)的位圖中為所述Key申請(qǐng)一個(gè)空閑bit位,將所述空閑bit位的狀態(tài)置為占用;將所述Key和所述Key對(duì)應(yīng)的bit位的身份標(biāo)識(shí)ID保存在預(yù)設(shè)的Hash表中所述Key的Hash值對(duì)應(yīng)的鏈表中,所述位圖和所述Hash表均保存在內(nèi)存中;將所述Key對(duì)應(yīng)的bit位的ID和所述Key的關(guān)聯(lián)數(shù)據(jù)存入TCAM中。本發(fā)明還公開(kāi)了一種數(shù)據(jù)查找方法及裝置。采用本發(fā)明,以解決現(xiàn)有技術(shù)中TCAM存儲(chǔ)空間浪費(fèi)的問(wèn)題。
【專(zhuān)利說(shuō)明】數(shù)據(jù)存儲(chǔ)方法、查找方法及裝置
【技術(shù)領(lǐng)域】
[0001]本申請(qǐng)涉及數(shù)據(jù)處理【技術(shù)領(lǐng)域】,尤其涉及一種數(shù)據(jù)存儲(chǔ)方法、查找方法及裝置。
【背景技術(shù)】
[0002]三態(tài)內(nèi)容尋址存儲(chǔ)器(TernaryContent Addressable Memory,TCAM)中的每一個(gè)bit的狀態(tài)可以是“O”或“1”,或者是第三種狀態(tài)“don' t care”,所以稱(chēng)為“三態(tài)”。這個(gè)特點(diǎn)使得TCAM對(duì)所查找的數(shù)據(jù)的位域具有篩選的功能。TCAM表內(nèi)所有條目都可以并行訪問(wèn)。例如,如果TCAM具有100條表項(xiàng),能一次對(duì)這100條表項(xiàng)進(jìn)行對(duì)比操作,相對(duì)于普通的輪詢查找方法,提高了查找的速度。
[0003]TCAM所使用的特定Key長(zhǎng)度主要有以下四種標(biāo)準(zhǔn)位寬:80bit,160bit,320bit和640bito現(xiàn)有的TCAM的存儲(chǔ)方案是:按照待存儲(chǔ)的關(guān)鍵字key值的位寬選擇需要用到的標(biāo)準(zhǔn)位寬,選擇標(biāo)準(zhǔn)是選擇大于待存儲(chǔ)的Key值位寬的最小標(biāo)準(zhǔn)位寬。
[0004]在實(shí)際應(yīng)用中,某些Key值的位寬較大,需要占用TCAM較大的存儲(chǔ)空間,造成TCAM存儲(chǔ)空間的浪費(fèi)。同時(shí),TCAM的Key值的位寬因業(yè)務(wù)需求各不相同,很難達(dá)到以上標(biāo)準(zhǔn)位寬。例如,報(bào)文的Key值的位寬為330bit,需要使用標(biāo)準(zhǔn)位寬為640bit的表項(xiàng)來(lái)存儲(chǔ),多出的310bit用mask碼表示,可見(jiàn),該表項(xiàng)浪費(fèi)了 310bit的空間。
[0005]由此可見(jiàn),現(xiàn)有的存儲(chǔ)方案存在浪費(fèi)TCAM存儲(chǔ)空間的問(wèn)題。
【發(fā)明內(nèi)容】
[0006]本申請(qǐng)?zhí)峁?shù)據(jù)存儲(chǔ)方法、查找方法及裝置,以解決現(xiàn)有技術(shù)中TCAM存儲(chǔ)空間浪費(fèi)的問(wèn)題。
[0007]根據(jù)本申請(qǐng)實(shí)施例的第一方面,提供一種數(shù)據(jù)存儲(chǔ)方法,所述方法包括:
[0008]對(duì)待存儲(chǔ)到三態(tài)內(nèi)容尋址存儲(chǔ)器TCAM中的關(guān)鍵字Key進(jìn)行哈希Hash運(yùn)算,得到所述Key的Hash值;并,從預(yù)設(shè)的位圖中為所述Key申請(qǐng)一個(gè)空閑bit位,將所述空閑bit位的狀態(tài)置為占用;
[0009]將所述Key和所述Key對(duì)應(yīng)的bit位的ID (Identity,身份標(biāo)識(shí))保存在預(yù)設(shè)的Hash表中所述Key的Hash值對(duì)應(yīng)的鏈表中,所述位圖和所述Hash表均保存在內(nèi)存中;
[0010]將所述Key對(duì)應(yīng)的bit位的ID和所述Key的關(guān)聯(lián)數(shù)據(jù)存入TCAM中。
[0011]其中,所述對(duì)待存儲(chǔ)到三態(tài)內(nèi)容尋址存儲(chǔ)器TCAM中的關(guān)鍵字Key進(jìn)行哈希Hash運(yùn)算包括:當(dāng)Key的位寬超過(guò)預(yù)設(shè)字節(jié)長(zhǎng)度時(shí),對(duì)所述Key進(jìn)行Hash運(yùn)算。
[0012]其中,所述對(duì)待存儲(chǔ)到三態(tài)內(nèi)容尋址存儲(chǔ)器TCAM中的關(guān)鍵字Key進(jìn)行哈希Hash運(yùn)算包括:當(dāng)Key的位寬不是固定字節(jié)長(zhǎng)度時(shí),對(duì)所述Key進(jìn)行Hash運(yùn)算。
[0013]其中,所述從預(yù)設(shè)的位圖中為所述Key申請(qǐng)一個(gè)空閑bit位,包括:從所述位圖的第一個(gè)bit位開(kāi)始搜索,當(dāng)搜索到第一個(gè)狀態(tài)為空閑的bit位時(shí),將所述bit位分配給所述Key。
[0014]其中,所述方法還包括:刪除TCAM中保存的所述Key對(duì)應(yīng)的bit位的ID和所述Key的關(guān)聯(lián)數(shù)據(jù),刪除所述Hash表中所述Key的Hash值對(duì)應(yīng)的鏈表中保存的所述Key和所述Key對(duì)應(yīng)的bit位的ID,并將所述位圖中所述Key對(duì)應(yīng)bit位的狀態(tài)設(shè)置為空閑。
[0015]根據(jù)本申請(qǐng)實(shí)施例的第二方面,提供一種數(shù)據(jù)查找方法,所述方法包括:
[0016]對(duì)待查找的關(guān)鍵字Key進(jìn)行哈希Hash運(yùn)算,得到所述Key的Hash值;
[0017]查找預(yù)設(shè)Hash表,獲取所述Key的Hash值對(duì)應(yīng)的鏈表中保存的所述Key對(duì)應(yīng)的bit位的身份標(biāo)識(shí)ID ;所述Key對(duì)應(yīng)的bit位為數(shù)據(jù)存儲(chǔ)過(guò)程中,從預(yù)設(shè)的位圖中為所述Key申請(qǐng)到的一個(gè)空閑bit位;
[0018]依據(jù)所述Key對(duì)應(yīng)的bit位的ID,查找三態(tài)內(nèi)容尋址存儲(chǔ)器TCAM,獲取所述Key的關(guān)聯(lián)數(shù)據(jù)。
[0019]其中,所述對(duì)待查找的關(guān)鍵字Key進(jìn)行哈希Hash運(yùn)算包括:當(dāng)Key的位寬超過(guò)預(yù)設(shè)字節(jié)長(zhǎng)度時(shí),對(duì)所述Key進(jìn)行Hash運(yùn)算
[0020]其中,所述對(duì)待查找的關(guān)鍵字Key進(jìn)行哈希Hash運(yùn)算包括:當(dāng)Key的位寬不是固定字節(jié)長(zhǎng)度時(shí),對(duì)所述Key進(jìn)行Hash運(yùn)算。
[0021]根據(jù)本申請(qǐng)實(shí)施例的第三方面,提供一種數(shù)據(jù)存儲(chǔ)裝置,所述裝置包括:
[0022]運(yùn)算單元,用于對(duì)待存儲(chǔ)到三態(tài)內(nèi)容尋址存儲(chǔ)器TCAM中的關(guān)鍵字Key進(jìn)行哈希Hash運(yùn)算,得到所述Key的Hash值;
[0023]申請(qǐng)單元,用于從預(yù)設(shè)的位圖中為所述Key申請(qǐng)一個(gè)空閑bit位,將所述空閑bit位的狀態(tài)置為占用;
[0024]第一存儲(chǔ)單元,用于將所述Key和所述Key對(duì)應(yīng)的bit位的身份標(biāo)識(shí)ID保存在預(yù)設(shè)的Hash表中所述Key的Hash值對(duì)應(yīng)的鏈表中,所述位圖和所述Hash表均保存在內(nèi)存中;
[0025]第二存儲(chǔ)單元,用于將所述Key對(duì)應(yīng)的bit位的ID和所述Key的關(guān)聯(lián)數(shù)據(jù)存入TCAM 中 ο
[0026]其中,所述運(yùn)算單元包括:第一運(yùn)算子單元,用于當(dāng)Key的位寬超過(guò)預(yù)設(shè)字節(jié)長(zhǎng)度時(shí),對(duì)所述Key進(jìn)行Hash運(yùn)算。
[0027]其中,所述運(yùn)算單元包括:第二運(yùn)算子單元,用于當(dāng)Key的位寬不是固定字節(jié)長(zhǎng)度時(shí),對(duì)所述Key進(jìn)行Hash運(yùn)算。
[0028]其中,所述申請(qǐng)單元包括:搜索子單元,用于從所述位圖的第一個(gè)bit位開(kāi)始搜索空閑bit位;分配子單元,用于當(dāng)所述搜索子單元搜索到第一個(gè)狀態(tài)為空閑的bit位時(shí),將所述bit位分配給所述Key。
[0029]其中,所述裝置還包括:第一刪除單元,用于刪除TCAM中保存的所述Key對(duì)應(yīng)的bit位的ID和所述Key的關(guān)聯(lián)數(shù)據(jù);第二刪除單元,用于刪除所述Hash表中所述Key的Hash值對(duì)應(yīng)的鏈表中保存的所述Key和所述Key對(duì)應(yīng)的bit位的ID ;狀態(tài)設(shè)置單元,用于將所述位圖中所述Key對(duì)應(yīng)bit位的狀態(tài)設(shè)置為空閑。
[0030]根據(jù)本申請(qǐng)實(shí)施例的第四方面,提供一種數(shù)據(jù)查找裝置,所述裝置包括:
[0031]運(yùn)算單元,用于對(duì)待查找的關(guān)鍵字Key進(jìn)行哈希Hash運(yùn)算,得到所述Key的Hash值;
[0032]第一查找單元,用于查找預(yù)設(shè)Hash表,獲取所述Key的Hash值對(duì)應(yīng)的鏈表中保存的所述Key對(duì)應(yīng)的bit位的身份標(biāo)識(shí)ID ;所述Key對(duì)應(yīng)的bit位為數(shù)據(jù)存儲(chǔ)過(guò)程中,從預(yù)設(shè)的位圖中為所述Key申請(qǐng)到的一個(gè)空閑bit位;
[0033]第二查找單元,用于依據(jù)所述Key對(duì)應(yīng)的bit位的ID,查找三態(tài)內(nèi)容尋址存儲(chǔ)器TCAM,獲取所述Key的關(guān)聯(lián)數(shù)據(jù)。
[0034]其中,所述運(yùn)算單元包括:第一運(yùn)算子單元,用于當(dāng)Key的位寬超過(guò)預(yù)設(shè)字節(jié)長(zhǎng)度時(shí),對(duì)所述Key進(jìn)行Hash運(yùn)算。
[0035]其中,所述運(yùn)算單元包括:第二運(yùn)算子單元,用于當(dāng)Key的位寬不是固定字節(jié)長(zhǎng)度時(shí),對(duì)所述Key進(jìn)行Hash運(yùn)算。
[0036]本申請(qǐng)實(shí)施例中,對(duì)待存儲(chǔ)到TCAM中的Key進(jìn)行轉(zhuǎn)化存儲(chǔ),從預(yù)設(shè)的位圖中為該Key申請(qǐng)一個(gè)空閑bit位,將Key和Key對(duì)應(yīng)的bit位的ID保存在預(yù)設(shè)Hash表中該Key的Hash值對(duì)應(yīng)的鏈表中,并將Key對(duì)應(yīng)的bit位的ID和Key的關(guān)聯(lián)數(shù)據(jù)保存在TCAM中。
[0037]當(dāng)需要查找數(shù)據(jù)時(shí),對(duì)待查找的Key進(jìn)行Hash運(yùn)算,從預(yù)設(shè)的Hash表中,獲取該Key的Hash值對(duì)應(yīng)的鏈表中保存的該Key對(duì)應(yīng)的bit位的ID,然后查找TCAM,依據(jù)該Key對(duì)應(yīng)的bit位的ID,獲取該Key的關(guān)聯(lián)數(shù)據(jù)。
[0038]本申請(qǐng)實(shí)施例中,用Key對(duì)應(yīng)的bit位的ID替代數(shù)據(jù)中的Key存儲(chǔ)在TCAM中。由于bit位的ID —般僅為幾個(gè)字節(jié),所需存儲(chǔ)空間很小,由此使得,本申請(qǐng)實(shí)施例的方法,既可以利用TCAM的快速查表的功能,又能較大的節(jié)省TCAM的存儲(chǔ)空間,避免造成TCAM存儲(chǔ)空間的浪費(fèi)。
【專(zhuān)利附圖】
【附圖說(shuō)明】
[0039]圖1為本申請(qǐng)實(shí)施例的數(shù)據(jù)存儲(chǔ)方法的流程圖;
[0040]圖2為本申請(qǐng)實(shí)施例的數(shù)據(jù)存儲(chǔ)方法的一種應(yīng)用情形示意圖;
[0041]圖3為本申請(qǐng)實(shí)施例的數(shù)據(jù)存儲(chǔ)方法的另一種應(yīng)用情形示意圖;
[0042]圖4為本申請(qǐng)實(shí)施例的數(shù)據(jù)查找方法的流程圖;
[0043]圖5為本申請(qǐng)實(shí)施例的數(shù)據(jù)存儲(chǔ)裝置的結(jié)構(gòu)圖;
[0044]圖6為本申請(qǐng)實(shí)施例的數(shù)據(jù)查找裝置的結(jié)構(gòu)圖。
【具體實(shí)施方式】
[0045]這里將詳細(xì)地對(duì)示例性實(shí)施例進(jìn)行說(shuō)明,其示例表示在附圖中。下面的描述涉及附圖時(shí),除非另有表示,不同附圖中的相同數(shù)字表示相同或相似的要素。以下示例性實(shí)施例中所描述的實(shí)施方式并不代表與本申請(qǐng)相一致的所有實(shí)施方式。相反,它們僅是與如所附權(quán)利要求書(shū)中所詳述的、本申請(qǐng)的一些方面相一致的裝置和方法的例子。
[0046]在本申請(qǐng)使用的術(shù)語(yǔ)是僅僅出于描述特定實(shí)施例的目的,而非旨在限制本申請(qǐng)。在本申請(qǐng)和所附權(quán)利要求書(shū)中所使用的單數(shù)形式的“一種”、“所述”和“該”也旨在包括多數(shù)形式,除非上下文清楚地表示其他含義。還應(yīng)當(dāng)理解,本文中使用的術(shù)語(yǔ)“和/或”是指并包含一個(gè)或多個(gè)相關(guān)聯(lián)的列出項(xiàng)目的任何或所有可能組合。
[0047]應(yīng)當(dāng)理解,盡管在本申請(qǐng)可能采用術(shù)語(yǔ)第一、第二、第三等來(lái)描述各種信息,但這些信息不應(yīng)限于這些術(shù)語(yǔ)。這些術(shù)語(yǔ)僅用來(lái)將同一類(lèi)型的信息彼此區(qū)分開(kāi)。例如,在不脫離本申請(qǐng)范圍的情況下,第一信息也可以被稱(chēng)為第二信息,類(lèi)似地,第二信息也可以被稱(chēng)為第一信息。取決于語(yǔ)境,如在此所使用的詞語(yǔ)“如果”可以被解釋成為“在……時(shí)”或“當(dāng)……時(shí)”或“響應(yīng)于確定”。
[0048]參照?qǐng)D1,為本申請(qǐng)實(shí)施例的數(shù)據(jù)存儲(chǔ)方法的流程圖。
[0049]步驟101:對(duì)待存儲(chǔ)到三態(tài)內(nèi)容尋址存儲(chǔ)器TCAM中的關(guān)鍵字Key進(jìn)行哈希Hash運(yùn)算,得到所述Key的Hash值。
[0050]本申請(qǐng)實(shí)施例中,可以對(duì)數(shù)據(jù)中的全部Key均進(jìn)行轉(zhuǎn)化存儲(chǔ),也可以僅對(duì)數(shù)據(jù)中的部分Key進(jìn)行轉(zhuǎn)化存儲(chǔ)。
[0051]具體的,當(dāng)Key的位寬超過(guò)預(yù)設(shè)字節(jié)長(zhǎng)度時(shí),對(duì)所述Key進(jìn)行Hash運(yùn)算,以實(shí)現(xiàn)轉(zhuǎn)化存儲(chǔ)。
[0052]例如,當(dāng)Key為一個(gè)URL地址時(shí),其位寬所占的字節(jié)長(zhǎng)度過(guò)長(zhǎng),如果直接將該類(lèi)Key存儲(chǔ)在TCAM中,將占用TCAM較大的存儲(chǔ)空間。特別是采用現(xiàn)有的按照待存儲(chǔ)的key的位寬選擇需要用到的標(biāo)準(zhǔn)位寬的做法,為了保證對(duì)這個(gè)Key的正確存儲(chǔ),必須為其選擇大于該Key位寬的最小標(biāo)準(zhǔn)位寬。由此需要占用TCAM較大的存儲(chǔ)空間,造成TCAM存儲(chǔ)空間的較大浪費(fèi)。本申請(qǐng)實(shí)施例中,對(duì)數(shù)據(jù)中位寬超過(guò)預(yù)設(shè)字節(jié)長(zhǎng)度的Key進(jìn)行轉(zhuǎn)化存儲(chǔ),可以有效的節(jié)省TCAM的存儲(chǔ)空間,解決TCAM存儲(chǔ)空間浪費(fèi)的問(wèn)題。
[0053]具體的,當(dāng)Key的位寬不是固定字節(jié)長(zhǎng)度時(shí),對(duì)所述Key進(jìn)行Hash運(yùn)算,以實(shí)現(xiàn)轉(zhuǎn)化存儲(chǔ)。
[0054]本申請(qǐng)實(shí)施例中,該位寬不確定的Key可以具體為值為字符串的Key。其中,對(duì)于值為字符串的Key,其位寬根據(jù)其具體取值會(huì)發(fā)生變化。以rule組別為例進(jìn)行說(shuō)明,rule的值為字符串,使得rule組別的值是不定長(zhǎng)的,例如,rule組別的值可以為a,也可以為app,也可以為apple等等。對(duì)于取值為字符串的Key,由于其長(zhǎng)度不定,因此很難確定其需要多大的存儲(chǔ)空間。特別是采用現(xiàn)有的按照待存儲(chǔ)的關(guān)鍵字key值的位寬選擇需要用到的標(biāo)準(zhǔn)位寬的做法,如果為該Key設(shè)定的存儲(chǔ)空間過(guò)小,則當(dāng)該Key的取值為較長(zhǎng)的字符串時(shí),將無(wú)法實(shí)現(xiàn)對(duì)該Key的存儲(chǔ);如果為該Key設(shè)定的存儲(chǔ)空間過(guò)大,則當(dāng)該Key的取值為較短的字符串時(shí),則會(huì)導(dǎo)致TCAM存儲(chǔ)空間的浪費(fèi)。
[0055]參見(jiàn)圖2,為本申請(qǐng)實(shí)施例的數(shù)據(jù)存儲(chǔ)方法的一種應(yīng)用情形示意圖。假設(shè)圖2所對(duì)應(yīng)的數(shù)據(jù)包括Keyl+Key2+……+KeyN。圖2所示的應(yīng)用情形為僅對(duì)數(shù)據(jù)中的一個(gè)Key進(jìn)行轉(zhuǎn)化存儲(chǔ),即為Key I。
[0056]如圖2所示,圖中最左邊一列表示的是需要進(jìn)行轉(zhuǎn)化的Keyl。該Keyl在不同場(chǎng)景具有不同的取值,分別為Key 1_1、Key 1_2、Key 1_3……Key 1_N。例如ruIe組別,其取值可以為a、abc、abcde等等。如圖2所示,圖中中間一列表示的是Hash表。通過(guò)Key的具體取值進(jìn)行Hash運(yùn)算,得到Key對(duì)應(yīng)的Hash值。該Hash表保存在內(nèi)存中。
[0057]具體的,Hash表是二維的,第一維度為鏈表,第二維度為節(jié)點(diǎn)。Hash表可以包括Y個(gè)鏈表,每個(gè)鏈表包括一定數(shù)量的節(jié)點(diǎn)。一般而言,Hash表的桶深Y是確定的,而每個(gè)鏈表中包括的節(jié)點(diǎn)數(shù)是動(dòng)態(tài)增加和減少的。
[0058]在存儲(chǔ)過(guò)程中,對(duì)Key進(jìn)行Hash運(yùn)算,得到所述Key在Hash表中的鏈表位置,該鏈表為該Key分配一個(gè)節(jié)點(diǎn)。
[0059]結(jié)合圖2,當(dāng)Keyl取值為Key 1_1時(shí),經(jīng)過(guò)Hash計(jì)算,得到其Hash值對(duì)應(yīng)第一鏈表,此時(shí)第一鏈表中還沒(méi)有節(jié)點(diǎn)被占用,則為Keyl_l分配第一鏈表的第一節(jié)點(diǎn)。
[0060]當(dāng)Keyl取值為Key 1_2時(shí),經(jīng)過(guò)Hash計(jì)算,得到其Hash值對(duì)應(yīng)第二鏈表,此時(shí)第二鏈表中還沒(méi)有節(jié)點(diǎn)被占用,則為Keyl_2分配第二鏈表的第一節(jié)點(diǎn)。
[0061]當(dāng)Keyl取值為Key 1_3時(shí),經(jīng)過(guò)Hash計(jì)算,得到其Hash值也對(duì)應(yīng)第二鏈表,此時(shí)第二鏈表中第一節(jié)點(diǎn)已被占用,則為第二鏈表動(dòng)態(tài)增加一個(gè)節(jié)點(diǎn),并為Keyl_2分配第二鏈表的第二節(jié)點(diǎn)。
[0062]以此類(lèi)推。
[0063]步驟102:從預(yù)設(shè)的位圖BITMAP中為所述Key申請(qǐng)一個(gè)空閑bit位,將所述空閑bit位的狀態(tài)置為占用;所述BITMAP保存在內(nèi)存中。
[0064]本申請(qǐng)實(shí)施例中,同一類(lèi)型的Key分別對(duì)應(yīng)一個(gè)Hash表和一個(gè)BITMAP,不同類(lèi)型的Key對(duì)應(yīng)的BITMAP具有不同的名。如圖2所示,為Keyl生成對(duì)應(yīng)的BITMAP,可以命名為Keyl.BITMAP。如圖2所示,圖中最右邊一列表示的即為BITMAP。
[0065]如圖2所示,BITMAP包括一列bit位。當(dāng)BITMAP中的某個(gè)bit位被占用時(shí),會(huì)將該bit位的狀態(tài)置為占用;當(dāng)某個(gè)bit位被釋放時(shí),將該bit位的狀態(tài)置為空閑。每個(gè)bit位都具有唯一確定的身份標(biāo)識(shí)ID,該bit位的ID包括該BITMAP的名和該bit位在該BITMAP中的偏移量。例如,如圖2所示,第一個(gè)bit位的ID為Keyl.BITMAP_Bitl,可以表示該bit位為位圖Keyl.BITMAP中的第一個(gè)bit位;第二個(gè)bit位的ID為Keyl.BITMAP_Bit2,以此類(lèi)推。
[0066]具體的,本申請(qǐng)實(shí)施例中,該BITMAP在內(nèi)存中的表示可以為一列由O和I組成的二進(jìn)制表,例如0101001等。當(dāng)BITMAP中的某個(gè)bit位為占用狀態(tài)時(shí),將該bit位置為I ;當(dāng)某個(gè)bit位為空閑狀態(tài)時(shí),將該bit位置為O。而每個(gè)bit位的ID即為該bit位在該BITMAP中的距離起點(diǎn)的偏移量。
[0067]以BITMAP為0101001進(jìn)行說(shuō)明,假設(shè)該BITMAP的名為a,則該BITMAP的第一個(gè)bit位(a_Bitl)為空閑狀態(tài);第二個(gè)bit位(a_Bit2)為占用狀態(tài);第三個(gè)bit位(a_Bit3)為空閑狀態(tài);以此類(lèi)推。
[0068]在實(shí)際應(yīng)用中,該BITMAP的長(zhǎng)度可以為任意長(zhǎng),例如包括幾萬(wàn)個(gè)Bit位等,可以根據(jù)數(shù)據(jù)的位寬和TCAM的大小具體設(shè)定。
[0069]本申請(qǐng)實(shí)施例中,為Key申請(qǐng)BITMAP中的空閑bit位時(shí),可以從BITMAP中隨機(jī)選擇一個(gè)空閑bit位分配給該Key。具體的,從BITMAP的所有還未被占用的空閑bit位中,隨機(jī)選擇一個(gè)分配給該Key。
[0070]本申請(qǐng)實(shí)施例中,為Key申請(qǐng)BITMAP中的空閑bit位時(shí),也可以是將BITMAP中位置最靠前的空閑bit位分配給該Key。具體的,從該BITMAP的第一個(gè)bit位開(kāi)始搜索,當(dāng)搜索到第一個(gè)空閑bit位時(shí),分配給所述Key。例如,如果當(dāng)前BITMAP中,第一個(gè)、第二個(gè)、第四個(gè)bit位均已被占用,,而第三個(gè)bit位仍為空閑狀態(tài)。則,從第一個(gè)bit位開(kāi)始搜索,發(fā)現(xiàn)第一個(gè)bit位和第二個(gè)bit位均已被占用,而第三個(gè)bit位為空閑,且為第一個(gè)空閑bit位,則將第三個(gè)bit位分配給該Key,且將第三個(gè)bit位的狀態(tài)置為占用。
[0071]需要說(shuō)明的是,本申請(qǐng)實(shí)施例的方法中,上述步驟101和步驟102的執(zhí)行順序不分先后。
[0072]步驟103:將所述Key和所述Key對(duì)應(yīng)的bit位的ID保存在預(yù)設(shè)的Hash表中所述Key的Hash值對(duì)應(yīng)的鏈表中,所述Hash表也保存在內(nèi)存中。
[0073]步驟104:將所述Key對(duì)應(yīng)的bit位的ID和所述Key的關(guān)聯(lián)數(shù)據(jù)存入TCAM中。
[0074]本申請(qǐng)實(shí)施例中,為Key申請(qǐng)到BITMAP中的一個(gè)空閑bit位后,將該bit位的狀態(tài)置為占用,然后將Key和Key對(duì)應(yīng)的bit位的ID保存在該Key的Hash值對(duì)應(yīng)的Hash鏈表中;然后,將所述Key對(duì)應(yīng)的bit位的ID和所述Key的關(guān)聯(lián)數(shù)據(jù)存入TCAM中。
[0075]假設(shè)圖2所對(duì)應(yīng)的數(shù)據(jù)包括Keyl+Key2+……+KeyN。在常規(guī)情況下,存入TCAM的內(nèi)容為:Keyl+Key2+……+KeyN。本申請(qǐng)實(shí)施例中,對(duì)Keyl進(jìn)行了轉(zhuǎn)化存儲(chǔ)后,用Keyl對(duì)應(yīng)的bit位的ID替代Keyl,此時(shí),存入TCAM的內(nèi)容變?yōu)?Keyl對(duì)應(yīng)的bit位的ID+Key2+......+KeyN0
[0076]下面結(jié)合圖2詳細(xì)說(shuō)明,如圖2所示:
[0077]當(dāng)Keyl值為Keyl_l時(shí),經(jīng)過(guò)Hash運(yùn)算,落在了 Hash表的第一鏈表中。為Keyl_l申請(qǐng)到BITMAP中的第一個(gè)bit位,該bit位的ID為Keyl.BITMAP_Bitl。則將Keyl_l和Keyl.BITMAP_Bitl保存在Hash表的第一鏈表中的第一節(jié)點(diǎn)處,并將數(shù)據(jù)轉(zhuǎn)化存儲(chǔ)為“Keyl.BITMAP_Bitl+Key2+......+KeyN”。
[0078]當(dāng)Keyl值為Keyl_2時(shí),經(jīng)過(guò)Hash運(yùn)算,落在了 Hash表的第二鏈表中。為Keyl_2申請(qǐng)到BITMAP中的第二個(gè)bit位,該bit位的ID為Keyl.BITMAP_Bit2。則將Keyl_2和Keyl.BITMAP_Bit2保存在Hash表的第二鏈表中的第一節(jié)點(diǎn)處,并將數(shù)據(jù)轉(zhuǎn)化存儲(chǔ)為“Keyl.BITMAP_Bit2+Key2+......+KeyN0
[0079]以此類(lèi)推。
[0080]至此,完成了本申請(qǐng)實(shí)施例的數(shù)據(jù)存儲(chǔ)方法的全過(guò)程。
[0081]本申請(qǐng)實(shí)施例中,通過(guò)建立BITMAP,實(shí)現(xiàn)對(duì)數(shù)據(jù)中全部或部分Key的轉(zhuǎn)化存儲(chǔ),將Key和Key對(duì)應(yīng)的bit位的ID保存在對(duì)應(yīng)的Hash鏈表中,并用Key對(duì)應(yīng)的bit位的ID替代數(shù)據(jù)中的Key,將Key對(duì)應(yīng)的bit位的ID和Key的關(guān)聯(lián)數(shù)據(jù)存儲(chǔ)在TCAM中。
[0082]當(dāng)需要查找數(shù)據(jù)時(shí),對(duì)數(shù)據(jù)中待查找的Key進(jìn)行Hash運(yùn)算,找到與該Key的Hash值對(duì)應(yīng)的Hash鏈表,獲取該Hash鏈表中保存的與該Key對(duì)應(yīng)的bit位的ID,然后利用該bit位的ID查找TCAM,獲取該Key的關(guān)聯(lián)數(shù)據(jù)。
[0083]本申請(qǐng)實(shí)施例中,用Key對(duì)應(yīng)的BITMAP中的bit位的ID替代數(shù)據(jù)中的Key存儲(chǔ)在TCAM中。而B(niǎo)ITMAP中bit位的ID —般僅為幾個(gè)字節(jié),所需存儲(chǔ)空間很小。由此使得,本申請(qǐng)實(shí)施例的方法,既可以利用TCAM的快速查表的功能,又能較大的節(jié)省TCAM的存儲(chǔ)空間,避免造成TCAM存儲(chǔ)空間的浪費(fèi)。
[0084]在實(shí)際應(yīng)用中,當(dāng)數(shù)據(jù)中包括位寬不是固定字節(jié)長(zhǎng)度的Key時(shí),當(dāng)Key取不同值時(shí),對(duì)應(yīng)的數(shù)據(jù)長(zhǎng)度也可能不同。例如,rule組別,當(dāng)其取值為a和取值為abcde時(shí),其分別對(duì)應(yīng)的數(shù)據(jù)長(zhǎng)度明顯也不相同。
[0085]本申請(qǐng)實(shí)施例中,可以設(shè)定BITMAP中的各個(gè)bit位的ID的字節(jié)長(zhǎng)度是相同的。即使Key的每個(gè)取值長(zhǎng)度不同,但各個(gè)值對(duì)應(yīng)的BITMAP中的bit位的ID的長(zhǎng)度是相同的。當(dāng)用Key對(duì)應(yīng)的bit位的ID替代數(shù)據(jù)中Key后,即使Key長(zhǎng)度不同,最終存入TCAM中的數(shù)據(jù)的長(zhǎng)度是相同的。由此可以解決現(xiàn)有技術(shù)中因數(shù)據(jù)長(zhǎng)度不確定造成的問(wèn)題。
[0086]本申請(qǐng)實(shí)施例中,當(dāng)需要對(duì)TCAM中某個(gè)數(shù)據(jù)進(jìn)行刪除時(shí),在TCAM側(cè),需要?jiǎng)h除TCAM中保存的Key對(duì)應(yīng)的bit位的ID和Key的關(guān)聯(lián)數(shù)據(jù),同時(shí)還需要?jiǎng)h除Hash表中該Key的Hash值對(duì)應(yīng)的鏈表中保存的Key和Key對(duì)應(yīng)的bit位的ID,并將該Key對(duì)應(yīng)的bit位置為空閑。
[0087]由此可見(jiàn),本申請(qǐng)實(shí)施例中,當(dāng)刪除某條數(shù)據(jù)時(shí),需要將該Key對(duì)應(yīng)bit位的狀態(tài)置為空閑,當(dāng)為Key重新申請(qǐng)空閑bit位時(shí),可以從位圖中的第一個(gè)bit位開(kāi)始搜索,只要搜索到第一個(gè)空閑bit位,就可以直接使用該空閑bit位。
[0088]上述實(shí)施例中結(jié)合圖2對(duì)本申請(qǐng)實(shí)施例的數(shù)據(jù)存儲(chǔ)方法進(jìn)行了說(shuō)明。圖2所示示例中,僅對(duì)數(shù)據(jù)中的一個(gè)Key進(jìn)行轉(zhuǎn)化存儲(chǔ),在本申請(qǐng)其他實(shí)施例中,還可以對(duì)數(shù)據(jù)中的多個(gè)Key均進(jìn)行轉(zhuǎn)化存儲(chǔ)。
[0089]如圖3所示,為本申請(qǐng)實(shí)施例的數(shù)據(jù)存儲(chǔ)方法的另一種應(yīng)用情形示意圖。假設(shè)圖3所對(duì)應(yīng)的數(shù)據(jù)包括Keyl+Key2+……+KeyN。圖3所示的應(yīng)用情形為對(duì)數(shù)據(jù)中的兩個(gè)Key進(jìn)行轉(zhuǎn)化存儲(chǔ),即為Keyl和Key2。
[0090]如圖3所示,Keyl在不同場(chǎng)景具有不同的取值,分別為Keyl_l、Keyl_2、Keyl_3……Keyl_N。Key2在不同場(chǎng)景具有不同的取值,分別為Key2_l、Key2_2、Key2_3……Key2_N0
[0091]對(duì)Keyl的各個(gè)取值進(jìn)行Hash運(yùn)算,對(duì)應(yīng)的Hash表為Keyl.Hash。為Keyl生成的BITMAP 為 Keyl.BITMAP。
[0092]假設(shè)當(dāng)前Keyl的取值為Keyl_l時(shí),經(jīng)過(guò)Hash運(yùn)算,落在了 Keyl.Hash表的第一鏈表中。為Keyl_l申請(qǐng)到Keyl.BITMAP中的第一個(gè)bit位,該bit位的ID為Keyl.BITMAP_Bitlo 則將 Keyl_l 和 Keyl.BITMAP_Bitl 保存在 Keyl.Hash 表的第一鏈表中。
[0093]對(duì)Key2進(jìn)行Hash運(yùn)算,對(duì)應(yīng)的Hash表為Key2.Hash。為Key2生成的BITMAP為Key2.BITMAP。
[0094]假設(shè)當(dāng)前Key2的取值為Key2_2時(shí),經(jīng)過(guò)Hash運(yùn)算,落在了 Key2.Hash表的第二鏈表中。為Key2_2申請(qǐng)到Key2.BITMAP中的第二個(gè)bit位,該bit位的ID為Key2.BITMAP_Bit2o 則將 Key2_2 和 Key2.BITMAP_Bit2 保存在 Key2.Hash 表的第二鏈表中。
[0095]然后,用“Keyl.BITMAP_Bitl” 替代數(shù)據(jù)中的 Keyl_l,用 “Key2.BITMAP_Bit2”替代數(shù)據(jù)中的Key2_2。具體為,存入TCAM的數(shù)據(jù)為:Keyl.BITMAP_Bitl+Key2.BITMAP_Bit2+......+KeyN。
[0096]本申請(qǐng)實(shí)施例中,可以僅對(duì)數(shù)據(jù)中的部分Key進(jìn)行轉(zhuǎn)化存儲(chǔ),也可以對(duì)數(shù)據(jù)中的全部Key均進(jìn)行轉(zhuǎn)化存儲(chǔ)。
[0097]假設(shè)某一數(shù)據(jù),其構(gòu)成包括:rule組別和五元組。其中,五元組包括:源IP地址、源端口號(hào)、目的IP地址、目的端口號(hào)和傳輸協(xié)議??梢?jiàn),該表項(xiàng)中,包括六個(gè)Key,分別為rule組別、源IP地址、源端口號(hào)、目的IP地址、目的端口號(hào)和傳輸協(xié)議。
[0098]本申請(qǐng)實(shí)施例中,當(dāng)對(duì)該數(shù)據(jù)進(jìn)行存儲(chǔ)時(shí),可以對(duì)數(shù)據(jù)中的六個(gè)Key均進(jìn)行轉(zhuǎn)化存儲(chǔ)。
[0099]對(duì)rule組別進(jìn)行Hash運(yùn)算,得到rule組別對(duì)應(yīng)的rule.Hash表中的Hash鏈表,并為rule組別申請(qǐng)rule.BITMAP中的一個(gè)空閑bit位,假設(shè)該bit位的ID為rule.BITMAP_BitUf rule組別和rule.BITMAP_Bitl保存在rule.Hash表對(duì)應(yīng)的鏈表中。
[0100]對(duì)源IP地址進(jìn)行Hash運(yùn)算,得到源IP地址對(duì)應(yīng)的sip.Hash表中的Hash鏈表,并為源IP地址申請(qǐng)sip.BITMAP中的一個(gè)空閑bit位,假設(shè)該bit位的ID為sip.BITMAP,
IP地址和sip.BITMAP_Bitl保存在sip.Hash表對(duì)應(yīng)的鏈表中。
[0101]以此類(lèi)推,分別對(duì)源端口號(hào)、目的IP地址、目的端口號(hào)和傳輸協(xié)議運(yùn)行轉(zhuǎn)化存儲(chǔ)。
[0102]假設(shè),源端口號(hào)對(duì)應(yīng)的bit位的ID為sport.BITMAP_Bitl ;目的IP地址對(duì)應(yīng)的bit位的ID為oip.BITMAP_Bitl ;目的端口號(hào)對(duì)應(yīng)的bit位的ID為oport.BITMAP_Bitl ;傳輸協(xié)議對(duì)應(yīng)的bit位的ID為trans.BITMAP_Bitl。
[0103]則保存在TCAM中的數(shù)據(jù)內(nèi)容為:
[0104]rule.BITMAP_Bitl + sip.BITMAP_Bi11 + sport.BITMAP_Bitl+oip.BITMAP_Bitl+oport.BITMAP—Bit 1+tr an s.BITMAP—Bitl0
[0105]本申請(qǐng)實(shí)施例中,當(dāng)對(duì)該數(shù)據(jù)進(jìn)行存儲(chǔ)時(shí),也可以僅對(duì)數(shù)據(jù)中的位寬過(guò)長(zhǎng)或位寬長(zhǎng)度不確定的Key進(jìn)行轉(zhuǎn)化存儲(chǔ)。
[0106]例如,該數(shù)據(jù)包括的六個(gè)Key中,rule組別為字符串,其位寬長(zhǎng)度不確定,則可以僅對(duì)rule組別進(jìn)行轉(zhuǎn)化存儲(chǔ),對(duì)該數(shù)據(jù)中的其他Key仍采用常規(guī)方式進(jìn)行存儲(chǔ)。
[0107]則保存在TCAM中的數(shù)據(jù)內(nèi)容為:
[0108]rule.BITMAP_Bitl+源IP地址+源端口號(hào)+目的IP地址+目的端口號(hào)+傳輸協(xié)議。
[0109]需要進(jìn)一步說(shuō)明的是,在現(xiàn)有的存儲(chǔ)方案,對(duì)于存在位寬字節(jié)長(zhǎng)度不固定的Key的數(shù)據(jù),當(dāng)從TCAM中刪除該類(lèi)數(shù)據(jù)時(shí),由于不確定下次存入TCAM的數(shù)據(jù)長(zhǎng)度具體為多少,所以需要將TCAM中后面的數(shù)據(jù)整體向前移,使得TCAM的空間回收效率很低。
[0110]本申請(qǐng)實(shí)施例中,對(duì)數(shù)據(jù)中位寬字節(jié)長(zhǎng)度不固定的Key或數(shù)據(jù)中包括的全部的Key均進(jìn)行轉(zhuǎn)化存儲(chǔ),將Key轉(zhuǎn)化為對(duì)應(yīng)位圖中的bit位,由于各bit位的長(zhǎng)度可以是固定的,所以存入TCAM的數(shù)據(jù)的長(zhǎng)度是固定的。
[0111]當(dāng)采用本申請(qǐng)實(shí)施例的存儲(chǔ)方法,在對(duì)TCAM中的數(shù)據(jù)進(jìn)行刪除時(shí),不需要再執(zhí)行后面數(shù)據(jù)整體前移的操作;由于進(jìn)行轉(zhuǎn)化存儲(chǔ)后,寫(xiě)入TCAM的數(shù)據(jù)的長(zhǎng)度是一致的,當(dāng)需要對(duì)TCAM再次寫(xiě)入數(shù)據(jù)時(shí),可以將數(shù)據(jù)直接寫(xiě)入前次刪除數(shù)據(jù)后的空出的內(nèi)存中,由此提高了 TCAM的空間管理效率,使得對(duì)TCAM中數(shù)據(jù)的增加和刪除更加便捷。
[0112]本申請(qǐng)實(shí)施例還提供一種數(shù)據(jù)查找方法,用于對(duì)采用本申請(qǐng)實(shí)施例上述方法進(jìn)行存儲(chǔ)的數(shù)據(jù)進(jìn)行查找。參照?qǐng)D4,為本申請(qǐng)實(shí)施例的表項(xiàng)的數(shù)據(jù)方法的流程圖。
[0113]步驟401:對(duì)待查找的關(guān)鍵字Key進(jìn)行哈希Hash運(yùn)算,得到所述Key的Hash值。
[0114]本申請(qǐng)實(shí)施例中,在對(duì)數(shù)據(jù)中的Key進(jìn)行查找時(shí),按照存儲(chǔ)時(shí)指定的策略,確定是對(duì)數(shù)據(jù)中的全部Key進(jìn)行Hash運(yùn)算還是部分Key進(jìn)行Hash運(yùn)算。如果在存儲(chǔ)時(shí),是對(duì)數(shù)據(jù)中的全部Key均進(jìn)行了轉(zhuǎn)化存儲(chǔ),則在查找時(shí),也需要對(duì)所有的Key均進(jìn)行Hash運(yùn)算。如果在存儲(chǔ)時(shí),僅對(duì)數(shù)據(jù)中的部分Key進(jìn)行了轉(zhuǎn)化存儲(chǔ),則在查找時(shí),也只需要對(duì)進(jìn)行轉(zhuǎn)化存儲(chǔ)了的這部分Key進(jìn)行Hash運(yùn)算。
[0115]由前述實(shí)施例可知,Hash表是二維的,第一維度為鏈表,第二維度為節(jié)點(diǎn)。每個(gè)鏈表中的節(jié)點(diǎn)數(shù)是動(dòng)態(tài)增加或減少的。
[0116]在查找過(guò)程中,對(duì)Key進(jìn)行Hash運(yùn)算,得到所述Key在Hash表中的鏈表位置。
[0117]步驟402:遍歷預(yù)設(shè)的Hash表,判斷所述Key的Hash值對(duì)應(yīng)的鏈表中是否保存有所述Key,如果有,進(jìn)入步驟403 ;如果沒(méi)有,進(jìn)入步驟406。
[0118]步驟403:獲取所述Hash鏈表中保存的該Key對(duì)應(yīng)的bit位的ID。
[0119]本申請(qǐng)實(shí)施例中,由數(shù)據(jù)的存儲(chǔ)過(guò)程可以知道,在Key對(duì)應(yīng)的Hash鏈表中,保存有該Key和該Key對(duì)應(yīng)的bit位的ID。則在正常存儲(chǔ)狀態(tài)下,遍歷該Key對(duì)應(yīng)的Hash鏈表,可以找到保存有該Key的Hash節(jié)點(diǎn),通過(guò)查看該Hash節(jié)點(diǎn),可以獲取該Key對(duì)應(yīng)的bit位的ID。
[0120]如果該數(shù)據(jù)沒(méi)有被存儲(chǔ)過(guò),則在該Key的Hash值對(duì)應(yīng)的Hash鏈表找不到該Key,直接返回查找失敗的結(jié)果。
[0121]如果該數(shù)據(jù)被存儲(chǔ)過(guò),但是又被刪除了,則該Key的Hash值對(duì)應(yīng)的Hash鏈表中保存的數(shù)據(jù)會(huì)隨之被刪除,在該Key對(duì)應(yīng)的Hash鏈表中找不到該Key,也直接返回查找失敗的結(jié)果。
[0122]步驟404:查找TCAM,判斷是否存在包括該Key對(duì)應(yīng)的bit位的ID的數(shù)據(jù),如果存在,則進(jìn)入步驟405 ;如果不存在,則進(jìn)入步驟406。
[0123]步驟405:獲取該Key對(duì)應(yīng)的關(guān)聯(lián)數(shù)據(jù),返回查找成功的結(jié)果。
[0124]步驟406:返回查找失敗的結(jié)果。
[0125]本申請(qǐng)實(shí)施例中,在數(shù)據(jù)存儲(chǔ)過(guò)程中,用Key對(duì)應(yīng)的bit位的ID替代數(shù)據(jù)中的Key,再將替代后的數(shù)據(jù)存儲(chǔ)在TCAM中。
[0126]當(dāng)需要查找數(shù)據(jù)時(shí),只需要對(duì)數(shù)據(jù)中待查找的Key進(jìn)行Hash運(yùn)算,找到Hash鏈表中保存的該Key,獲取該Hash鏈表中保存的與該Key對(duì)應(yīng)的bit位的ID,然后利用該Key對(duì)應(yīng)的bit位的ID查找TCAM,如果TCAM中存在包括該bit位的ID的數(shù)據(jù),則表明查找成功,獲取Key對(duì)應(yīng)的關(guān)聯(lián)數(shù)據(jù),返回查找成功的結(jié)果;如果沒(méi)有,表明該Key已經(jīng)被刪除或沒(méi)有被存儲(chǔ)過(guò),則返回查找失敗的結(jié)果。
[0127]本申請(qǐng)實(shí)施例中,用Key對(duì)應(yīng)的bit位的ID替代數(shù)據(jù)中的Key,再將替代后的數(shù)據(jù)存儲(chǔ)在TCAM中。而bit位的ID的大小一般僅為幾個(gè)字節(jié),所需存儲(chǔ)空間很小。由此使得,本申請(qǐng)實(shí)施例的方法,既可以利用TCAM的快速查表的功能,又能較大的節(jié)省TCAM的存儲(chǔ)空間,避免造成TCAM存儲(chǔ)空間的浪費(fèi)。
[0128]下面結(jié)合數(shù)據(jù)存儲(chǔ)的具體示例,對(duì)本申請(qǐng)實(shí)施例所述的數(shù)據(jù)查找方法也進(jìn)行詳細(xì)的介紹。
[0129]仍以上述數(shù)據(jù)為例,其構(gòu)成包括:rule組別和五元組。其中,五元組包括:源IP地址、源端口號(hào)、目的IP地址、目的端口號(hào)和傳輸協(xié)議。
[0130]本申請(qǐng)實(shí)施例中,如果該數(shù)據(jù)進(jìn)行存儲(chǔ)時(shí),是對(duì)數(shù)據(jù)中的六個(gè)Key均進(jìn)行了轉(zhuǎn)化存儲(chǔ)。則對(duì)該數(shù)據(jù)進(jìn)行查找時(shí),也需要對(duì)數(shù)據(jù)中的六個(gè)Key均進(jìn)行Hash運(yùn)算。
[0131]具體的,對(duì)rule組別進(jìn)行Hash運(yùn)算,得到rule組別對(duì)應(yīng)的Hash鏈表。判斷該Hash鏈表中是否保存有rule組別對(duì)應(yīng)的bit位的ID,如果沒(méi)有,返回查找失敗的消息;如果有,則查找TCAM中是否存在包括rule組別對(duì)應(yīng)bit位的ID的數(shù)據(jù),如果存在,則獲取該rule組別的關(guān)聯(lián)數(shù)據(jù),否則,返回查找失敗的消息。
[0132]對(duì)源IP地址進(jìn)行Hash運(yùn)算,得到源IP地址對(duì)應(yīng)的Hash鏈表。判斷該Hash鏈表中是否保存有源IP地址對(duì)應(yīng)的bit位的ID,如果沒(méi)有,返回查找失敗的消息;如果有,則查找TCAM中是否存在包括源IP地址對(duì)應(yīng)bit位的ID的數(shù)據(jù),如果存在,則獲取該源IP地址的關(guān)聯(lián)數(shù)據(jù),否則,返回查找失敗的消息。
[0133]以此類(lèi)推,分別對(duì)源端口號(hào)、目的IP地址、目的端口號(hào)和傳輸協(xié)議進(jìn)行Hash運(yùn)算,分別得到各Key對(duì)應(yīng)的Hash鏈表,并依此判斷,得到相應(yīng)的查找結(jié)果。
[0134]本申請(qǐng)實(shí)施例中,如果該數(shù)據(jù)存儲(chǔ)時(shí),僅對(duì)數(shù)據(jù)中的位寬過(guò)長(zhǎng)或位寬長(zhǎng)度不確定的Key進(jìn)行了轉(zhuǎn)化存儲(chǔ)。則對(duì)該數(shù)據(jù)進(jìn)行查找時(shí),也僅對(duì)數(shù)據(jù)中的位寬過(guò)長(zhǎng)或位寬長(zhǎng)度不確定的Key進(jìn)行Hash運(yùn)算,對(duì)于其他Key仍采用常規(guī)方式進(jìn)行查找。
[0135]例如,該數(shù)據(jù)包括的六個(gè)Key中,rule組別為字符串,其位寬長(zhǎng)度不確定,因此在存儲(chǔ)時(shí),僅對(duì)rule組別進(jìn)行轉(zhuǎn)化存儲(chǔ),對(duì)該數(shù)據(jù)中的其他Key仍采用常規(guī)方式進(jìn)行存儲(chǔ)。
[0136]具體的,對(duì)rule組別進(jìn)行Hash運(yùn)算,得到rule組別對(duì)應(yīng)的Hash鏈表。判斷該Hash鏈表中是否保存有rule組別對(duì)應(yīng)的bit位的ID,如果沒(méi)有,返回查找失敗的消息;如果有,則查找TCAM中是否存在包括rule組別對(duì)應(yīng)bit位的ID的數(shù)據(jù),如果存在,則獲取rule組別的關(guān)聯(lián)數(shù)據(jù),否則,返回查找失敗的消息。
[0137]對(duì)源IP地址、源端口號(hào)、目的IP地址、目的端口號(hào)和傳輸協(xié)議,則直接查找TCAM,確定是否保存有各個(gè)Key,并返回相應(yīng)的查找結(jié)果。
[0138]需要說(shuō)明的是,本申請(qǐng)實(shí)施例提供的查找方法,還可以進(jìn)一步包括:在查找操作完成后,還可以包括對(duì)數(shù)據(jù)的刪除操作。
[0139]具體的,該刪除操作可以包括:刪除TCAM中保存的所述Key對(duì)應(yīng)的bit位的ID和所述Key的關(guān)聯(lián)數(shù)據(jù),刪除所述Hash表中所述Key的Hash值對(duì)應(yīng)的鏈表中保存的所述Key和所述Key對(duì)應(yīng)的bit位的ID,并將所述位圖中所述Key對(duì)應(yīng)bit位的狀態(tài)設(shè)置為空閑。
[0140]對(duì)應(yīng)于本申請(qǐng)實(shí)施例提供的數(shù)據(jù)存儲(chǔ)方法,本申請(qǐng)實(shí)施例還提供一種數(shù)據(jù)存儲(chǔ)裝置。如圖5所示,所述裝置可以包括:運(yùn)算單元501、申請(qǐng)單元502、第一儲(chǔ)存單元503和第二存儲(chǔ)單元504。
[0141]其中,運(yùn)算單元501,用于對(duì)待存儲(chǔ)到三態(tài)內(nèi)容尋址存儲(chǔ)器TCAM中的關(guān)鍵字Key進(jìn)行哈希Hash運(yùn)算,得到所述Key的Hash值。
[0142]申請(qǐng)單元502,用于從預(yù)設(shè)的位圖中為所述Key申請(qǐng)一個(gè)空閑bit位,將所述空閑bit位的狀態(tài)置為占用。
[0143]第一儲(chǔ)存單元503,用于將所述Key和所述Key對(duì)應(yīng)的bit位的ID保存在預(yù)設(shè)的Hash表中所述Key的Hash值對(duì)應(yīng)的鏈表中,所述位圖和所述Hash表均保存在內(nèi)存中。
[0144]第二存儲(chǔ)單元504,用于將所述Key對(duì)應(yīng)的bit位的ID和所述Key的關(guān)聯(lián)數(shù)據(jù)存入TCAM中。
[0145]本申請(qǐng)實(shí)施例中,對(duì)待存儲(chǔ)到TCAM中的Key進(jìn)行轉(zhuǎn)化存儲(chǔ),從預(yù)設(shè)的位圖中為該Key申請(qǐng)一個(gè)空閑bit位,將Key和Key對(duì)應(yīng)的bit位的ID保存在預(yù)設(shè)Hash表中該Key的Hash值對(duì)應(yīng)的鏈表中,并將Key對(duì)應(yīng)的bit位的ID和Key的關(guān)聯(lián)數(shù)據(jù)保存在TCAM中。
[0146]本申請(qǐng)實(shí)施例中,用Key對(duì)應(yīng)的bit位的ID替代數(shù)據(jù)中的Key存儲(chǔ)在TCAM中。由于bit位的ID —般僅為幾個(gè)字節(jié),所需存儲(chǔ)空間很小,由此使得,本申請(qǐng)實(shí)施例的方法,既可以利用TCAM的快速查表的功能,又能較大的節(jié)省TCAM的存儲(chǔ)空間,避免造成TCAM存儲(chǔ)空間的浪費(fèi)。
[0147]其中,所述運(yùn)算單元501可以包括:第一運(yùn)算子單元,用于當(dāng)Key的位寬超過(guò)預(yù)設(shè)字節(jié)長(zhǎng)度時(shí),對(duì)所述Key進(jìn)行Hash運(yùn)算。
[0148]其中,所述運(yùn)算單元501可以包括:第二運(yùn)算子單元,用于當(dāng)Key的位寬不是固定字節(jié)長(zhǎng)度時(shí),對(duì)所述Key進(jìn)行Hash運(yùn)算。
[0149]其中,所述申請(qǐng)單元502可以包括:搜索子單元和分配子單元。
[0150]搜索子單元,用于從所述位圖的第一個(gè)bit位開(kāi)始搜索空閑bit位。
[0151]分配子單元,用于當(dāng)所述搜索子單元搜索到第一個(gè)狀態(tài)為空閑的bit位時(shí),將所述bit位分配給所述Key。
[0152]其中,所述裝置還包括:第一刪除單元、第二刪除單元和狀態(tài)設(shè)置單元。
[0153]第一刪除單元,用于刪除TCAM中保存的所述Key對(duì)應(yīng)的bit位的ID和所述Key的關(guān)聯(lián)數(shù)據(jù)。
[0154]第二刪除單元,用于刪除所述Hash表中所述Key的Hash值對(duì)應(yīng)的鏈表中保存的所述Key和所述Key對(duì)應(yīng)的bit位的ID。
[0155]狀態(tài)設(shè)置單元,用于將所述位圖中所述Key對(duì)應(yīng)bit位的狀態(tài)設(shè)置為空閑。
[0156]對(duì)應(yīng)于本申請(qǐng)實(shí)施例提供的數(shù)據(jù)查找方法,本申請(qǐng)實(shí)施例還提供一種數(shù)據(jù)查找裝置。如圖6所示,所述裝置可以包括:運(yùn)算單元601、第一查找單元602、第二查找單元603。
[0157]其中,運(yùn)算單元601,用于對(duì)待查找的關(guān)鍵字Key進(jìn)行哈希Hash運(yùn)算,得到所述Key 的 Hash 值。
[0158]第一查找單元602,用于查找預(yù)設(shè)Hash表,獲取所述Key的Hash值對(duì)應(yīng)的鏈表中保存的所述Key對(duì)應(yīng)的bit位的ID ;所述Key對(duì)應(yīng)的bit位為數(shù)據(jù)存儲(chǔ)過(guò)程中,從預(yù)設(shè)的位圖中為所述Key申請(qǐng)到的一個(gè)空閑bit位。
[0159]第二查找單元603,依據(jù)所述Key對(duì)應(yīng)的bit位的ID,用于查找三態(tài)內(nèi)容尋址存儲(chǔ)器TCAM,獲取所述Key的關(guān)聯(lián)數(shù)據(jù)。
[0160]其中,所述運(yùn)算單元601可以包括:第一運(yùn)算子單元,用于當(dāng)Key的位寬超過(guò)預(yù)設(shè)字節(jié)長(zhǎng)度時(shí),對(duì)所述Key進(jìn)行Hash運(yùn)算。
[0161]其中,所述運(yùn)算單元601可以包括:第二運(yùn)算子單元,用于當(dāng)Key的位寬不是固定字節(jié)長(zhǎng)度時(shí),對(duì)所述Key進(jìn)行Hash運(yùn)算。
[0162]本申請(qǐng)實(shí)施例中,對(duì)待存儲(chǔ)到TCAM中的Key進(jìn)行轉(zhuǎn)化存儲(chǔ),從預(yù)設(shè)的位圖中為該Key申請(qǐng)一個(gè)空閑bit位,將Key和Key對(duì)應(yīng)的bit位的ID保存在預(yù)設(shè)Hash表中該Key的Hash值對(duì)應(yīng)的鏈表中,并將Key對(duì)應(yīng)的bit位的ID和Key的關(guān)聯(lián)數(shù)據(jù)保存在TCAM中。
[0163]當(dāng)需要查找數(shù)據(jù)時(shí),對(duì)待查找的Key進(jìn)行Hash運(yùn)算,從預(yù)設(shè)的Hash表中,獲取該Key的Hash值對(duì)應(yīng)的鏈表中保存的該Key對(duì)應(yīng)的bit位的ID,然后查找TCAM,依據(jù)該Key對(duì)應(yīng)的bit位的ID,獲取該Key的關(guān)聯(lián)數(shù)據(jù)。
[0164]本申請(qǐng)實(shí)施例中,用Key對(duì)應(yīng)的bit位的ID替代數(shù)據(jù)中的Key存儲(chǔ)在TCAM中。由于bit位的ID —般僅為幾個(gè)字節(jié),所需存儲(chǔ)空間很小,由此使得,本申請(qǐng)實(shí)施例的方法,既可以利用TCAM的快速查表的功能,又能較大的節(jié)省TCAM的存儲(chǔ)空間,避免造成TCAM存儲(chǔ)空間的浪費(fèi)。
[0165]對(duì)于裝置實(shí)施例而言,由于其基本對(duì)應(yīng)于方法實(shí)施例,所以相關(guān)之處參見(jiàn)方法實(shí)施例的部分說(shuō)明即可。以上所描述的裝置實(shí)施例僅僅是示意性的,其中所述作為分離部件說(shuō)明的單元可以是或者也可以不是物理上分開(kāi)的,作為單元顯示的部件可以是或者也可以不是物理單元,即可以位于一個(gè)地方,或者也可以分布到多個(gè)網(wǎng)絡(luò)單元上??梢愿鶕?jù)實(shí)際的需要選擇其中的部分或者全部模塊來(lái)實(shí)現(xiàn)本申請(qǐng)方案的目的。本領(lǐng)域普通技術(shù)人員在不付出創(chuàng)造性勞動(dòng)的情況下,即可以理解并實(shí)施。
[0166]本領(lǐng)域技術(shù)人員在考慮說(shuō)明書(shū)及實(shí)踐這里公開(kāi)的發(fā)明后,將容易想到本申請(qǐng)的其它實(shí)施方案。本申請(qǐng)旨在涵蓋本申請(qǐng)的任何變型、用途或者適應(yīng)性變化,這些變型、用途或者適應(yīng)性變化遵循本申請(qǐng)的一般性原理并包括本申請(qǐng)未公開(kāi)的本【技術(shù)領(lǐng)域】中的公知常識(shí)或慣用技術(shù)手段。說(shuō)明書(shū)和實(shí)施例僅被視為示例性的,本申請(qǐng)的真正范圍和精神由下面的權(quán)利要求指出。
[0167]應(yīng)當(dāng)理解的是,本申請(qǐng)并不局限于上面已經(jīng)描述并在附圖中示出的精確結(jié)構(gòu),并且可以在不脫離其范圍進(jìn)行各種修改和改變。本申請(qǐng)的范圍僅由所附的權(quán)利要求來(lái)限制。
【權(quán)利要求】
1.一種數(shù)據(jù)存儲(chǔ)方法,其特征在于,所述方法包括: 對(duì)待存儲(chǔ)到三態(tài)內(nèi)容尋址存儲(chǔ)器TCAM中的關(guān)鍵字Key進(jìn)行哈希Hash運(yùn)算,得到所述Key的Hash值;并,從預(yù)設(shè)的位圖中為所述Key申請(qǐng)一個(gè)空閑bit位,將所述空閑bit位的狀態(tài)置為占用; 將所述Key和所述Key對(duì)應(yīng)的bit位的身份標(biāo)識(shí)ID保存在預(yù)設(shè)的Hash表中所述Key的Hash值對(duì)應(yīng)的鏈表中,所述位圖和所述Hash表均保存在內(nèi)存中; 將所述Key對(duì)應(yīng)的bit位的ID和所述Key的關(guān)聯(lián)數(shù)據(jù)存入TCAM中。
2.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述對(duì)待存儲(chǔ)到三態(tài)內(nèi)容尋址存儲(chǔ)器TCAM中的關(guān)鍵字Key進(jìn)行哈希Hash運(yùn)算包括: 當(dāng)Key的位寬超過(guò)預(yù)設(shè)字節(jié)長(zhǎng)度時(shí),對(duì)所述Key進(jìn)行Hash運(yùn)算。
3.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述對(duì)待存儲(chǔ)到三態(tài)內(nèi)容尋址存儲(chǔ)器TCAM中的關(guān)鍵字Key進(jìn)行哈希Hash運(yùn)算包括: 當(dāng)Key的位寬不是固定字節(jié)長(zhǎng)度時(shí),對(duì)所述Key進(jìn)行Hash運(yùn)算。
4.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述從預(yù)設(shè)的位圖中為所述Key申請(qǐng)一個(gè)空閑bit位,包括: 從所述位圖的第一個(gè)bit位開(kāi)始搜索,當(dāng)搜索到第一個(gè)狀態(tài)為空閑的bit位時(shí),將所述bit位分配給所述Key。
5.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述方法還包括: 刪除TCAM中保存的所述Key對(duì)應(yīng)的bit位的ID和所述Key的關(guān)聯(lián)數(shù)據(jù),刪除所述Hash表中所述Key的Hash值對(duì)應(yīng)的鏈表中保存的所述Key和所述Key對(duì)應(yīng)的bit位的ID,并將所述位圖中所述Key對(duì)應(yīng)bit位的狀態(tài)設(shè)置為空閑。
6.一種數(shù)據(jù)查找方法,其特征在于,所述方法包括: 對(duì)待查找的關(guān)鍵字Key進(jìn)行哈希Hash運(yùn)算,得到所述Key的Hash值; 查找預(yù)設(shè)Hash表,獲取所述Key的Hash值對(duì)應(yīng)的鏈表中保存的所述Key對(duì)應(yīng)的bit位的身份標(biāo)識(shí)ID ;所述Key對(duì)應(yīng)的bit位為數(shù)據(jù)存儲(chǔ)過(guò)程中,從預(yù)設(shè)的位圖中為所述Key申請(qǐng)到的一個(gè)空閑bit位; 依據(jù)所述Key對(duì)應(yīng)的bit位的ID,查找三態(tài)內(nèi)容尋址存儲(chǔ)器TCAM,獲取所述Key的關(guān)聯(lián)數(shù)據(jù)。
7.根據(jù)權(quán)利要求6所述的方法,其特征在于,所述對(duì)待查找的關(guān)鍵字Key進(jìn)行哈希Hash運(yùn)算包括: 當(dāng)Key的位寬超過(guò)預(yù)設(shè)字節(jié)長(zhǎng)度時(shí),對(duì)所述Key進(jìn)行Hash運(yùn)算。
8.根據(jù)權(quán)利要求6所述的方法,其特征在于,所述對(duì)待查找的關(guān)鍵字Key進(jìn)行哈希Hash運(yùn)算包括: 當(dāng)Key的位寬不是固定字節(jié)長(zhǎng)度時(shí),對(duì)所述Key進(jìn)行Hash運(yùn)算。
9.一種數(shù)據(jù)存儲(chǔ)裝置,其特征在于,所述裝置包括: 運(yùn)算單元,用于對(duì)待存儲(chǔ)到三態(tài)內(nèi)容尋址存儲(chǔ)器TCAM中的關(guān)鍵字Key進(jìn)行哈希Hash運(yùn)算,得到所述Key的Hash值; 申請(qǐng)單元,用于從預(yù)設(shè)的位圖中為所述Key申請(qǐng)一個(gè)空閑bit位,將所述空閑bit位的狀態(tài)置為占用; 第一存儲(chǔ)單元,用于將所述Key和所述Key對(duì)應(yīng)的bit位的身份標(biāo)識(shí)ID保存在預(yù)設(shè)的Hash表中所述Key的Hash值對(duì)應(yīng)的鏈表中,所述位圖和所述Hash表均保存在內(nèi)存中;第二存儲(chǔ)單元,用于將所述Key對(duì)應(yīng)的bit位的ID和所述Key的關(guān)聯(lián)數(shù)據(jù)存入TCAM中。
10.根據(jù)權(quán)利要求9所述的數(shù)據(jù)存儲(chǔ)裝置,其特征在于,所述運(yùn)算單元包括: 第一運(yùn)算子單元,用于當(dāng)Key的位寬超過(guò)預(yù)設(shè)字節(jié)長(zhǎng)度時(shí),對(duì)所述Key進(jìn)行Hash運(yùn)算。
11.根據(jù)權(quán)利要求9所述的數(shù)據(jù)存儲(chǔ)裝置,其特征在于,所述運(yùn)算單元包括: 第二運(yùn)算子單元,用于當(dāng)Key的位寬不是固定字節(jié)長(zhǎng)度時(shí),對(duì)所述Key進(jìn)行Hash運(yùn)算。
12.根據(jù)權(quán)利要求9所述的數(shù)據(jù)存儲(chǔ)裝置,其特征在于,所述申請(qǐng)單元包括: 搜索子單元,用于從所述位圖的第一個(gè)bit位開(kāi)始搜索空閑bit位; 分配子單元,用于當(dāng)所述搜索子單元搜索到第一個(gè)狀態(tài)為空閑的bit位時(shí),將所述bit位分配給所述Key。
13.根據(jù)權(quán)利要求9所述的數(shù)據(jù)存儲(chǔ)裝置,其特征在于,所述裝置還包括: 第一刪除單元,用于刪除TCAM中保存的所述Key對(duì)應(yīng)的bit位的ID和所述Key的關(guān)聯(lián)數(shù)據(jù); 第二刪除單元,用于刪除所述Hash表中所述Key的Hash值對(duì)應(yīng)的鏈表中保存的所述Key和所述Key對(duì)應(yīng)的bit位的ID ; 狀態(tài)設(shè)置單元,用于將所述位圖中所述Key對(duì)應(yīng)bit位的狀態(tài)設(shè)置為空閑。
14.一種數(shù)據(jù)查找裝置,其特征在于,所述裝置包括: 運(yùn)算單元,用于對(duì)待查找的關(guān)鍵字Key進(jìn)行哈希Hash運(yùn)算,得到所述Key的Hash值;第一查找單元,用于查找預(yù)設(shè)Hash表,獲取所述Key的Hash值對(duì)應(yīng)的鏈表中保存的所述Key對(duì)應(yīng)的bit位的身份標(biāo)識(shí)ID ;所述Key對(duì)應(yīng)的bit位為數(shù)據(jù)存儲(chǔ)過(guò)程中,從預(yù)設(shè)的位圖中為所述Key申請(qǐng)到的一個(gè)空閑bit位; 第二查找單元,用于依據(jù)所述Key對(duì)應(yīng)的bit位的ID,查找三態(tài)內(nèi)容尋址存儲(chǔ)器TCAM,獲取所述Key的關(guān)聯(lián)數(shù)據(jù)。
15.根據(jù)權(quán)利要求14所述的數(shù)據(jù)查找裝置,其特征在于,所述運(yùn)算單元包括: 第一運(yùn)算子單元,用于當(dāng)Key的位寬超過(guò)預(yù)設(shè)字節(jié)長(zhǎng)度時(shí),對(duì)所述Key進(jìn)行Hash運(yùn)算。
16.根據(jù)權(quán)利要求14所述的數(shù)據(jù)查找裝置,其特征在于,所述運(yùn)算單元包括: 第二運(yùn)算子單元,用于當(dāng)Key的位寬不是固定字節(jié)長(zhǎng)度時(shí),對(duì)所述Key進(jìn)行Hash運(yùn)算。
【文檔編號(hào)】G06F12/02GK104484281SQ201410829380
【公開(kāi)日】2015年4月1日 申請(qǐng)日期:2014年12月26日 優(yōu)先權(quán)日:2014年12月26日
【發(fā)明者】高鋆, 范路, 吳璠, 李明玉 申請(qǐng)人:杭州華三通信技術(shù)有限公司