本申請涉及計(jì)算機(jī)軟件
技術(shù)領(lǐng)域:
:,尤其涉及一種lsm樹的建立方法、lsm樹的數(shù)據(jù)讀取方法和服務(wù)器。
背景技術(shù):
::在基于lsm-tree(log-structuredmergetree,lsm樹)的存儲系統(tǒng)中,一般需要通過compaction消除臟數(shù)據(jù)。其中,compaction過程就是根據(jù)一定策略消除存儲引擎中的臟數(shù)據(jù),以釋放磁盤空間。因?yàn)椋琹sm-tree是一種只讀的數(shù)據(jù)存儲模式,現(xiàn)有的lsm-tree中的消除臟數(shù)據(jù)的方式一般是,合并多個有序文件來去除臟數(shù)據(jù)。按照lsm-tree模型,將原本的隨機(jī)寫轉(zhuǎn)化為了批量追加寫,從而提高了系統(tǒng)的吞吐量。對于lsm樹而言,存儲引擎中的文件是分層存儲的。通過compact動作,從第i層和第i+1層選取若干文件,讀入內(nèi)存,對這些文件中的數(shù)據(jù)進(jìn)行排序,以去除臟數(shù)據(jù),然后將去除臟數(shù)據(jù)后的數(shù)據(jù)寫入文件,放到第i+1層。由此可見,在這樣模型下,消除臟數(shù)據(jù)的時候,存在嚴(yán)重的寫放大(實(shí)際寫入的數(shù)據(jù)量與系統(tǒng)真實(shí)寫入數(shù)據(jù)量的比值)情況。假設(shè)一個數(shù)據(jù)從第0層最終移動到第n層,那么在這個數(shù)據(jù)整個的生命周期中,被寫了n-1次,寫放大系數(shù)就是n-1。進(jìn)一步的,如果需要從lsm-tree中查找并讀取某個數(shù)據(jù),那么需要將lsm-tree中各個文件逐個文件讀取至內(nèi)存中進(jìn)行查找。然而,由于系統(tǒng)硬件的io帶寬是有限的,這種基于lsm-tree的查找數(shù)據(jù)的方式,和消除臟數(shù)據(jù)時候所存在的寫放大情況,都將會嚴(yán)重影響系統(tǒng)的吞吐量。針對上述問題,目前尚未提出有效的解決方案。技術(shù)實(shí)現(xiàn)要素:本申請實(shí)施例的目的是提供一種lsm樹的數(shù)據(jù)讀取方法、lsm樹的建立方法及服務(wù)器,以有效減少系統(tǒng)的讀寫負(fù)擔(dān)。為解決上述技術(shù)問題,本申請實(shí)施例是這樣實(shí)現(xiàn)的:一種lsm樹的建立方法,包括:確定內(nèi)存中是否已寫滿預(yù)定數(shù)量的數(shù)據(jù);如果已經(jīng)寫滿,則將所述內(nèi)存中的數(shù)據(jù),轉(zhuǎn)換為第一類文件和第二類文件,并將所述第二類文件存入lsm樹中,將所述第一類文件存入所述lsm樹的第0層,其中,所述第一類文件中存儲有數(shù)據(jù)的標(biāo)識和標(biāo)識對應(yīng)的數(shù)據(jù)的值在第二類文件中的索引,所述第二類文件中存儲有數(shù)據(jù)的值;確定所述lsm樹中是否有已經(jīng)存滿數(shù)據(jù)的層,如果有,則將該層所存的第一類文件和該層的下一層所存的第一類文件讀取至內(nèi)存中;對讀取至內(nèi)存中的第一類文件中的標(biāo)識進(jìn)行去重和重新排序,并將去重和重新排序后的第一類文件存入所述該層的下一層。一種lsm樹的數(shù)據(jù)讀取方法,包括:響應(yīng)于數(shù)據(jù)讀取請求,確定內(nèi)存中是否有所述數(shù)據(jù)讀取請求所請求的數(shù)據(jù);如果沒有,則從所述lsm樹的第0層開始,逐層將當(dāng)前層的第一類文件緩存至內(nèi)存中,并確定緩存至內(nèi)存中的第一類文件中是否存儲有所請求數(shù)據(jù)的索引,其中,所述第一類文件中存儲有數(shù)據(jù)的標(biāo)識和標(biāo)識對應(yīng)的數(shù)據(jù)的值在第二類文件中的索引;在確定緩存至內(nèi)存中的第一類文件中存儲有所請求數(shù)據(jù)的索引的情況下,根據(jù)索引,將存儲有所請求的數(shù)據(jù)的第二類文件緩存至所述內(nèi)存中,并從緩存至所述內(nèi)存中的第二類文件中讀取所述數(shù)據(jù)讀取請求所請求的數(shù)據(jù)。一種服務(wù)器,包括存儲器、處理器及存儲在存儲上并可在處理器上運(yùn)行的計(jì)算機(jī)程序,所述處理器執(zhí)行所述程序時實(shí)現(xiàn)以下步驟:確定內(nèi)存中是否已寫滿預(yù)定數(shù)量的數(shù)據(jù);如果已經(jīng)寫滿,則將所述內(nèi)存中的數(shù)據(jù),轉(zhuǎn)換為第一類文件和第二類文件,并將所述第二類文件存入lsm樹中,將所述第一類文件存入所述lsm樹的第0層,其中,所述第一類文件中存儲有數(shù)據(jù)的標(biāo)識和標(biāo)識對應(yīng)的數(shù)據(jù)的值在第二類文件中的索引,所述第二類文件中存儲有數(shù)據(jù)的值;確定所述lsm樹中是否有已經(jīng)存滿數(shù)據(jù)的層,如果有,則將該層所存的第一類文件和該層的下一層所存的第一類文件讀取至內(nèi)存中;對讀取至內(nèi)存中的第一類文件中的標(biāo)識進(jìn)行去重和重新排序,并將去重和重新排序后的第一類文件存入所述該層的下一層。一種服務(wù)器,包括存儲器、處理器及存儲在存儲上并可在處理器上運(yùn)行的計(jì)算機(jī)程序,所述處理器執(zhí)行所述程序時實(shí)現(xiàn)以下步驟:響應(yīng)于數(shù)據(jù)讀取請求,確定內(nèi)存中是否有所述數(shù)據(jù)讀取請求所請求的數(shù)據(jù);如果沒有,則從所述lsm樹的第0層開始,逐層將當(dāng)前層的第一類文件緩存至內(nèi)存中,并確定緩存至內(nèi)存中的第一類文件中是否存儲有所請求數(shù)據(jù)的索引,其中,所述第一類文件中存儲有數(shù)據(jù)的標(biāo)識和標(biāo)識對應(yīng)的數(shù)據(jù)的值在第二類文件中的索引;在確定緩存至內(nèi)存中的第一類文件中存儲有所請求數(shù)據(jù)的索引的情況下根據(jù)索引,將存儲有所請求的數(shù)據(jù)的第二類文件緩存至所述內(nèi)存中,并從緩存至所述內(nèi)存中的第二類文件中讀取所述數(shù)據(jù)讀取請求所請求的數(shù)據(jù)。由以上本申請實(shí)施例提供的技術(shù)方案可見,本申請實(shí)施例將數(shù)據(jù)標(biāo)識和標(biāo)識對應(yīng)的數(shù)據(jù)值分開在不同文件中存儲,使得在進(jìn)行數(shù)據(jù)查找的時候,可以僅讀取lsm中的標(biāo)識文件進(jìn)行查找操作,不需要一并讀取存儲數(shù)據(jù)值的文件,相對于未設(shè)置標(biāo)識索引文件的方式,可以減少數(shù)據(jù)讀取量,在進(jìn)行臟數(shù)據(jù)刪除的時候,也可以僅讀取標(biāo)識文件,對標(biāo)識文件進(jìn)行重排序以去除臟數(shù)據(jù),然后,再將重排序后的數(shù)據(jù)寫入,因?yàn)檫@個過程中,可以不讀取和寫入存儲數(shù)據(jù)值的文件,因此,可以減少寫放大,從而可以達(dá)到有效減少系統(tǒng)的讀寫負(fù)擔(dān)的技術(shù)效果。附圖說明為了更清楚地說明本申請實(shí)施例或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對實(shí)施例或現(xiàn)有技術(shù)描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本申請中記載的一些實(shí)施例,對于本領(lǐng)域普通技術(shù)人員來講,在不付出創(chuàng)造性勞動性的前提下,還可以根據(jù)這些附圖獲得其他的附圖。圖1為本申請一個實(shí)施例的lsm樹的建立方法流程圖;圖2為本申請一種文件分類的示意圖;圖3為本申請一個實(shí)施例的lsm樹示意圖;圖4為本申請一個實(shí)施例的lsm樹的數(shù)據(jù)讀取方法流程圖;圖5為本申請一個實(shí)施例的服務(wù)器的架構(gòu)示意圖。具體實(shí)施方式本申請實(shí)施例提供一種lsm樹的數(shù)據(jù)讀取方法、lsm樹的建立方法及服務(wù)器。為了使本
技術(shù)領(lǐng)域:
:的人員更好地理解本申請中的技術(shù)方案,下面將結(jié)合本申請實(shí)施例中的附圖,對本申請實(shí)施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實(shí)施例僅僅是本申請一部分實(shí)施例,而不是全部的實(shí)施例?;诒旧暾堉械膶?shí)施例,本領(lǐng)域普通技術(shù)人員在沒有作出創(chuàng)造性勞動前提下所獲得的所有其他實(shí)施例,都應(yīng)當(dāng)屬于本申請保護(hù)的范圍。為了更好地說明本申請,下面先對幾個術(shù)語進(jìn)行解釋如下:1)lsm-tree,lsm樹是一種數(shù)據(jù)結(jié)構(gòu),支持增、刪、讀、改、順序掃描操作,而且通過批量存儲技術(shù)規(guī)避了磁盤隨機(jī)寫入的問題。lsm樹犧牲了部分的讀性能,用來大幅提高寫性能?;趌sm樹實(shí)現(xiàn)的數(shù)據(jù)庫有例如:leveldb、hbase等。2)compaction動作,基于lsm樹實(shí)現(xiàn)的存儲引擎中,存儲引擎會周期性地執(zhí)行合并數(shù)據(jù)的操作,該過程能夠消除臟數(shù)據(jù),可以將這個消除臟數(shù)據(jù)的動作稱為compaction動作。3)寫放大(writeamplification,簡稱為waf),寫放大系數(shù),指代在ssd磁盤中,實(shí)際寫入的數(shù)據(jù)量與系統(tǒng)真實(shí)寫入數(shù)據(jù)量的比值。4)臟數(shù)據(jù),表示已經(jīng)不再訪問的數(shù)據(jù),或者是舊數(shù)據(jù),或者被邏輯刪除了的數(shù)據(jù)。考慮到現(xiàn)有的lsm樹所存在的系統(tǒng)吞吐量負(fù)擔(dān)過重的問題,在申請實(shí)施例中提供了一種lsm樹的建立方法,如圖1所示,可以包括以下步驟:步驟101:確定內(nèi)存中是否已寫滿預(yù)定數(shù)量的數(shù)據(jù);內(nèi)存中可以預(yù)先分配一塊區(qū)域,或者是建立一個存儲表格,用于存儲后續(xù)需要放入lsm樹中的數(shù)據(jù)的。在有數(shù)據(jù)需要存入lsm樹的時候,可以是先存儲在內(nèi)存中,等到內(nèi)存中的數(shù)據(jù)滿了之后,才會將這些數(shù)據(jù)一起存入lsm樹的第0層。具體地,在實(shí)現(xiàn)的時候,lsm樹可以是類似金字塔的形狀,第0層、第1層、第2層…第m層。越下面的層比越上面的層的存儲空間更大一些,例如,第2層的存儲空間是大于第1層的,第1層的存儲空間是大于第0層的。在存儲的時候可以遵循,先存儲在第0層,第0層滿了之后將第0層的數(shù)據(jù)一起寫入第1層中,以此類推,將數(shù)據(jù)寫入lsm樹中。步驟102:如果已經(jīng)寫滿,則將所述內(nèi)存中的數(shù)據(jù),轉(zhuǎn)換為第一類文件和第二類文件存入lsm樹的第0層,其中,所述第一類文件中包括數(shù)據(jù)的標(biāo)識和標(biāo)識對應(yīng)的數(shù)據(jù)的值在第二類文件中的索引,所述第二類文件中包括數(shù)據(jù)的值:在一個實(shí)施方式中,可以有多個第二類文件,相應(yīng)的,索引可以包括:數(shù)據(jù)標(biāo)識所標(biāo)識的數(shù)據(jù)所在的第二類文件的文件編號以及在該第二類文件中的偏移量。對于內(nèi)存中寫入lsm樹中的數(shù)據(jù),可以生成兩類文件:第一類文件,用于存儲數(shù)據(jù)的標(biāo)識(可以稱為key)以及,標(biāo)識對應(yīng)的數(shù)據(jù)在第二類文件中的索引;第二類文件,用于存儲數(shù)據(jù)的值(可以稱為value)。因?yàn)榇鎯?nèi)容分為了key和value兩個獨(dú)立的部分,即,一個key文件和一個value文件,而不是按照key-value對的方式集中存儲的,從而使得在進(jìn)行數(shù)據(jù)查找或者是數(shù)據(jù)的排序或者是清除合并的時候,可以直接通過key文件執(zhí)行,其中,key文件相對于value文件要小很多,因此,通過設(shè)置第一類文件和第二類文件的方式,在查找數(shù)據(jù)或者是去重的時候,可以僅讀取第一類文件到內(nèi)存中,將去重后的數(shù)據(jù)寫入的時候,也就可以僅寫入第一類文件,因此可以有效減輕系統(tǒng)的負(fù)擔(dān)。即,可以如圖2所示,將原本的kv(鍵值對)轉(zhuǎn)換為key+索引和value,實(shí)現(xiàn)了鍵和值的分開存儲??紤]到lsm樹中數(shù)據(jù)是有序排列的,在本例中,采用了key和value分開存儲的方式,那么只需要保證key是有序的,value可以是無序的,只要按照key后面對應(yīng)的索引查找到對應(yīng)的value即可,即,在整個過程中key保證是有序的,value是否有序沒有影響。步驟103:確定所述lsm樹中是否有已經(jīng)存滿數(shù)據(jù)的層,如果有,則將該層所存的第一類文件和該層的下一層所存的第一類文件讀取至內(nèi)存中;lsm樹是存儲在存儲介質(zhì)(例如,硬盤)中的,在進(jìn)行由當(dāng)前層到下一層的存儲過程中,需要先將當(dāng)前層的數(shù)據(jù)和下一層的數(shù)據(jù),讀取至內(nèi)存中,然后在去重和重排序后存儲至下一層。如果是采用key和value不分離的方式,那么就需要將key和value都讀取至內(nèi)存中,然后,再將重排序后的key和value存儲至下一層,在本例中,通過key和value的分離存儲方式,使得可以僅讀取key文件,對key進(jìn)行重排序后,再將key文件寫入下一層,因?yàn)椴皇潜仨毶婕皏alue文件,因此,可以減少讀寫負(fù)擔(dān)和寫放大。對于lsm樹中的各層而言,如果上一層已經(jīng)存滿,那么就可以將數(shù)據(jù)存儲至下一層,即,如圖3所示,如果第0層存儲滿了,那么就可以將數(shù)據(jù)存儲至第1層,第1層存儲滿了之后,就可以將數(shù)據(jù)存儲至第2層,以此類推,實(shí)現(xiàn)lsm樹的建立。步驟104:對讀取至內(nèi)存中的第一類文件中的標(biāo)識進(jìn)行去重和重新排序,并將去重和重新排序后的第一類文件存入所述該層的下一層。具體地,在進(jìn)行層與層之間數(shù)據(jù)的存儲的時候,可以是將當(dāng)前層(即,已經(jīng)滿了的層)中的第一類文件(例如:key文件)讀取至內(nèi)存中,然后對key進(jìn)行重排序后,將重排序后的數(shù)據(jù)存儲至下一層。對于當(dāng)前層中的第二類文件(例如:value文件)可以直接放至下一層中,也可以仍舊存儲在當(dāng)前層中,具體采用哪種方式,本申請不作限定。這是考慮到,對于value而言,存儲在任意一層都是可以的,因此,為了使得上面的層不至于過快被存滿,那么可以將value都向下存一層也是可以的。為了使得對數(shù)據(jù)的移動最小,以便減少寫放大,可以減少對value數(shù)據(jù)的移動,只要可以遍歷或者查找到value文件就可以。舉例而言對去重進(jìn)行說明,假設(shè)有一個key文件,對應(yīng)的key為{1,2,5,9,10},另外一個key文件對應(yīng)的key為{2,10,11,12,15},那么對這兩個文件合并去重排序后得到的就是{1,2,5,9,10,11,12,15}。對于lsm樹而言,是分層存儲的,對于每一層而言,可以有多個文件,例如,文件內(nèi)是有序存儲的,文件之間也是有序的。例如,當(dāng)前需要將第1層有文件a、b、c和d的文件存至第2層中,當(dāng)前第2層有文件e和f,那么這個時候,可以將文件a、b、c、d、e和f都讀取至內(nèi)存中,然后進(jìn)行排序,并順序存入后再存入lsm樹的第2層。假設(shè)設(shè)置的是每個文件最大為32m,那么,滿32m后就作為一個文件存入第2層,然后再繼續(xù)下一個文件,滿了32m之后再作為一個文件存入第2層,即,當(dāng)新文件到達(dá)32m時候,存盤,然后開始新的一個文件,直至所有的數(shù)據(jù)都被存儲至第2層,當(dāng)然最后一個文件可以不滿32m?;谏鲜龇绞剿⒌膌sm樹,在去除臟數(shù)據(jù)(即,執(zhí)行compaction過程)的過程中,可以顯示出該lsm樹生成方式的優(yōu)勢。在實(shí)現(xiàn)的時候,可以根據(jù)實(shí)際的情況,或者是當(dāng)前的系統(tǒng)負(fù)荷,確定是采用第一類文件和第二類文件都進(jìn)行compaction過程,還是僅第一類文件執(zhí)行compaction過程。例如,如果當(dāng)前系統(tǒng)負(fù)荷比較大,那么可以僅對第一類文件執(zhí)行compaction過程,如果當(dāng)前系統(tǒng)處于空閑狀態(tài),那么可以對第一類文件和第二類文件都執(zhí)行compaction過程。在一個實(shí)施方式中,可以確定是否滿足去除所述lsm樹中的臟數(shù)據(jù)的條件;如果滿足,則確定當(dāng)前條件所對應(yīng)的去除方式;通過確定的去除方式,去除所述lsm中的臟數(shù)據(jù),具體地,可以采用但不限于以下三種方式之一去除臟數(shù)據(jù):方式1)讀取所述lsm樹中的多個第一類文件,根據(jù)數(shù)據(jù)標(biāo)識對所述多個第一類文件進(jìn)行去重和重排序操作,將去重和重排序后的數(shù)據(jù),寫入lsm樹中,第二類文件保持不變;方式2)讀取第一類文件和與所述第一類文件對應(yīng)的第二類文件,確定所述第一類文件中的每個索引是否能夠在第二類文件中匹配到對應(yīng)的記錄,如果不能,則從第一類文件中刪除該條記錄,以生成去重后的第一類文件,將去重后的第一類文件寫入所述lsm樹,第二類文件保持不變;方式3)讀取多個第一類文件和與各個第一類文件對應(yīng)的第二類文件,根據(jù)數(shù)據(jù)標(biāo)識對第一類文件進(jìn)行去重和重排序,生成去重后的第一類文件和第二類文件,將去重后的第一類文件和第二類文件寫入所述lsm樹?;谏鲜龇绞剿⒌膌sm樹,本申請實(shí)施例還提供了一種lsm樹的數(shù)據(jù)讀取方法,如圖4所示,可以包括以下步驟:步驟401:響應(yīng)于數(shù)據(jù)讀取請求,確定內(nèi)存中是否有所述數(shù)據(jù)讀取請求所請求的數(shù)據(jù);即,如果接收到一個數(shù)據(jù)讀取請求,考慮到內(nèi)存中的數(shù)據(jù)是查找最快的,那么可以先到內(nèi)存中查找,確定內(nèi)存中是否有請求的數(shù)據(jù)。這樣如果在內(nèi)存中查找到了,就不需要到lsm樹中進(jìn)行查找了。如果內(nèi)存中,沒有,則再到lsm樹中逐層進(jìn)行查找。步驟402:如果沒有,則從所述lsm樹的第0層開始,逐層將當(dāng)前層的第一類文件緩存至內(nèi)存中,并確定緩存至內(nèi)存中的第一類文件中是否存儲有所請求數(shù)據(jù)的索引,其中,所述第一類文件中存儲有數(shù)據(jù)的標(biāo)識和標(biāo)識對應(yīng)的數(shù)據(jù)的值在第二類文件中的索引;在對lsm樹進(jìn)行查找的時候,可以選擇從第0層開始,采用逐層查找的方式確定lsm樹中是否有所請求的數(shù)據(jù)??紤]到該lsm樹在建立的時候,是采用value與key分開的方式,因此,在查找的時候,可以逐次將key文件讀取至內(nèi)存中,以確定lsm樹中各層是否有請求的數(shù)據(jù),如果通過key文件確定出有要請求的數(shù)據(jù),那么直接通過key中該數(shù)據(jù)所對應(yīng)的索引到lsm中讀取該數(shù)據(jù)對應(yīng)的value文件,從而實(shí)現(xiàn)對該數(shù)據(jù)的讀取。在確定是否存在要請求的數(shù)據(jù),以及確定請求的數(shù)據(jù)所在的位置的時候,是不需要讀取value的,。即,在查找的過程中,只需要將key文件讀取至內(nèi)存中進(jìn)行查找,而不需要同時將key和value都讀取到內(nèi)存中,大大減少了系統(tǒng)的讀負(fù)擔(dān)。例如,當(dāng)前需要查找第0層,那么可以將第0層中的第一類文件從第0層讀取出來,然后根據(jù)第一類文件中的數(shù)據(jù)標(biāo)識確定是否有所請求的數(shù)據(jù),如果在第一類文件中有所請求數(shù)據(jù)的數(shù)據(jù)標(biāo)識,那么就表明有請求的數(shù)據(jù),如果沒有發(fā)現(xiàn)所請求數(shù)據(jù)的數(shù)據(jù)標(biāo)識,那么就可以將第1層中的第一類文件讀取至內(nèi)存中,并判斷是否有所請求數(shù)據(jù)的數(shù)據(jù)標(biāo)識。在一個實(shí)施方式中,第一類文件中的數(shù)據(jù)標(biāo)識是順序存儲的,即,key是按照順序存儲的,那么在判斷第一類文件中是否有所請求數(shù)據(jù)的時候,就可以根據(jù)通過二分法確定緩存至內(nèi)存中的第一類文件中是否有所述數(shù)據(jù)讀取請求所請求的數(shù)據(jù)。之所以采用二分法,就是因?yàn)閗ey是順序存儲,通過這種方式進(jìn)行查找,查找速度比較快,可以有效提高數(shù)據(jù)查找和讀取的效率。步驟403:在確定緩存至內(nèi)存中的第一類文件中存儲有所請求數(shù)據(jù)的索引的情況下,根據(jù)索引,將存儲有所請求的數(shù)據(jù)的第二類文件緩存至所述內(nèi)存中,并從緩存至所述內(nèi)存中的第二類文件中讀取所述數(shù)據(jù)讀取請求所請求的數(shù)據(jù)。對于lsm樹而言,有多個第二類文件,為了標(biāo)識key所對應(yīng)數(shù)據(jù)的數(shù)據(jù)取值在第二類文件中的具體存儲位置,第一類文件中在存儲數(shù)據(jù)標(biāo)識的同時,還存儲索引,索引可以包括:數(shù)據(jù)標(biāo)識所標(biāo)識的數(shù)據(jù)所在的第二類文件的文件編號以及在該第二類文件中的偏移量。在一個實(shí)施方式中,根據(jù)索引,將存儲有所請求的數(shù)據(jù)的第二類文件緩存至所述內(nèi)存中,可以包括:根據(jù)從第一類文件中查找出的數(shù)據(jù)所在的第二類文件的文件編號,將該文件編號所對應(yīng)的第二類文件緩存至所述內(nèi)存中;根據(jù)從第一類文件中查找出的偏移量,從緩存至所述內(nèi)存中的第二類文件中,讀取所述數(shù)據(jù)請求所請求的數(shù)據(jù)。即,因?yàn)榈诙愇募卸鄠€,為了定位第二類文件中數(shù)據(jù)的值的具體存儲位置,以便于查找,可以為每個第二類文件都設(shè)置一個編號,將第二類文件的編號作為數(shù)據(jù)索引的一部分,這樣在查找的時候,在通過第一類文件查找到所請求的數(shù)據(jù)之后,可以匹配到存儲該數(shù)據(jù)的值的第二類文件的文件編號,從而定位到存儲有所請求數(shù)據(jù)的第二類文件??梢詫⒃摰诙愇募x取到內(nèi)存中,然后通過所請求數(shù)據(jù)在該第二類文件中的偏移量,便可以實(shí)現(xiàn)對數(shù)據(jù)的最終定位,從而實(shí)現(xiàn)數(shù)據(jù)的查找和讀取。在從lsm中讀取第一類文件至內(nèi)存中的時候,可以是一個文件、一個文件讀取并判斷的,例如,當(dāng)前l(fā)sm樹中共有a、b、c、d四個第一類文件,那么可以先讀取文件a至內(nèi)存中,判斷a中是否有所請求數(shù)據(jù)的數(shù)據(jù)標(biāo)識,如果沒有,則再讀取文件b至內(nèi)存中,即,逐個文件判斷是否有所請求數(shù)據(jù)的數(shù)據(jù)標(biāo)識。通過劃分文件的方式,可以避免將大文件讀入內(nèi)存,可以減少系統(tǒng)的負(fù)荷。下面結(jié)合一個具體實(shí)施例對上述lsm樹的建立和數(shù)據(jù)讀取方法進(jìn)行說明,然而,值得注意的是,該具體實(shí)施例僅是為了更好地說明本申請,并不構(gòu)成對本申請的不當(dāng)限定??紤]到現(xiàn)有的lsm樹的compaction過程容易造成較為明顯的寫放大,占用有限的磁盤帶寬,以及對系統(tǒng)性能造成較為明顯影響,增加了系統(tǒng)的延遲的問題,在本例中,提出了一種上述lsm樹的建立和數(shù)據(jù)讀取方法,以達(dá)到減少系統(tǒng)整體的寫放大,且在compaction過程中,可以占用較少的系統(tǒng)資源。考慮到現(xiàn)有的compaction過程需要從磁盤中讀出kv(鍵值),重排序后寫入文件。在compaction完成后,輸出的文件中key是有序的。其實(shí)整個過程中,只要保證key有序,value是否有序是不重要的。在本例中,將key和value分開存儲,可以有選擇的分別對key、value,或者2者同時進(jìn)行compaction。在讀寫壓力較高的情況下,可以只對key進(jìn)行compaction。在建立lsm樹的時候,可以是確定內(nèi)存中memtable是否已經(jīng)裝滿,如果已經(jīng)裝滿,則形成兩種文件:kbt(keyblock-basedtable)和vpt(valueplaintable),這兩種文件是成對出現(xiàn)的。其中,kbt中只存儲key,以及該key對應(yīng)value在vpt中的索引。索引內(nèi)容可以是vpt文件編號,以及value所在文件內(nèi)部offset。vpt中只存儲value。以sst文件格式為例說明kbt文件和vpt文件的格式:kbt文件格式定義kbt格式完全按照現(xiàn)在leveldb/rocksdb中默認(rèn)的sst文件格式。kbt:={footer,index-block,{kv-block-1,kv-block-2,…,}}footer:={magic,padding,index-block-handle}index-block:={<key,kv-block-handle>,<key,kv-block-handle>,…,}kv-block:={{key,offset},{key,offset},…{<key,value>,<key,value>,…,}index-block-handle:=kv-block-handle:={offset,size}vpt文件格式定義:vpt:={footer,{item1,item2,…,}}item:={size,content}footer:={magic,padding,itemcount}基于建立的lsm樹的,可以分情況采用不同的方式進(jìn)行compaction:1)key-compaction(僅針對key清除臟數(shù)據(jù))將若干個kbt文件,讀入內(nèi)存,進(jìn)行重排序,并去除臟數(shù)據(jù),形成新的kbt文件,其中,文件中每個條目的value值不變,原封不動寫入新文件。2)value-compaction(基于value清除key中的臟數(shù)據(jù))vpt中可能包含很多無效的value,需要通過compaction去除掉。具體方法可以是:讀取vpt文件,以及對應(yīng)的kbt文件。如果value中的每一個條目文件編號和offset不在對應(yīng)的kbt文件中有記錄,那么新生產(chǎn)的文件中去除掉該條目,并且重新生成對應(yīng)的kbt文件;3)all-compaction(同時清除key和value中的臟數(shù)據(jù))讀取若干個kbt文件,以及對應(yīng)的vpt文件。按照key排序,去除掉臟數(shù)據(jù),形成新的文件kbt和vpt文件。由此可見,通過本例所提出的lsm樹,在進(jìn)行compaction的時候,采用key-compaction的方式可以快速去除臟數(shù)據(jù),并且極大地減少了寫放大,因?yàn)樵赾ompaction過程中無需重新寫value數(shù)據(jù),而value數(shù)據(jù)通常遠(yuǎn)遠(yuǎn)大于key的數(shù)據(jù)。value-compaction可以有效減少磁盤的空間。在系統(tǒng)空閑或者是系統(tǒng)負(fù)荷比較小的時候,可以采用all-compaction方式。假設(shè)寫入的數(shù)據(jù)總量為d,key占全量數(shù)據(jù)中的比例為p,lsm共有n層,通過現(xiàn)有的compaction,總量為d的數(shù)據(jù)寫放大系數(shù)為n-1,磁盤寫入總量為:d(n-1),然而,采用本例的方案,compaction操作的磁盤寫入量為:dp(n-1)+d(1-p)。二者比值為:v=(dp(n-1)+d(1-p))/(d(n-1))當(dāng)n=7,p=0.2時,v=1/3;當(dāng)n=7,p=0.1時,v=1/4;當(dāng)n=7,p=0.5時,v=0.58。由此可見,按通常情況kv長度中,key的長度占總長度的20%的時,相同量數(shù)據(jù)寫入磁盤總量為現(xiàn)有的compaction方式的1/3,即使key長度為50%時,相同量數(shù)據(jù)寫入磁盤總量為現(xiàn)有的compaction方式的60%不到?;谏鲜鼋⒌膌sm樹,進(jìn)行讀請求處理,可以包括以下步驟:s1:先在內(nèi)存中讀取,如果命中,則將讀取結(jié)果返回給用戶;s2:如果s1中未命中,則讀取l0層文件,如果命中,則將讀取結(jié)果返回給用戶;s3:如果s2未命中,則讀取l1層文件,如果命中,則返回讀取結(jié)果給用戶;s4:直到讀取到最后一層ln,如果命中,則返回讀取結(jié)果給用戶,否則,數(shù)據(jù)不存在。在讀取某一層文件的時候,可以先讀取kbt文件,然后再讀取vpt文件。一般kbt文件較少,可以將其緩存在內(nèi)存中,從而加速讀操作。本申請實(shí)施例還提供了一種服務(wù)器,如圖5所示,可以包括:存儲器、處理器及存儲在存儲上并可在處理器上運(yùn)行的計(jì)算機(jī)程序,處理器執(zhí)行所述程序時可以實(shí)現(xiàn)以下步驟:s1:響應(yīng)于數(shù)據(jù)讀取請求,確定內(nèi)存中是否有所述數(shù)據(jù)讀取請求所請求的數(shù)據(jù);s2:如果沒有,則從所述lsm樹的第0層開始,逐層將當(dāng)前層的第一類文件緩存至內(nèi)存中,并確定緩存至內(nèi)存中的第一類文件中是否存儲有所請求數(shù)據(jù)的索引,其中,所述第一類文件中存儲有數(shù)據(jù)的標(biāo)識和標(biāo)識對應(yīng)的數(shù)據(jù)的值在第二類文件中的索引;s3:如果有,則根據(jù)索引,將存儲有所請求的數(shù)據(jù)的第二類文件緩存至所述內(nèi)存中,并從緩存至所述內(nèi)存中的第二類文件中讀取所述數(shù)據(jù)讀取請求所請求的數(shù)據(jù)。在一個實(shí)施方式中,lsm樹中有多個第二類文件,相應(yīng)的,所述索引可以包括:數(shù)據(jù)標(biāo)識所標(biāo)識的數(shù)據(jù)所在的第二類文件的文件編號以及在該第二類文件中的偏移量。在一個實(shí)施方式中,所述處理器根據(jù)索引,將存儲有所請求的數(shù)據(jù)的第二類文件緩存至所述內(nèi)存中,可以包括:根據(jù)從第一類文件中查找出的數(shù)據(jù)所在的第二類文件的文件編號,將該文件編號所對應(yīng)的第二類文件緩存至所述內(nèi)存中;根據(jù)從第一類文件中查找出的偏移量,從緩存至所述內(nèi)存中的第二類文件中,讀取所述數(shù)據(jù)請求所請求的數(shù)據(jù)。在一個實(shí)施方式中,第一類文件中的數(shù)據(jù)標(biāo)識可以是順序存儲的,根據(jù)緩存至內(nèi)存中的第一類文件確定當(dāng)前層是否存儲有所述數(shù)據(jù)讀取請求所請求的數(shù)據(jù),可以包括:通過二分法確定緩存至內(nèi)存中的第一類文件中是否有所述數(shù)據(jù)讀取請求所請求的數(shù)據(jù)。本申請實(shí)施例還提供了一種服務(wù)器,可以包括存儲器、處理器及存儲在存儲上并可在處理器上運(yùn)行的計(jì)算機(jī)程序,處理器執(zhí)行所述程序時可以實(shí)現(xiàn)以下步驟:s1:確定內(nèi)存中是否已寫滿預(yù)定數(shù)量的數(shù)據(jù);s2:如果已經(jīng)寫滿,則將所述內(nèi)存中的數(shù)據(jù),轉(zhuǎn)換為第一類文件和第二類文件,并將所述第二類文件存入lsm樹中,將所述第一類文件存入所述lsm樹的第0層,其中,所述第一類文件中存儲有數(shù)據(jù)的標(biāo)識和標(biāo)識對應(yīng)的數(shù)據(jù)的值在第二類文件中的索引,所述第二類文件中存儲有數(shù)據(jù)的值;s3:確定所述lsm樹中是否有已經(jīng)存滿數(shù)據(jù)的層,如果有,則將該層所存的第一類文件和該層的下一層所存的第一類文件讀取至內(nèi)存中;s4:對讀取至內(nèi)存中的第一類文件中的標(biāo)識進(jìn)行去重和重新排序,并將去重和重新排序后的第一類文件存入所述該層的下一層。在一個實(shí)施方式中,還可以包括:確定是否滿足去除所述lsm樹中的臟數(shù)據(jù)的條件;如果滿足,則確定當(dāng)前條件所對應(yīng)的去除方式;通過確定的去除方式,去除所述lsm中的臟數(shù)據(jù)。在一個實(shí)施方式中,有多個第二類文件,相應(yīng)的,所述索引可以包括但不限于:數(shù)據(jù)的標(biāo)識所標(biāo)識的數(shù)據(jù)所在的第二類文件的文件編號以及在該第二類文件中的偏移量。在一個實(shí)施方式中,去除方式可以包括但不限于以下至少之一:1)讀取所述lsm樹中的多個第一類文件,根據(jù)數(shù)據(jù)標(biāo)識對所述多個第一類文件進(jìn)行去重和重排序操作,將去重和重排序后的數(shù)據(jù),寫入lsm樹中,第二類文件保持不變;2)讀取第一類文件和與所述第一類文件對應(yīng)的第二類文件,確定所述第一類文件中的每個索引是否能夠在第二類文件中匹配到對應(yīng)的記錄,如果不能,則從第一類文件中刪除該條記錄,以生成去重后的第一類文件,將去重后的第一類文件寫入所述lsm樹,第二類文件保持不變;3)讀取多個第一類文件和與各個第一類文件對應(yīng)的第二類文件,根據(jù)數(shù)據(jù)標(biāo)識對第一類文件進(jìn)行去重和重排序,生成去重后的第一類文件和第二類文件,將去重后的第一類文件和第二類文件寫入所述lsm樹。本申請實(shí)施例將數(shù)據(jù)標(biāo)識和標(biāo)識對應(yīng)的數(shù)據(jù)值分開在不同文件中存儲,使得在進(jìn)行數(shù)據(jù)查找的時候,可以僅讀取lsm中的標(biāo)識文件進(jìn)行查找操作,不需要一并讀取存儲數(shù)據(jù)值的文件,相對于未設(shè)置標(biāo)識索引文件的方式,可以減少數(shù)據(jù)讀取量,在進(jìn)行臟數(shù)據(jù)刪除的時候,也可以僅讀取標(biāo)識文件,對標(biāo)識文件進(jìn)行重排序以去除臟數(shù)據(jù),然后,再將重排序后的數(shù)據(jù)寫入,因?yàn)檫@個過程中,可以不讀取和寫入存儲數(shù)據(jù)值的文件,因此,可以減少寫放大,從而可以達(dá)到有效減少系統(tǒng)的讀寫負(fù)擔(dān)的技術(shù)效果。在20世紀(jì)90年代,對于一個技術(shù)的改進(jìn)可以很明顯地區(qū)分是硬件上的改進(jìn)(例如,對二極管、晶體管、開關(guān)等電路結(jié)構(gòu)的改進(jìn))還是軟件上的改進(jìn)(對于方法流程的改進(jìn))。然而,隨著技術(shù)的發(fā)展,當(dāng)今的很多方法流程的改進(jìn)已經(jīng)可以視為硬件電路結(jié)構(gòu)的直接改進(jìn)。設(shè)計(jì)人員幾乎都通過將改進(jìn)的方法流程編程到硬件電路中來得到相應(yīng)的硬件電路結(jié)構(gòu)。因此,不能說一個方法流程的改進(jìn)就不能用硬件實(shí)體模塊來實(shí)現(xiàn)。例如,可編程邏輯器件(programmablelogicdevice,pld)(例如現(xiàn)場可編程門陣列(fieldprogrammablegatearray,fpga))就是這樣一種集成電路,其邏輯功能由用戶對器件編程來確定。由設(shè)計(jì)人員自行編程來把一個數(shù)字系統(tǒng)“集成”在一片pld上,而不需要請芯片制造廠商來設(shè)計(jì)和制作專用的集成電路芯片。而且,如今,取代手工地制作集成電路芯片,這種編程也多半改用“邏輯編譯器(logiccompiler)”軟件來實(shí)現(xiàn),它與程序開發(fā)撰寫時所用的軟件編譯器相類似,而要編譯之前的原始代碼也得用特定的編程語言來撰寫,此稱之為硬件描述語言(hardwaredescriptionlanguage,hdl),而hdl也并非僅有一種,而是有許多種,如abel(advancedbooleanexpressionlanguage)、ahdl(alterahardwaredescriptionlanguage)、confluence、cupl(cornelluniversityprogramminglanguage)、hdcal、jhdl(javahardwaredescriptionlanguage)、lava、lola、myhdl、palasm、rhdl(rubyhardwaredescriptionlanguage)等,目前最普遍使用的是vhdl(very-high-speedintegratedcircuithardwaredescriptionlanguage)與verilog。本領(lǐng)域技術(shù)人員也應(yīng)該清楚,只需要將方法流程用上述幾種硬件描述語言稍作邏輯編程并編程到集成電路中,就可以很容易得到實(shí)現(xiàn)該邏輯方法流程的硬件電路。控制器可以按任何適當(dāng)?shù)姆绞綄?shí)現(xiàn),例如,控制器可以采取例如微處理器或處理器以及存儲可由該(微)處理器執(zhí)行的計(jì)算機(jī)可讀程序代碼(例如軟件或固件)的計(jì)算機(jī)可讀介質(zhì)、邏輯門、開關(guān)、專用集成電路(applicationspecificintegratedcircuit,asic)、可編程邏輯控制器和嵌入微控制器的形式,控制器的例子包括但不限于以下微控制器:arc625d、atmelat91sam、microchippic18f26k20以及siliconelabsc8051f320,存儲器控制器還可以被實(shí)現(xiàn)為存儲器的控制邏輯的一部分。本領(lǐng)域技術(shù)人員也知道,除了以純計(jì)算機(jī)可讀程序代碼方式實(shí)現(xiàn)控制器以外,完全可以通過將方法步驟進(jìn)行邏輯編程來使得控制器以邏輯門、開關(guān)、專用集成電路、可編程邏輯控制器和嵌入微控制器等的形式來實(shí)現(xiàn)相同功能。因此這種控制器可以被認(rèn)為是一種硬件部件,而對其內(nèi)包括的用于實(shí)現(xiàn)各種功能的裝置也可以視為硬件部件內(nèi)的結(jié)構(gòu)?;蛘呱踔?,可以將用于實(shí)現(xiàn)各種功能的裝置視為既可以是實(shí)現(xiàn)方法的軟件模塊又可以是硬件部件內(nèi)的結(jié)構(gòu)。上述實(shí)施例闡明的系統(tǒng)、裝置、模塊或單元,具體可以由計(jì)算機(jī)芯片或?qū)嶓w實(shí)現(xiàn),或者由具有某種功能的產(chǎn)品來實(shí)現(xiàn)。一種典型的實(shí)現(xiàn)設(shè)備為計(jì)算機(jī)。具體的,計(jì)算機(jī)例如可以為個人計(jì)算機(jī)、膝上型計(jì)算機(jī)、蜂窩電話、相機(jī)電話、智能電話、個人數(shù)字助理、媒體播放器、導(dǎo)航設(shè)備、電子郵件設(shè)備、游戲控制臺、平板計(jì)算機(jī)、可穿戴設(shè)備或者這些設(shè)備中的任何設(shè)備的組合。為了描述的方便,描述以上裝置時以功能分為各種單元分別描述。當(dāng)然,在實(shí)施本申請時可以把各單元的功能在同一個或多個軟件和/或硬件中實(shí)現(xiàn)。本領(lǐng)域內(nèi)的技術(shù)人員應(yīng)明白,本發(fā)明的實(shí)施例可提供為方法、系統(tǒng)、或計(jì)算機(jī)程序產(chǎn)品。因此,本發(fā)明可采用完全硬件實(shí)施例、完全軟件實(shí)施例、或結(jié)合軟件和硬件方面的實(shí)施例的形式。而且,本發(fā)明可采用在一個或多個其中包含有計(jì)算機(jī)可用程序代碼的計(jì)算機(jī)可用存儲介質(zhì)(包括但不限于磁盤存儲器、cd-rom、光學(xué)存儲器等)上實(shí)施的計(jì)算機(jī)程序產(chǎn)品的形式。本發(fā)明是參照根據(jù)本發(fā)明實(shí)施例的方法、設(shè)備(系統(tǒng))、和計(jì)算機(jī)程序產(chǎn)品的流程圖和/或方框圖來描述的。應(yīng)理解可由計(jì)算機(jī)程序指令實(shí)現(xiàn)流程圖和/或方框圖中的每一流程和/或方框、以及流程圖和/或方框圖中的流程和/或方框的結(jié)合??商峁┻@些計(jì)算機(jī)程序指令到通用計(jì)算機(jī)、專用計(jì)算機(jī)、嵌入式處理機(jī)或其他可編程數(shù)據(jù)處理設(shè)備的處理器以產(chǎn)生一個機(jī)器,使得通過計(jì)算機(jī)或其他可編程數(shù)據(jù)處理設(shè)備的處理器執(zhí)行的指令產(chǎn)生用于實(shí)現(xiàn)在流程圖一個流程或多個流程和/或方框圖一個方框或多個方框中指定的功能的裝置。這些計(jì)算機(jī)程序指令也可存儲在能引導(dǎo)計(jì)算機(jī)或其他可編程數(shù)據(jù)處理設(shè)備以特定方式工作的計(jì)算機(jī)可讀存儲器中,使得存儲在該計(jì)算機(jī)可讀存儲器中的指令產(chǎn)生包括指令裝置的制造品,該指令裝置實(shí)現(xiàn)在流程圖一個流程或多個流程和/或方框圖一個方框或多個方框中指定的功能。這些計(jì)算機(jī)程序指令也可裝載到計(jì)算機(jī)或其他可編程數(shù)據(jù)處理設(shè)備上,使得在計(jì)算機(jī)或其他可編程設(shè)備上執(zhí)行一系列操作步驟以產(chǎn)生計(jì)算機(jī)實(shí)現(xiàn)的處理,從而在計(jì)算機(jī)或其他可編程設(shè)備上執(zhí)行的指令提供用于實(shí)現(xiàn)在流程圖一個流程或多個流程和/或方框圖一個方框或多個方框中指定的功能的步驟。在一個典型的配置中,計(jì)算設(shè)備包括一個或多個處理器(cpu)、輸入/輸出接口、網(wǎng)絡(luò)接口和內(nèi)存。內(nèi)存可能包括計(jì)算機(jī)可讀介質(zhì)中的非永久性存儲器,隨機(jī)存取存儲器(ram)和/或非易失性內(nèi)存等形式,如只讀存儲器(rom)或閃存(flashram)。內(nèi)存是計(jì)算機(jī)可讀介質(zhì)的示例。計(jì)算機(jī)可讀介質(zhì)包括永久性和非永久性、可移動和非可移動媒體可以由任何方法或技術(shù)來實(shí)現(xiàn)信息存儲。信息可以是計(jì)算機(jī)可讀指令、數(shù)據(jù)結(jié)構(gòu)、程序的模塊或其他數(shù)據(jù)。計(jì)算機(jī)的存儲介質(zhì)的例子包括,但不限于相變內(nèi)存(pram)、靜態(tài)隨機(jī)存取存儲器(sram)、動態(tài)隨機(jī)存取存儲器(dram)、其他類型的隨機(jī)存取存儲器(ram)、只讀存儲器(rom)、電可擦除可編程只讀存儲器(eeprom)、快閃記憶體或其他內(nèi)存技術(shù)、只讀光盤只讀存儲器(cd-rom)、數(shù)字多功能光盤(dvd)或其他光學(xué)存儲、磁盒式磁帶,磁帶磁磁盤存儲或其他磁性存儲設(shè)備或任何其他非傳輸介質(zhì),可用于存儲可以被計(jì)算設(shè)備訪問的信息。按照本文中的界定,計(jì)算機(jī)可讀介質(zhì)不包括暫存電腦可讀媒體(transitorymedia),如調(diào)制的數(shù)據(jù)信號和載波。還需要說明的是,術(shù)語“包括”、“包含”或者其任何其他變體意在涵蓋非排他性的包含,從而使得包括一系列要素的過程、方法、商品或者設(shè)備不僅包括那些要素,而且還包括沒有明確列出的其他要素,或者是還包括為這種過程、方法、商品或者設(shè)備所固有的要素。在沒有更多限制的情況下,由語句“包括一個……”限定的要素,并不排除在包括所述要素的過程、方法、商品或者設(shè)備中還存在另外的相同要素。本領(lǐng)域技術(shù)人員應(yīng)明白,本申請的實(shí)施例可提供為方法、系統(tǒng)或計(jì)算機(jī)程序產(chǎn)品。因此,本申請可采用完全硬件實(shí)施例、完全軟件實(shí)施例或結(jié)合軟件和硬件方面的實(shí)施例的形式。而且,本申請可采用在一個或多個其中包含有計(jì)算機(jī)可用程序代碼的計(jì)算機(jī)可用存儲介質(zhì)(包括但不限于磁盤存儲器、cd-rom、光學(xué)存儲器等)上實(shí)施的計(jì)算機(jī)程序產(chǎn)品的形式。本申請可以在由計(jì)算機(jī)執(zhí)行的計(jì)算機(jī)可執(zhí)行指令的一般上下文中描述,例如程序模塊。一般地,程序模塊包括執(zhí)行特定任務(wù)或?qū)崿F(xiàn)特定抽象數(shù)據(jù)類型的例程、程序、對象、組件、數(shù)據(jù)結(jié)構(gòu)等等。也可以在分布式計(jì)算環(huán)境中實(shí)踐本申請,在這些分布式計(jì)算環(huán)境中,由通過通信網(wǎng)絡(luò)而被連接的遠(yuǎn)程處理設(shè)備來執(zhí)行任務(wù)。在分布式計(jì)算環(huán)境中,程序模塊可以位于包括存儲設(shè)備在內(nèi)的本地和遠(yuǎn)程計(jì)算機(jī)存儲介質(zhì)中。本說明書中的各個實(shí)施例均采用遞進(jìn)的方式描述,各個實(shí)施例之間相同相似的部分互相參見即可,每個實(shí)施例重點(diǎn)說明的都是與其他實(shí)施例的不同之處。尤其,對于系統(tǒng)實(shí)施例而言,由于其基本相似于方法實(shí)施例,所以描述的比較簡單,相關(guān)之處參見方法實(shí)施例的部分說明即可。以上所述僅為本申請的實(shí)施例而已,并不用于限制本申請。對于本領(lǐng)域技術(shù)人員來說,本申請可以有各種更改和變化。凡在本申請的精神和原理之內(nèi)所作的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本申請的權(quán)利要求范圍之內(nèi)。當(dāng)前第1頁12當(dāng)前第1頁12