專利名稱::一種數(shù)據(jù)緩存系統(tǒng)和數(shù)據(jù)查詢方法
技術(shù)領(lǐng)域:
:本發(fā)明涉及緩存技術(shù),更具體地說,涉及一種數(shù)據(jù)緩存系統(tǒng)和數(shù)據(jù)查詢方法。
背景技術(shù):
:為減輕數(shù)據(jù)庫服務(wù)器的訪問壓力,大多數(shù)數(shù)據(jù)庫服務(wù)器都設(shè)置有數(shù)據(jù)緩存系統(tǒng)。這種數(shù)據(jù)緩存系統(tǒng)的作用是臨時(shí)存儲用戶經(jīng)常訪問的數(shù)據(jù)。如此一來,當(dāng)用戶再次訪問已經(jīng)進(jìn)行了臨時(shí)存儲的數(shù)據(jù)時(shí)便可直接返回該數(shù)據(jù),而無需再從數(shù)據(jù)庫服務(wù)器中獲取該數(shù)據(jù),由此降低數(shù)據(jù)庫服務(wù)器的負(fù)擔(dān)。目前最為常用的一種網(wǎng)絡(luò)數(shù)據(jù)緩存系統(tǒng)為Memcached系統(tǒng)。Memcached系統(tǒng)是一種分布式內(nèi)存緩存系統(tǒng),其采用Client/Server(客戶端/服務(wù)器)結(jié)構(gòu),基于socket進(jìn)行通信。Memcached系統(tǒng)采用鍵(key)、值(value)方式進(jìn)行數(shù)據(jù)的緩存,不存在邏輯表的概念,所有數(shù)據(jù)均共享同一存儲空間。Memcached系統(tǒng)使用進(jìn)程內(nèi)存來存儲緩存的數(shù)據(jù),如此一來,當(dāng)Memcached系統(tǒng)的關(guān)鍵進(jìn)程發(fā)生異常導(dǎo)致Memcached系統(tǒng)重啟時(shí),通過Memcached系統(tǒng)緩存的數(shù)據(jù)將會丟失。此外,Memcached沒有數(shù)據(jù)表的概念,所有緩存數(shù)據(jù)共享同一存儲空間,缺少邏輯上的劃分,不便于數(shù)據(jù)的管理和使用。此外,Memcached系統(tǒng)不支持多索引,因此若希望為同一數(shù)據(jù)記錄設(shè)置多個(gè)索引,則需要為該數(shù)據(jù)記錄準(zhǔn)備多個(gè)副本,存儲空間浪費(fèi)嚴(yán)重。因此,需要一種數(shù)據(jù)緩存系統(tǒng),能夠有效克服現(xiàn)有Memcached系統(tǒng)存在的上述缺陷。
發(fā)明內(nèi)容本發(fā)明要解決的技術(shù)問題在于,針對現(xiàn)有Memcached系統(tǒng)不支持多索引等缺陷,提供一種數(shù)據(jù)緩存系統(tǒng)和數(shù)據(jù)查詢方法。本發(fā)明解決其技術(shù)問題所采用的技術(shù)方案是構(gòu)造一種數(shù)據(jù)緩存系統(tǒng),包括虛擬存儲模塊,設(shè)置在共享內(nèi)存中,包括元數(shù)據(jù)區(qū)和表數(shù)據(jù)區(qū),所述元數(shù)據(jù)區(qū)中存儲有元數(shù)據(jù)表,所述表數(shù)據(jù)區(qū)中設(shè)置有索引區(qū)和記錄區(qū),所述索引區(qū)中存儲有至少一個(gè)散列索引鏈表,每一散列索引鏈表包含至少一個(gè)子鏈表,所述記錄區(qū)中存儲有至少一條數(shù)據(jù)記錄;轉(zhuǎn)發(fā)模塊,用于接收搜索請求并判斷其所屬類型,然后依據(jù)該搜索請求的類型轉(zhuǎn)發(fā)該搜索請求;散列搜索模塊,用于接收轉(zhuǎn)發(fā)模塊轉(zhuǎn)發(fā)的單值搜索類型的搜索請求,提取其中包含的關(guān)鍵字,依據(jù)該關(guān)鍵字的類型在元數(shù)據(jù)表中查找對應(yīng)的索引信息,并依據(jù)該索引信息在索引區(qū)中查找對應(yīng)的散列索引鏈表;對關(guān)鍵字進(jìn)行散列計(jì)算并依據(jù)找到的散列索引鏈表中子鏈表的數(shù)量對散列計(jì)算結(jié)果進(jìn)行取余計(jì)算,在所述散列索引鏈表中查找取余計(jì)算結(jié)果對應(yīng)的子鏈表;依據(jù)所述散列計(jì)算結(jié)果在所述子鏈表中查找匹配的索引;依據(jù)所述索引在記錄區(qū)中查找匹配的數(shù)據(jù)記錄并返回。在本發(fā)明提供的數(shù)據(jù)緩存系統(tǒng)中,所述索引區(qū)中還存儲有至少一個(gè)T型索引樹,所述系統(tǒng)還包括T樹搜索模塊,用于接收轉(zhuǎn)發(fā)模塊轉(zhuǎn)發(fā)的范圍搜索類型的搜索請求,提取其中包含的搜索范圍;依據(jù)所述搜索范圍對應(yīng)的類型在元數(shù)據(jù)表中查找對應(yīng)的索引信息,并依據(jù)該索引信息在索引區(qū)中查找對應(yīng)的T型索引樹;依據(jù)所述搜索范圍的上邊界值和下邊界值在T型索引樹中查找匹配的索引;依據(jù)找到的索引在記錄區(qū)中查找匹配的數(shù)據(jù)記錄并返回。在本發(fā)明提供的數(shù)據(jù)緩存系統(tǒng)中,還包括初始化模塊,用于在啟動時(shí)讀取配置文件,據(jù)此基于共享內(nèi)存創(chuàng)建所述虛擬存儲模塊。在本發(fā)明提供的數(shù)據(jù)緩存系統(tǒng)中,所述配置文件采用XML格式。在本發(fā)明提供的數(shù)據(jù)緩存系統(tǒng)中,所述散列計(jì)算為CRC32計(jì)算。本發(fā)明還提供了一種數(shù)據(jù)查詢方法,用于在設(shè)置在共享內(nèi)存中的虛擬存儲模塊中查找對應(yīng)的數(shù)據(jù)記錄,其中,所述虛擬存儲模塊包括元數(shù)據(jù)區(qū)和表數(shù)據(jù)區(qū),所述元數(shù)據(jù)區(qū)中存儲有元數(shù)據(jù)表,所述表數(shù)據(jù)區(qū)中設(shè)置有索引區(qū)和記錄區(qū),所述索引區(qū)中存儲有至少一個(gè)散列索引鏈表,每一散列索引鏈表包含至少一個(gè)子鏈表,所述記錄區(qū)中存儲有至少一條數(shù)據(jù)記錄,所述方法包括轉(zhuǎn)發(fā)步驟,包括接收搜索請求并判斷其所屬類型,然后依據(jù)該搜索請求的類型轉(zhuǎn)發(fā)該搜索請求;散列搜索步驟,包括接收轉(zhuǎn)發(fā)的單值搜索類型的搜索請求,提取其中包含的關(guān)鍵字,依據(jù)該關(guān)鍵字的類型在元數(shù)據(jù)表中查找對應(yīng)的索引信息,并依據(jù)該索引信息在索引區(qū)中查找對應(yīng)的散列索引鏈表;對關(guān)鍵字進(jìn)行散列計(jì)算并依據(jù)找到的散列索引鏈表中子鏈表的數(shù)量對散列計(jì)算結(jié)果進(jìn)行取余計(jì)算,在所述散列索引鏈表中查找取余計(jì)算結(jié)果對應(yīng)的子鏈表;依據(jù)所述散列計(jì)算結(jié)果在所述子鏈表中查找匹配的索引;依據(jù)所述索引在記錄區(qū)中查找匹配的數(shù)據(jù)記錄并返回。在本發(fā)明提供的數(shù)據(jù)查詢方法中,所述索引區(qū)中還存儲有至少一個(gè)T型索引樹,所述方法還包括T樹搜索步驟,包括接收轉(zhuǎn)發(fā)的范圍搜索類型的搜索請求,提取其中包含的搜索范圍;依據(jù)所述搜索范圍對應(yīng)的類型在元數(shù)據(jù)表中查找對應(yīng)的索引信息,并依據(jù)該索引信息在索引區(qū)中查找對應(yīng)的T型索引樹;依據(jù)所述搜索范圍的上邊界值和下邊界值在T型索引樹中查找匹配的索引;依據(jù)找到的索引在記錄區(qū)中查找匹配的數(shù)據(jù)記錄并返回。5在本發(fā)明提供的數(shù)據(jù)查詢方法中,還包括初始化步驟,包括在啟動時(shí)讀取配置文件,據(jù)此基于共享內(nèi)存創(chuàng)建所述虛擬存儲模塊。在本發(fā)明提供的數(shù)據(jù)查詢方法中,所述配置文件采用XML格式。在本發(fā)明提供的數(shù)據(jù)查詢方法中,所述散列計(jì)算為CRC32計(jì)算。實(shí)施本發(fā)明的技術(shù)方案,具有以下有益效果在本發(fā)明提供的數(shù)據(jù)緩存系統(tǒng)和數(shù)據(jù)查詢方法中,緩存的數(shù)據(jù)記錄存儲在共享內(nèi)存中。如此一來,當(dāng)緩存系統(tǒng)的關(guān)鍵進(jìn)程發(fā)生異常導(dǎo)致進(jìn)程重啟時(shí),存儲在共享內(nèi)存中的數(shù)據(jù)記錄仍然可用。此外,本發(fā)明提供的技術(shù)方案將共享內(nèi)存劃分為元數(shù)據(jù)區(qū)和表數(shù)據(jù)區(qū),元數(shù)據(jù)區(qū)中存儲有元數(shù)據(jù)表,表數(shù)據(jù)區(qū)中設(shè)置有索引區(qū)和記錄區(qū),索引區(qū)中存儲有多個(gè)散列索引鏈表,每一散列索引鏈表包含多個(gè)子鏈表,記錄區(qū)中存儲有多條數(shù)據(jù)記錄,如此一來便可方便進(jìn)行數(shù)據(jù)的管理和使用。同時(shí),索引區(qū)中存儲有多個(gè)散列索引鏈表,由此便可實(shí)現(xiàn)通過多種索引對同一數(shù)據(jù)記錄進(jìn)行查詢。同理,索引區(qū)中還存儲有多個(gè)T型索引樹,如此一來便可實(shí)現(xiàn)范圍搜索。同時(shí),T型索引樹可依據(jù)索引的類型來設(shè)置,由此便可實(shí)現(xiàn)通過多種索引對同一數(shù)據(jù)記錄進(jìn)行查詢。下面將結(jié)合附圖及實(shí)施例對本發(fā)明作進(jìn)一步說明,附圖中圖1是依據(jù)本發(fā)明一較佳實(shí)施例的數(shù)據(jù)緩存系統(tǒng)的邏輯結(jié)構(gòu)示意圖;圖2是依據(jù)本發(fā)明一較佳實(shí)施例的虛擬存儲模塊的邏輯結(jié)構(gòu)示意圖。具體實(shí)施例方式為了使本發(fā)明的目的、技術(shù)方案及優(yōu)點(diǎn)更加清楚明白,以下結(jié)合附圖及實(shí)施例,對本發(fā)明進(jìn)行進(jìn)一步詳細(xì)說明。應(yīng)當(dāng)理解,此處所描述的具體實(shí)施例僅僅用以解釋本發(fā)明,并不用于限定本發(fā)明。本發(fā)明提供了一種數(shù)據(jù)緩存系統(tǒng)和數(shù)據(jù)查詢方法。在本發(fā)明提供的技術(shù)方案中,緩存的數(shù)據(jù)記錄存儲在共享內(nèi)存中。如此一來,當(dāng)緩存系統(tǒng)的關(guān)鍵進(jìn)程發(fā)生異常導(dǎo)致進(jìn)程重啟時(shí),存儲在共享內(nèi)存中的數(shù)據(jù)記錄仍然可用。此外,本發(fā)明提供的技術(shù)方案將共享內(nèi)存劃分為元數(shù)據(jù)區(qū)和表數(shù)據(jù)區(qū),元數(shù)據(jù)區(qū)中存儲有元數(shù)據(jù)表,表數(shù)據(jù)區(qū)中設(shè)置有索引區(qū)和記錄區(qū),索引區(qū)中存儲有多個(gè)散列索引鏈表,每一散列索引鏈表包含多個(gè)子鏈表,記錄區(qū)中存儲有多條數(shù)據(jù)記錄,如此一來便可方便進(jìn)行數(shù)據(jù)的管理和使用。同時(shí),索引區(qū)中存儲有多個(gè)散列索引鏈表,由此便可實(shí)現(xiàn)通過多種索引對同一數(shù)據(jù)記錄進(jìn)行查詢。同理,索引區(qū)中還存儲有多個(gè)T型索引樹,如此一來便可實(shí)現(xiàn)范圍搜索。同時(shí),T型索引樹可依據(jù)索引的類型來設(shè)置,由此便可實(shí)現(xiàn)通過多種索引對同一數(shù)據(jù)記錄進(jìn)行查詢。下面就結(jié)合附圖和具體實(shí)施例來對本發(fā)明的技術(shù)方案進(jìn)行詳細(xì)描述。圖1是依據(jù)本發(fā)明一較佳實(shí)施例的數(shù)據(jù)緩存系統(tǒng)100的邏輯結(jié)構(gòu)示意圖。如圖1所示,數(shù)據(jù)緩存系統(tǒng)100包括虛擬存儲模塊102、轉(zhuǎn)發(fā)模塊104、散列搜索模塊106、T樹搜索模塊108(可選的)和初始化模塊110。虛擬存儲模塊102設(shè)置在共享內(nèi)存中,其由共享內(nèi)存構(gòu)建,用于存儲緩存的數(shù)據(jù)記錄。通過采用共享內(nèi)存構(gòu)建虛擬存儲模塊,可在數(shù)據(jù)緩存系統(tǒng)100的關(guān)鍵進(jìn)程出現(xiàn)異常導(dǎo)致進(jìn)程重啟時(shí),達(dá)到緩存的數(shù)據(jù)不會丟失的目的。本發(fā)明提供的技術(shù)方案使用基于雙向鏈表的內(nèi)存管理技術(shù),來管理進(jìn)程間共享內(nèi)存的動態(tài)分配和釋放。初始進(jìn)程根據(jù)內(nèi)存表配置信息向系統(tǒng)申請指定大小共享內(nèi)存,并創(chuàng)建內(nèi)存分配邏輯單元,包括內(nèi)存分配管理信息以及上下節(jié)點(diǎn)指針,內(nèi)存管理單元以雙向鏈表的形式進(jìn)行鏈接,使系統(tǒng)在內(nèi)存釋放時(shí)可以快速釋放并進(jìn)行空閑內(nèi)存合并?;诠蚕韮?nèi)存的緩存技術(shù)解除了數(shù)據(jù)與管理進(jìn)程的捆綁關(guān)系,使內(nèi)存數(shù)據(jù)可以獨(dú)立于管理進(jìn)程而存在,不會出現(xiàn)在進(jìn)程退出而導(dǎo)致數(shù)據(jù)丟失的問題,同時(shí)共享內(nèi)存允許多進(jìn)程同時(shí)訪問,為提高系統(tǒng)吞吐量提供了基礎(chǔ)。虛擬存儲模塊102包括元數(shù)據(jù)區(qū)和表數(shù)據(jù)區(qū),元數(shù)據(jù)區(qū)中存儲有元數(shù)據(jù)表,表數(shù)據(jù)區(qū)中設(shè)置有索引區(qū)和記錄區(qū)。索引區(qū)中存儲有至少一個(gè)散列索引鏈表,每一散列索引鏈表包含至少一個(gè)子鏈表,記錄區(qū)中存儲有至少一條數(shù)據(jù)記錄。虛擬存儲模塊102的構(gòu)成如圖2所示。在具體實(shí)現(xiàn)過程中,虛擬存儲模塊102由初始化模塊110構(gòu)建。初始化模塊110用于在啟動時(shí)讀取配置文件,據(jù)此借助共享內(nèi)存創(chuàng)建虛擬存儲塊102。在具體實(shí)現(xiàn)過程中,上述配置文件采用XML格式。配置文件的具體實(shí)例如下<?xmlversion=“1.0"encoding=“UTF--8"?><!—editedwithXMLSPYv5U(http//www.xmlspy.com)byet8(et8)—><!—W3CSchemageneratedbyXMLSPYv5U(http://www.xmlspy.com)—><xs:schemaxmlns:xs="http://www.w3.org/2001/XMLSchema“e1ementFormDefau11="qualified">〈xs:elementname=“table"><xs:complexTypemixed=“true"><xs:sequence)<xs:elementname="column"maxOccurs="unbounded"><xs:complexType>〈xs:attributename=〃type〃><xs:simpleType><xs:restrictionbase=“xs:string/r><xs:enumerationvalue=“int"/><xs:enumerationvalue=“float"/><xs:enumerationvalue=“double"/><xs:enumerationvalue=“string"/>〈/xs:restriction〉〈/xs:simpleType></xs:attribute></xs:complexType></xs:element>〈xs:elementref=〃index"maxOccurs==〃unbounded"/>〈xselementref=“aging"/></xssequence)〈xs:attributename=”name“type二”xs:string"/>〈xs:attributename="type"><xs:simpleType><xs:restrictionbase="xs:string">〈xs:enumerationvalue="cache"/>〈xs:enumerationvalue="memory"/></xs:restriction)</xs:simpleType></xs:attribute)〈xs:attributename="storage"type二”xs:int"/><xs:attributename=/rinitload''><xs:simpleType>〈xs:restrictionbase="xs:int"><xs:enumerationvalue=/r0"/><xs:enumerationvalue="1"/>〈xs:enumerationvalue="2"/>〈/xs:restriction〉</xs:simpleType></xs:attribute)〈xs:attributename=“maxrecordnum!ftype二”xs:int/r/>〈/xs:complexType></xs:element〉<xs:elementname="index"><xs:complexType><xs:sequence)<xs:elementname="columnname"type=“xs:string/rmaxOccurs=”unbounded"/>〈/xs:sequence)〈xs:attributename=”name”type=”xs:string“use=〃required/r/>〈xs:attributename=”type"use二”required"><xs:simpleType><xs:restrictionbase="xs:string/r>〈xs:enumerationvalue二”hash"/>〈xs:enumerationvalue二”tree"/>〈/xs:restriction〉〈/xs:simpleType></xs:attribute)<xsattributename="primaly"type=“xs:boolean"use="optional“default=“false"/></xscomplexType></xs:element〉<xs:elementname="aging"><xs:complexType><xs:simpleContent><xs:extensionbase="agingSimpleType"><xs:attributename="value"type="xsint"/></xs:extension></xs:simpleContent></xs:complexType></xs:element〉<xs:simpleTypename="agingSimpleType"><xs:restrictionbase="xs:string"><xs:enumerationvalue="LRU"/><xs:enumerationvalue="NONE"/><xs:enumerationvalue="TIMEOUT"/></xs:restriction)</xs:simpleType></xs:element〉</xs:schema〉使用者可以定義表的名稱("table")、類型(“type")、存儲所需共享內(nèi)存大小(“storage")、初始數(shù)據(jù)加載方式(“initload")、列信息(“column")、索引信息(〃index")以及記錄淘汰機(jī)制(“aging")等,內(nèi)存表的初始化方法將解析此配置信息以創(chuàng)建虛擬存儲模塊102中的各種數(shù)據(jù)區(qū)和數(shù)據(jù)表。在本發(fā)明提供的技術(shù)方案中,對于記錄區(qū)中存儲的每一條數(shù)據(jù)記錄,都可以為其建立多個(gè)索引。為便于描述,將這種索引定義為原始索引。例如,若數(shù)據(jù)記錄為書目信息,則可分別依據(jù)書名、出版時(shí)間、價(jià)格、出版社等多種書目屬性構(gòu)建原始索引。在具體實(shí)現(xiàn)過程中,為便于進(jìn)行匹配計(jì)算,需要對為每條數(shù)據(jù)記錄構(gòu)建的原始索引進(jìn)行散列計(jì)算,以計(jì)算結(jié)果作為對應(yīng)數(shù)據(jù)記錄的索引。為便于描述,將這種經(jīng)過散列計(jì)算得到的索引定義為散列索引。如此一來,便可依據(jù)為每條數(shù)據(jù)記錄生成的散列索引構(gòu)建散列索引鏈表。作為可選的,在散列索引鏈表中,各個(gè)數(shù)據(jù)記錄的散列索引可依據(jù)散列結(jié)果的大小進(jìn)行排序。當(dāng)數(shù)據(jù)記錄數(shù)量較多時(shí),散列索引鏈表將十分龐大。為加快檢索,可將散列索引鏈表劃分為多個(gè)子鏈表(即散列桶)。這樣一來,便可對關(guān)鍵字進(jìn)行散列計(jì)算,并依據(jù)散列索引鏈表中子鏈表的數(shù)量對散列計(jì)算結(jié)果進(jìn)行取余計(jì)算,確定所要查找的索引所在的子鏈表。在具體實(shí)現(xiàn)過程中,上述散列計(jì)算可以是例如但不限于CRC32計(jì)算。本領(lǐng)域的技術(shù)人員應(yīng)當(dāng)明白,散列計(jì)算難免出現(xiàn)碰撞。例如,若對書目序號進(jìn)行散列計(jì)算并以計(jì)算結(jié)果作為索引,則可能存在不同書目序號經(jīng)散列計(jì)算得到同一散列計(jì)算結(jié)果的可能。如此一來,散列索引鏈表中將存在多個(gè)相同的索引,但這些相同的索引缺對應(yīng)不同的數(shù)據(jù)記錄。在具體應(yīng)用過程中,數(shù)據(jù)記錄的數(shù)量越龐大,碰撞發(fā)生的可能性就越大。為解決這一問題,在本發(fā)明提供的技術(shù)方案中,在記錄區(qū)中,每一數(shù)據(jù)條目中附加有上文所述的原始索引。以上述書目序號為例,每一數(shù)據(jù)條目中將附加有該書目的書目序號。這樣一來,在通過散列索引查找到對應(yīng)的多個(gè)數(shù)據(jù)記錄后,便可通過將關(guān)鍵字與原始索引進(jìn)行比較的方法,確定關(guān)鍵字對應(yīng)的數(shù)據(jù)記錄。轉(zhuǎn)發(fā)模塊104用于接收搜索請求并判斷其所屬類型,然后依據(jù)該搜索請求的類型轉(zhuǎn)發(fā)該搜索請求。在本發(fā)明提供的技術(shù)方案中,不僅可以進(jìn)行單值檢索,也可進(jìn)行范圍檢索。因此搜索請求可包括單值搜索類型和范圍搜索類型。散列搜索模塊106用于執(zhí)行如下操作接收轉(zhuǎn)發(fā)模塊104轉(zhuǎn)發(fā)的單值搜索類型的搜索請求,提取其中包含的關(guān)鍵字(例如書目序號100019),依據(jù)該關(guān)鍵字的類型(即書目序號)在元數(shù)據(jù)表中查找對應(yīng)的索引信息,并依據(jù)該索引信息在索引區(qū)中查找對應(yīng)的散列索引鏈表。例如,若關(guān)鍵字的類型為上文所述的書目序號,則在元數(shù)據(jù)表中查找樹木序號所對應(yīng)的索引信息,然后依據(jù)該索引信息在索引區(qū)中查找書目序號對應(yīng)的散列索引鏈表。對關(guān)鍵字進(jìn)行散列計(jì)算并依據(jù)找到的散列索引鏈表中子鏈表的數(shù)量對散列計(jì)算結(jié)果進(jìn)行取余計(jì)算,在所述散列索引鏈表中查找取余計(jì)算結(jié)果對應(yīng)的子鏈表。依據(jù)散列計(jì)算結(jié)果在上述子鏈表中查找匹配的散列索引。依據(jù)找到的散列索引在記錄區(qū)中查找匹配的數(shù)據(jù)記錄并返回。如上文所述,當(dāng)通過散列索引查找到的數(shù)據(jù)記錄不止一條時(shí),需要以關(guān)鍵字作為原始索引在找到的數(shù)據(jù)記錄中查找包含該關(guān)鍵字的數(shù)據(jù)記錄并返回。在本發(fā)明提供的技術(shù)方案中,輸入的關(guān)鍵字還可不止一個(gè)。在這種情況下,可將這些關(guān)鍵字拼成一個(gè)字符串,各關(guān)鍵字之間以預(yù)先設(shè)置的分隔符例如‘I’分隔。在查找過程中,對于字符串中的每一關(guān)鍵字,散列搜索模塊106都將執(zhí)行上述操作。因此,對于每一關(guān)鍵字,都將得到由多條數(shù)據(jù)記錄組成的記錄集合。散列搜索模塊106在對每一關(guān)鍵字都執(zhí)行上述操作之后,通過計(jì)算所得到的各個(gè)記錄集合的交集,便可得到想要的數(shù)據(jù)記錄。在本發(fā)明提供的技術(shù)方案中,在插入數(shù)據(jù)記錄時(shí),需要依據(jù)待插入數(shù)據(jù)記錄的散列索引的大小,將該散列索引插入對應(yīng)散列索引鏈表中對應(yīng)子鏈表中的適當(dāng)位置。而對應(yīng)的數(shù)據(jù)記錄只需插入對應(yīng)數(shù)據(jù)鏈表的尾部即可。而在刪除操作時(shí),需要同時(shí)更新對應(yīng)的散列索引鏈表。在本發(fā)明提供的技術(shù)方案中,索引區(qū)中還存儲有至少一個(gè)T型索引樹,此時(shí)數(shù)據(jù)緩存系統(tǒng)100還包括T樹搜索模塊,用于接收轉(zhuǎn)發(fā)模塊104轉(zhuǎn)發(fā)的范圍搜索類型的搜索請求,提取其中包含的搜索范圍;依據(jù)所述搜索范圍對應(yīng)的類型在元數(shù)據(jù)表中查找對應(yīng)的索引信息,并依據(jù)該索引信息在索引區(qū)中查找對應(yīng)的T型索引樹;10依據(jù)所述搜索范圍的上邊界值和下邊界值在T型索引樹中查找匹配的索引;依據(jù)找到的索引在記錄區(qū)中查找匹配的數(shù)據(jù)記錄并返回。T-TreeCT樹)為一棵平衡二叉樹,每個(gè)節(jié)點(diǎn)上保存多個(gè)元素(索引),因此比B-Tree(B樹)樹有更高的更新和存儲效率。如上文所述,在具體實(shí)現(xiàn)過程中,對于記錄區(qū)中存儲的每一條數(shù)據(jù)記錄,都可以為其建立多個(gè)索引。例如,若數(shù)據(jù)記錄為書目信息,則可分別依據(jù)出版時(shí)間、價(jià)格等多種書目屬性構(gòu)建索引。各條數(shù)據(jù)記錄的相同類型的索引構(gòu)成一棵T型索引樹,因此在為數(shù)據(jù)記錄構(gòu)建多個(gè)索引的情況下,索引區(qū)中可存在多棵T型索引樹。由此一來,用戶便可通過多種索引來查找想要的數(shù)據(jù)記錄。T型索引樹中的每個(gè)節(jié)點(diǎn)都包含從小到大排列的多個(gè)索引。每一索引都對應(yīng)一個(gè)T鏈表,該T鏈表中的每個(gè)節(jié)點(diǎn)對應(yīng)記錄區(qū)中的一條數(shù)據(jù)記錄,同一T鏈表中各節(jié)點(diǎn)所指向的數(shù)據(jù)記錄的對應(yīng)索引均相同。T型索引樹用于進(jìn)行范圍查找,也支持多列索引(可以根據(jù)部分列進(jìn)行查找,比如索引列為Cl、C2、C3,可以根據(jù)Cl、Cl和C2進(jìn)行查找)。對于單列索引,T型索引樹中每一節(jié)點(diǎn)中各索引所各自指向的T鏈表中的各個(gè)節(jié)點(diǎn)對應(yīng)記錄區(qū)中的具體數(shù)據(jù)記錄。對于多列索引,T型索引樹體現(xiàn)為多個(gè)T型索引樹的級聯(lián)。第一列樹的節(jié)點(diǎn)指向以第二列索引建立的T型索引樹,第二列樹的節(jié)點(diǎn)又指向以下一列索引建立的T型索引樹,這樣直到最后一列,最后一列樹的節(jié)點(diǎn)中各索引所各自指向的T鏈表中的各個(gè)節(jié)點(diǎn)對應(yīng)記錄區(qū)中的具體數(shù)據(jù)記錄。T型索引樹的查找按照如下方式進(jìn)行單樹的查找方法如下1、查找總是從根節(jié)點(diǎn)開始。2、如果輸入關(guān)鍵字小于當(dāng)前節(jié)點(diǎn)中包含的最小索引,則遞歸查詢左子樹;如果大于當(dāng)前節(jié)點(diǎn)中包含的最大索引,則遞歸查詢右子樹;否則在當(dāng)前節(jié)點(diǎn)中進(jìn)行二分查找。3、遍歷查找到的索引,其所指向的T鏈表中的各個(gè)節(jié)點(diǎn)所指向的數(shù)據(jù)記錄作為一個(gè)列表返回。4、對于范圍查找,分別基于搜索范圍的上邊界值和下邊界值,依照步驟1至3查找對應(yīng)的索引,并依據(jù)各條索引查找對應(yīng)的數(shù)據(jù)記錄。多列索引樹的查找方法如下1、根據(jù)第一索引列的關(guān)鍵字查找第二列索引樹,如果查找到,則根據(jù)第二索引列的關(guān)鍵字在第二列索引樹中查找第三列索引樹,如此類推,直到找到最后一列索引樹為止。2、如果在查找第N列索引樹時(shí)失敗,則返回失敗。3、如果找到最后一列索引樹,則使用最后一列索引列的關(guān)鍵字在最后一列索引樹中查找,查找到后返回對應(yīng)的數(shù)據(jù)記錄列表。如果是使用部分索引列進(jìn)行查找,則在最后一列索引樹中查找到的節(jié)點(diǎn)仍然是索引樹,需要遍歷該索引樹返回的所有數(shù)據(jù)記錄。T型索引樹的插入按照如下方式進(jìn)行單樹的插入算法如下1、插入總是從根節(jié)點(diǎn)開始。2、如果輸入關(guān)鍵字小于當(dāng)前節(jié)點(diǎn)中包含的最小索引、當(dāng)前節(jié)點(diǎn)沒有左子樹且當(dāng)前節(jié)點(diǎn)沒有滿,則在當(dāng)前節(jié)點(diǎn)中插入新索引(即該關(guān)鍵字);如果輸入關(guān)鍵字小于當(dāng)前節(jié)點(diǎn)中包含的最小元素、當(dāng)前節(jié)點(diǎn)有左子樹且當(dāng)前節(jié)點(diǎn)已滿,則在左子樹中遞歸插入新索引(即該關(guān)鍵字)(如果沒有左子樹,則創(chuàng)建左子樹),并且進(jìn)行平衡,平衡算法與AVL樹相同。3、如果輸入關(guān)鍵字大于當(dāng)前節(jié)點(diǎn)中包含的最大索引、當(dāng)前節(jié)點(diǎn)沒有右子樹且當(dāng)前節(jié)點(diǎn)沒有滿,則在當(dāng)前節(jié)點(diǎn)中插入新索引(即該關(guān)鍵字);如果輸入關(guān)鍵字大于當(dāng)前節(jié)點(diǎn)中包含的最大索引、當(dāng)前節(jié)點(diǎn)有右子樹且當(dāng)前節(jié)點(diǎn)已滿,則在右子樹中遞歸插入新索引(即該關(guān)鍵字)(如果沒有右子樹,則創(chuàng)建右子樹),并且進(jìn)行平衡,平衡算法跟AVL樹相同。4、如果輸入關(guān)鍵字大于等于當(dāng)前節(jié)點(diǎn)中包含的最小索引且小于等于最大索引,則在當(dāng)前節(jié)點(diǎn)中二分查找輸入的關(guān)鍵字,如果存在,則在該關(guān)鍵字對應(yīng)的T鏈表尾部增加新的節(jié)點(diǎn),并將對應(yīng)的數(shù)據(jù)記錄插入記錄區(qū);如果不存在,則判斷該節(jié)點(diǎn)上的索引數(shù)是否滿,如果沒滿,則插入到該節(jié)點(diǎn)中;如果滿了,則刪除最小索引,將最小索引遞歸插入到當(dāng)前子樹中。多列索引樹的插入算法如下1、根據(jù)第一索引列的關(guān)鍵字查找第二列索引樹,如果查找到,則根據(jù)第二索引列的關(guān)鍵字在第二列索引樹中查找第三列索引樹,如此類推,直到找到最后一列索引樹為止。如果在查找第N列索引樹時(shí)失敗,則新建一棵索引樹作為第N列索引樹,并在前一列索引樹中插入新節(jié)點(diǎn),新節(jié)點(diǎn)指向新建索引樹根節(jié)點(diǎn),然后新建第N+1列索引樹,直到新建最后一列索引樹為止。2、在最后一列索引樹上插入新節(jié)點(diǎn),新節(jié)點(diǎn)指向新分配的數(shù)據(jù)節(jié)點(diǎn)。T型索引樹的刪除1、刪除總是從根節(jié)點(diǎn)開始。2、如果輸入關(guān)鍵字小于當(dāng)前節(jié)點(diǎn)中包含的最小索引,則在左子樹中遞歸刪除,如果在左子樹中刪除了樹節(jié)點(diǎn),則需要重新平衡左子樹。3、如果輸入關(guān)鍵字大于當(dāng)前節(jié)點(diǎn)中包含的最大索引,則在右子樹中遞歸刪除,如果在右子樹中刪除了樹節(jié)點(diǎn),則需要重新平衡右子樹。4、如果輸入關(guān)鍵字大于等于當(dāng)前節(jié)點(diǎn)中包含的最小索引且小于等于最大索引,則在當(dāng)前節(jié)點(diǎn)中二分查找輸入關(guān)鍵字,如果不存在,則返回刪除失??;如果存在,則刪除該索引。5、刪除索引后,如果當(dāng)前節(jié)點(diǎn)為空,則刪除當(dāng)前節(jié)點(diǎn)。6、刪除索引后,如果當(dāng)前節(jié)點(diǎn)為half-leaf節(jié)點(diǎn)(左子樹或右子樹為葉子節(jié)點(diǎn)),則將葉子節(jié)點(diǎn)合并到當(dāng)前節(jié)點(diǎn),如果葉子節(jié)點(diǎn)合并后還有索引,則繼續(xù)保留該葉子節(jié)點(diǎn),否則刪除葉子節(jié)點(diǎn),重新平衡當(dāng)前節(jié)點(diǎn)。7、刪除索引后,如果當(dāng)前節(jié)點(diǎn)不是half-leaf節(jié)點(diǎn)且當(dāng)前節(jié)點(diǎn)中包含的索引數(shù)小于下限值,則將右子樹中的最小葉子節(jié)點(diǎn)或half-leaf節(jié)點(diǎn)中包含的最小索引移到本節(jié)點(diǎn)中,重新平衡當(dāng)前節(jié)點(diǎn)。8、返回刪除元素指向的所有數(shù)據(jù)記錄。T型索引樹的生成1、從待插入數(shù)據(jù)記錄中取到索引列的值作為T型索引樹的索弓丨,利用Googleprotocolbuffers對數(shù)據(jù)記錄序列化,并在共享內(nèi)存表記錄區(qū)中分配數(shù)據(jù)節(jié)點(diǎn),然后逐條12記錄插入到T型索引樹中2、如果為單列索引,則直接插入到T型索引樹中,節(jié)點(diǎn)中的各個(gè)索引指向新分配的數(shù)據(jù)記錄。3、如果為多列索引,則根據(jù)第一索引列的關(guān)鍵字查找第二列索引樹,如果查找到,則根據(jù)第二索引列的關(guān)鍵字在第二列索引樹中查找第三列索引樹,如此類推,直到找到最后一列索引樹為止。如果在查找第N列索引樹時(shí)失敗,則新建一棵索引樹作為第N列索引樹,并在前一列索引樹中插入新節(jié)點(diǎn),新value節(jié)點(diǎn)中的各個(gè)索引指向新建索引樹根節(jié)點(diǎn),然后新建第N+1列索引樹,直到新建最后一列索引樹為止。4、在最后一列索引樹上插入新節(jié)點(diǎn),新節(jié)點(diǎn)中的各個(gè)索引指向新分配的數(shù)據(jù)記錄。由Google公司提供的開源工具protocolbuffers是一個(gè)靈活、高效的對結(jié)構(gòu)化數(shù)據(jù)進(jìn)行序列化的自動化工具,相比xml,它更小、更靈活、更簡單,在老的數(shù)據(jù)不做修改的前提下,可以對現(xiàn)有已經(jīng)定義并使用的數(shù)據(jù)結(jié)構(gòu)進(jìn)行擴(kuò)充,且不會影響現(xiàn)有數(shù)據(jù)。本發(fā)明使用protocalbuffers的自解析以及編碼功能保存內(nèi)存表記錄,在插入記錄時(shí),本發(fā)明首先從元數(shù)據(jù)區(qū)獲取當(dāng)前表的定義信息,然后根據(jù)定義信息對待插入數(shù)據(jù)記錄進(jìn)行protocolbuffers編碼,在查詢返回結(jié)果集記錄時(shí),應(yīng)用程序可以根據(jù)表定義信息對查詢返回的記錄集進(jìn)行反序列化,由于protocolbuffer編解碼能力表現(xiàn)較好,且對數(shù)據(jù)有一定的壓縮功能,使用它既不會對性能產(chǎn)生較大影響而且還節(jié)省內(nèi)存空間。本發(fā)明還提供了一種數(shù)據(jù)查詢方法,用于在設(shè)置在共享內(nèi)存中的虛擬存儲模塊中查找對應(yīng)的數(shù)據(jù)記錄,其中,所述虛擬存儲模塊包括元數(shù)據(jù)區(qū)和表數(shù)據(jù)區(qū),所述元數(shù)據(jù)區(qū)中存儲有元數(shù)據(jù)表,所述表數(shù)據(jù)區(qū)中設(shè)置有索引區(qū)和記錄區(qū),所述索引區(qū)中存儲有至少一個(gè)散列索引鏈表,每一散列索引鏈表包含至少一個(gè)子鏈表,所述記錄區(qū)中存儲有至少一條數(shù)據(jù)記錄。上述虛擬存儲模塊在初始化步驟中構(gòu)建,該初始化步驟包括在啟動時(shí)讀取配置文件,據(jù)此基于共享內(nèi)存創(chuàng)建所述虛擬存儲模塊。如上文所述,配置文件可采用例如但不限于XML格式。有關(guān)配置文件的內(nèi)容已經(jīng)在前文做了清楚的描述,因此此處不再贅述。本發(fā)明提供的數(shù)據(jù)查詢方法包括轉(zhuǎn)發(fā)步驟,包括接收搜索請求并判斷其所屬類型,然后依據(jù)該搜索請求的類型轉(zhuǎn)發(fā)該搜索請求;散列搜索步驟,包括接收轉(zhuǎn)發(fā)的單值搜索類型的搜索請求,提取其中包含的關(guān)鍵字,依據(jù)該關(guān)鍵字的類型在元數(shù)據(jù)表中查找對應(yīng)的索引信息,并依據(jù)該索引信息在索引區(qū)中查找對應(yīng)的散列索引鏈表;對關(guān)鍵字進(jìn)行散列計(jì)算并依據(jù)找到的散列索引鏈表中子鏈表的數(shù)量對散列計(jì)算結(jié)果進(jìn)行取余計(jì)算,在所述散列索引鏈表中查找取余計(jì)算結(jié)果對應(yīng)的子鏈表;在具體實(shí)現(xiàn)過程中,散列計(jì)算可采用例如但不限于CRC32計(jì)算。依據(jù)所述散列計(jì)算結(jié)果在所述子鏈表中查找匹配的索引;依據(jù)所述索引在記錄區(qū)中查找匹配的數(shù)據(jù)記錄并返回。如上文所述,當(dāng)通過散列索引查找到的數(shù)據(jù)記錄不止一條時(shí),需要以關(guān)鍵字作為原始索引在找到的數(shù)據(jù)記錄中查找包含該關(guān)鍵字的數(shù)據(jù)記錄并返回。在具體實(shí)現(xiàn)過程中,索引區(qū)中還存儲有至少一個(gè)T型索引樹,所述方法還包括T樹搜索步驟,包括接收轉(zhuǎn)發(fā)的范圍搜索類型的搜索請求,提取其中包含的搜索范圍;依據(jù)所述搜索范圍對應(yīng)的類型在元數(shù)據(jù)表中查找對應(yīng)的索引信息,并依據(jù)該索引信息在索引區(qū)中查找對應(yīng)的T型索引樹;依據(jù)所述搜索范圍的上邊界值和下邊界值在T型索引樹中查找匹配的索引;依據(jù)找到的索引在記錄區(qū)中查找匹配的數(shù)據(jù)記錄并返回。以上所述僅為本發(fā)明的較佳實(shí)施例而已,并不用以限制本發(fā)明,凡在本發(fā)明的精神和原則之內(nèi)所作的任何修改、等同替換和改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。權(quán)利要求1.一種數(shù)據(jù)緩存系統(tǒng),其特征在于,包括虛擬存儲模塊,設(shè)置在共享內(nèi)存中,包括元數(shù)據(jù)區(qū)和表數(shù)據(jù)區(qū),所述元數(shù)據(jù)區(qū)中存儲有元數(shù)據(jù)表,所述表數(shù)據(jù)區(qū)中設(shè)置有索引區(qū)和記錄區(qū),所述索引區(qū)中存儲有至少一個(gè)散列索引鏈表,每一散列索引鏈表包含至少一個(gè)子鏈表,所述記錄區(qū)中存儲有至少一條數(shù)據(jù)記錄;轉(zhuǎn)發(fā)模塊,用于接收搜索請求并判斷其所屬操作類型,然后依據(jù)該搜索請求的類型轉(zhuǎn)發(fā)該搜索請求;散列搜索模塊,用于接收轉(zhuǎn)發(fā)模塊轉(zhuǎn)發(fā)的單值搜索類型的搜索請求,提取其中包含的關(guān)鍵字,依據(jù)該關(guān)鍵字的類型在元數(shù)據(jù)表中查找對應(yīng)的索引信息,并依據(jù)該索引信息在索引區(qū)中查找對應(yīng)的散列索引鏈表;對關(guān)鍵字進(jìn)行散列計(jì)算并依據(jù)找到的散列索引鏈表中子鏈表的數(shù)量對散列計(jì)算結(jié)果進(jìn)行取余計(jì)算,在所述散列索引鏈表中查找取余計(jì)算結(jié)果對應(yīng)的子鏈表;依據(jù)所述散列計(jì)算結(jié)果在所述子鏈表中查找匹配的索引;依據(jù)所述索引在記錄區(qū)中查找匹配的數(shù)據(jù)記錄并返回。2.根據(jù)權(quán)利要求1所述的數(shù)據(jù)緩存系統(tǒng),其特征在于,所述索引區(qū)中還存儲有至少一個(gè)T型索引樹,所述系統(tǒng)還包括T樹搜索模塊,用于接收轉(zhuǎn)發(fā)模塊轉(zhuǎn)發(fā)的范圍搜索類型的搜索請求,提取其中包含的搜索范圍;依據(jù)所述搜索范圍對應(yīng)的類型在元數(shù)據(jù)表中查找對應(yīng)的索引信息,并依據(jù)該索引信息在索引區(qū)中查找對應(yīng)的T型索引樹;依據(jù)所述搜索范圍的上邊界值和下邊界值在T型索引樹中查找匹配的索引;依據(jù)找到的索引在記錄區(qū)中查找匹配的數(shù)據(jù)記錄并返回。3.根據(jù)權(quán)利要求1或2所述的數(shù)據(jù)緩存系統(tǒng),其特征在于,還包括初始化模塊,用于在啟動時(shí)讀取配置文件,據(jù)此基于共享內(nèi)存創(chuàng)建所述虛擬存儲模塊。4.根據(jù)權(quán)利要求3所述的數(shù)據(jù)緩存系統(tǒng),其特征在于,所述配置文件采用XML格式。5.根據(jù)權(quán)利要求4所述的數(shù)據(jù)緩存系統(tǒng),其特征在于,所述散列計(jì)算為CRC32計(jì)算。6.一種數(shù)據(jù)查詢方法,其特征在于,用于在設(shè)置在共享內(nèi)存中的虛擬存儲模塊中查找對應(yīng)的數(shù)據(jù)記錄,其中,所述虛擬存儲模塊包括元數(shù)據(jù)區(qū)和表數(shù)據(jù)區(qū),所述元數(shù)據(jù)區(qū)中存儲有元數(shù)據(jù)表,所述表數(shù)據(jù)區(qū)中設(shè)置有索引區(qū)和記錄區(qū),所述索引區(qū)中存儲有至少一個(gè)散列索引鏈表,每一散列索引鏈表包含至少一個(gè)子鏈表,所述記錄區(qū)中存儲有至少一條數(shù)據(jù)記錄,所述方法包括轉(zhuǎn)發(fā)步驟,包括接收搜索請求并判斷其所屬類型,然后依據(jù)該搜索請求的類型轉(zhuǎn)發(fā)該搜索請求;散列搜索步驟,包括接收轉(zhuǎn)發(fā)的單值搜索類型的搜索請求,提取其中包含的關(guān)鍵字,依據(jù)該關(guān)鍵字的類型在元數(shù)據(jù)表中查找對應(yīng)的索引信息,并依據(jù)該索引信息在索引區(qū)中查找對應(yīng)的散列索引鏈表;對關(guān)鍵字進(jìn)行散列計(jì)算并依據(jù)找到的散列索引鏈表中子鏈表的數(shù)量對散列計(jì)算結(jié)果進(jìn)行取余計(jì)算,在所述散列索引鏈表中查找取余計(jì)算結(jié)果對應(yīng)的子鏈表;依據(jù)所述散列計(jì)算結(jié)果在所述子鏈表中查找匹配的索引;依據(jù)所述索引在記錄區(qū)中查找匹配的數(shù)據(jù)記錄并返回。7.根據(jù)權(quán)利要求6所述的數(shù)據(jù)查詢方法,其特征在于,所述索引區(qū)中還存儲有至少一個(gè)T型索引樹,所述方法還包括T樹搜索步驟,包括接收轉(zhuǎn)發(fā)的范圍搜索類型的搜索請求,提取其中包含的搜索范圍;依據(jù)所述搜索范圍對應(yīng)的類型在元數(shù)據(jù)表中查找對應(yīng)的索引信息,并依據(jù)該索引信息在索引區(qū)中查找對應(yīng)的T型索引樹;依據(jù)所述搜索范圍的上邊界值和下邊界值在T型索引樹中查找匹配的索引;依據(jù)找到的索引在記錄區(qū)中查找匹配的數(shù)據(jù)記錄并返回。8.根據(jù)權(quán)利要求6或7所述的數(shù)據(jù)查詢方法,其特征在于,還包括初始化步驟,包括在啟動時(shí)讀取配置文件,據(jù)此基于共享內(nèi)存創(chuàng)建所述虛擬存儲模塊。9.根據(jù)權(quán)利要求8所述的數(shù)據(jù)查詢方法,其特征在于,所述配置文件采用XML格式。10.根據(jù)權(quán)利要求9所述的數(shù)據(jù)查詢方法,其特征在于,所述散列計(jì)算為CRC32計(jì)算。全文摘要本發(fā)明涉及緩存技術(shù),針對現(xiàn)有Memcached系統(tǒng)不支持多索引等缺陷,提供一種數(shù)據(jù)緩存系統(tǒng)和數(shù)據(jù)查詢方法。數(shù)據(jù)緩存系統(tǒng)包括虛擬存儲模塊,設(shè)置在共享內(nèi)存中;轉(zhuǎn)發(fā)模塊,用于接收搜索請求并判斷其所屬類型,然后轉(zhuǎn)發(fā)該搜索請求;散列搜索模塊,用于接收單值搜索類型的搜索請求,提取關(guān)鍵字,依據(jù)該關(guān)鍵字的類型在元數(shù)據(jù)表中查找對應(yīng)的索引信息,并依據(jù)該索引信息在索引區(qū)中查找對應(yīng)的散列索引鏈表;依據(jù)所述散列計(jì)算結(jié)果在所述子鏈表中查找匹配的索引,據(jù)此查找匹配的數(shù)據(jù)記錄。本發(fā)明還提供了一種數(shù)據(jù)查詢方法。本發(fā)明提供的技術(shù)方案支持多索引,且采用共享內(nèi)存方式存儲數(shù)據(jù)記錄,可有效克服現(xiàn)有Memcached系統(tǒng)中存在的缺陷。文檔編號G06F17/30GK102122285SQ20101004273公開日2011年7月13日申請日期2010年1月11日優(yōu)先權(quán)日2010年1月11日發(fā)明者劉志堯,呂秋明,廖炳才,張宗元,李升林,林偉軍,柳江,樊小彬,王迎鋒,肖偉,鄧福喜申請人:卓望數(shù)碼技術(shù)(深圳)有限公司