两个人的电影免费视频_国产精品久久久久久久久成人_97视频在线观看播放_久久这里只有精品777_亚洲熟女少妇二三区_4438x8成人网亚洲av_内谢国产内射夫妻免费视频_人妻精品久久久久中国字幕

一種key與value分開存儲的key-value存儲系統(tǒng)設計方法

文檔序號:6516236閱讀:176來源:國知局
一種key與value分開存儲的key-value存儲系統(tǒng)設計方法【專利摘要】本發(fā)明為一種key與value分開存儲的key-value存儲系統(tǒng)設計方法,涉及存儲系統(tǒng)和程序設計【
技術領域
】。本發(fā)明構造了value在文件的寫入和讀取函數(shù),將value在單獨的文件中按照寫入順序存儲,將value在文件中的偏移和value的長度組合成一個64位的信息字段,對信息字段進行base64編碼,將key和經過base64編碼的信息字段作為鍵值對,寫入現(xiàn)有key-value存儲系統(tǒng)。在value讀取時采用內存映射的方式。本發(fā)明方法對現(xiàn)有技術僅做了少量改動,使得在讀取順序與寫入順序接近時,可以大幅度提升key-value存儲系統(tǒng)的讀取性能?!緦@f明】—種key與value分開存儲的key-value存儲系統(tǒng)設計方【
技術領域
】[0001]本發(fā)明涉及存儲系統(tǒng)和程序設計【
技術領域
】,具體涉及鍵(key)-值(value)存儲系統(tǒng)的設計方法?!?br>背景技術
】[0002]key-value存儲系統(tǒng)如Leveldb,Hbase,Cassandra的底層結構都是以bigtable為基礎,其存儲結構類似于圖1所示。這些存儲系統(tǒng)會將key和value作為一個整體,即一條記錄(record)存入系統(tǒng)。在寫入過程中,會對記錄以key值順序進行排序,這樣就打亂了記錄的寫入順序,在磁盤上呈現(xiàn)隨機分布的現(xiàn)象。當record的讀取順序與寫入順序接近時,就會帶來大量的讀磁盤開銷,從而影響讀性能?!?br/>發(fā)明內容】[0003]本發(fā)明為了提升某些情況下現(xiàn)在的key-value存儲系統(tǒng)的讀性能,提供了一種key與value分開存儲的key-value存儲系統(tǒng)設計方法,通過對以bigtable為基礎的現(xiàn)有key-value存儲系統(tǒng)做少量改動,使這些存儲系統(tǒng)在讀取順序與寫入順序接近時的讀性能顯著提高。[0004]本發(fā)明的一種key與value分開存儲的key-value存儲系統(tǒng)設計方法,包括如下步驟:[0005]第一步,構造value在文件的寫入和讀取函數(shù),將value在單獨的文件中存儲。[0006]步驟1.1,構造value的寫入函數(shù),寫入函數(shù)的輸入參數(shù)包括value的內容和長度,返回值為value在文件中的偏移;每次在文件結尾處寫入value值,并設置一個變量來保存文件結尾的偏移量。[0007]步驟1.2,構造value的讀取函數(shù),讀取函數(shù)的輸入參數(shù)包括value在文件中的偏移和長度,返回值是字符串形式的value值;value的讀取使用內存映射。[0008]第二步,實現(xiàn)鍵值對(key-value)的寫入和讀取。[0009]步驟2.1,鍵值對的寫入,具體是:對一個key-value,首先將value按照步驟1.1寫入文件,并獲得value在文件中的偏移,然后,將value在文件中的偏移和value的長度組合成一個64位的信息字段,并對信息字段進行base64編碼,最后,將key和經過base64編碼的信息字段作為一個鍵值對,寫入現(xiàn)有key-value存儲系統(tǒng)。[0010]步驟2.2,鍵值對的讀取,具體是:首先,根據(jù)key值,從現(xiàn)有key-value存儲系統(tǒng)中讀取對應的信息字段;然后,對讀取的信息字段進行base64解碼,從中獲取對應value在文件中的偏移和長度;最后,將獲得的偏移和長度作為參數(shù),調用步驟1.2中value的讀取函數(shù),得到真正的value值。[0011]步驟1.2所述的value的讀取使用內存映射,所使用總的映射空間最多為100MB。[0012]步驟1.2所述的value的讀取函數(shù),所實現(xiàn)的操作為:[0013]首先,對輸入的value在文件中的偏移addr進行4kB的對齊操作,獲得偏移f_offset;[0014]然后,在總的映射空間中查找f_offset,若查找到,獲取對應的內存映射的起始地址mmap_start,否則,將文件中讀取從偏移f_offset開始的大小為K的內容,映射到內存中,并獲取對應的內容映射的起始地址_ap_start,K為每次內存映射的大小;[0015]最后,判斷所需的value內容是否全部在mmap_start開始的大小為K的內存中,若在,直接讀取內存mmap_start+addr_f_offset開始的長度為length個字節(jié)的內容,否則,先從內存mmap_start+addr-f_offset開始讀取f_offset+K_addr個字節(jié)的內容,再對f_offset+f_offset+K開始處的文件進行映射,讀取所需value剩下的內容;length為value的長度。[0016]本發(fā)明的key-value存儲系統(tǒng)設計方法的優(yōu)點和積極效果在于:本發(fā)明適用于value的長度在200B以上的數(shù)據(jù)存儲,在一次讀取時,需要額外多進行一次讀磁盤操作,但從整體上看,對于局部性較好的數(shù)據(jù),讀磁盤的次數(shù)實際上是減少了;當數(shù)據(jù)的讀取順序與寫入順序接近時,可以大幅度提升key-value存儲系統(tǒng)的讀取性能;同時,實現(xiàn)本發(fā)明方法所需要的代碼修改簡單,方便移植于其他key-value存儲系統(tǒng)上。【專利附圖】【附圖說明】[0017]圖1是bigtable存儲示意圖;[0018]圖2是本發(fā)明的key-value存儲系統(tǒng)設計方法的流程示意圖;[0019]圖3中,(a)是使用A系統(tǒng)記錄在磁盤上的邏輯結構,(b)是適用本發(fā)明方法后,記錄在磁盤上的邏輯結構?!揪唧w實施方式】[0020]下面將結合附圖和實施例對本發(fā)明的技術方案進行詳細說明。[0021]為方便說明,使用A系統(tǒng)代表Leveldb,Hbase,Cassandra這一類key-value存儲系統(tǒng)。本發(fā)明通過將key和value分開存儲,value存儲在單獨的文件中,原有的A系統(tǒng)中存儲key值與value的偏移和長度信息,使得value保持寫入順序。這樣,當讀取的序列與寫入順序一致時,讀取的速度有較大的提升。本發(fā)明的前提是value的長度在200B以上。[0022]結合圖2,自底向上介紹本發(fā)明的key-value存儲系統(tǒng)設計方法。[0023]第一步,實現(xiàn)value的文件寫入和讀取函數(shù)。[0024]步驟1.1,實現(xiàn)value的寫入。value的寫入相對簡單,只是單純向文件結尾寫入value值。系統(tǒng)要同時處理讀寫請求,所以文件指針會不停變動,因此需要一個變量來保存文件結尾的偏移量。[0025]本發(fā)明實施例中所構造的value的寫入函數(shù)myPut如下:[0026]intmyPut(constchar*value,constuint32_t&length,uint64_t&addr),[0027]該函數(shù)中,value和length為需要輸入的參數(shù),value表示所存儲的value的內容,length表示value的長度,addr表示value在文件中的偏移。[0028]在value的寫入函數(shù)的實現(xiàn)中,首先獲取鎖,保證寫文件時不會進行讀取操作。然后使用函數(shù)Pwrite(fd,value,length,offset)向文件寫入value,參數(shù)fd和offset為類的屬性,fd用來記載所要寫入的文件名稱。接著釋放鎖,根據(jù)函數(shù)pwrite的返回值判斷是否正確寫入,如果寫入錯誤,返回-1;否則,寫入正確,將offset賦值給addr,offset本身加上length,返回O。變量offset記錄了本次寫入操作后文件結尾的位置,用以指明下次寫入的起始地址。[0029]步驟1.2,實現(xiàn)value的讀取。value的讀取使用內存映射,稱所使用的總的映射空間為字典,本發(fā)明實施例中字典的大小最多設置為100MB。在默認每次映射2MB的文件內容的情況下,最多可緩存50塊文件內容,這50塊文件內容可采用近期最少使用算法(LeastRecentlyUsed,簡稱LRU)進行調度,也就是字典中有50項,每項為2MB的映射空間。字典中的每項的映射空間大小可根據(jù)用戶需求進行調整,例如設置為4kB。本發(fā)明實施例中每項的大小為2MB。[0030]本發(fā)明實施例中所構造的value的讀取函數(shù)myGet如下:[0031]intmyGet(char*value,constuint32_t&length,constuint64_t&addr)[0032]該函數(shù)中,length和addr為需要輸入的參數(shù),value為返回值,字符含義和步驟1.1中寫入函數(shù)myPut中的含義相同。[0033]在value的讀取函數(shù)的實現(xiàn)中,首先對輸入參數(shù)addr利用宏ROUND進行4kB的對齊操作,獲得其4kB對齊的偏移f_offset,如果f_offset在字典中,則獲取其內存映射的起始地址mmap_start;否則,調用mmap函數(shù),從文件fd中讀取f_offset開始的2M內容映射到內存中,并獲取mmap_start。檢查字典是否已滿(50個項),如果滿了,則利用LRU算法淘汰一項,將f_ofTset和_ap_start插入到字典中,如果沒有滿則直接插入。然后要判斷所需的value內容是否全部在_ap_start開始的2M內存中,判定條件是所需value的addr+length是否小于等于f_offset+2M。如果在,則直接讀取內存mmap_start+addr-f_offset開始的length個字節(jié)的內容;否則,先從內存mmap_start+addr_f_offset開始讀取f_offset+2M_addr個字節(jié)的內容,然后再對f_offset+2M開始處的文件進行映射,讀取剩下的內容。這里要求為參數(shù)value已經分配好足夠的空間。[0034]第二步,實現(xiàn)鍵值對(key-value)的寫入和讀取。[0035]步驟2.1,鍵值對的寫入。鍵值對的寫入是分開進行的,要使用步驟1.1中的寫入函數(shù),將value寫入文件,獲取返回值value的偏移。然后將value的偏移和長度組合成一個64位的信息字段,并對其進行base64編碼。最后將key和經過base64編碼的信息字段,當做一個鍵值對寫入A系統(tǒng)。如圖2所示。[0036]本發(fā)明實施例中鍵值對的寫入函數(shù)Put如下:[0037]intPut(constchar氺key,constchar氺value)[0038]鍵值對的寫入函數(shù)實現(xiàn)中,首先調用strlen函數(shù)獲取value的長度length,然后調用myPut函數(shù)將value寫入文件,得到偏移addr。接著將addr和length合并成一個64位值,其中高40位是adding24位是length。為避免在轉化為字符串時出現(xiàn)被O截斷的情況,進行base64編碼,得到一個12字節(jié)的字符串,最后將該字符串當作value與key—起存入A系統(tǒng)。[0039]步驟2.2,鍵值對的讀取。讀取過程與寫入正好相反,首先根據(jù)key值,從A系統(tǒng)中讀取信息字段。然后進行base64解碼,從中獲取value的偏移和長度信息。接著將偏移和長度作為參數(shù),調用步驟1.2中的讀取函數(shù),得到真正的value值。[0040]本發(fā)明實施例中鍵值對的讀取函數(shù)Get如下:[0041]intGet(constchar氺key,char氺value)[0042]要求鍵值對的讀取函數(shù)調用之前,value已經分配好空間。鍵值對的讀取函數(shù)的實現(xiàn)中,首先根據(jù)鍵值從A系統(tǒng)中讀取base64編碼的12字節(jié)字符串,如果讀取失敗,說明該鍵不存在,返回-1;否則,對該字符串進行base64解碼,獲得value在文件中的偏移addr和長度length。接著將addr、length和value作為參數(shù)調用myGet函數(shù),得到真正的value。[0043]如圖3的(a)和(b)所示,為使用本發(fā)明前后,記錄在磁盤上可能的邏輯順序。(a)是沒有采用本發(fā)明,key和value是成對的,順序是一致的,當數(shù)據(jù)的讀取順序與寫入順序接近時,由于存儲的隨機性,將帶來大量的讀磁盤開銷。(b)是使用本發(fā)明方法后,value的順序與寫入順序一致,沒有變化,key則按大小排序,與不使用本發(fā)明方法時一致,但是,由于利用內存映射讀取value,當數(shù)據(jù)的讀取順序與寫入順序接近時,讀取內存中的value與寫入順序一致,此時將大大減少讀磁盤開銷?!緳嗬蟆?.一種鍵(key)與值(value)分開存儲的key-value存儲系統(tǒng)設計方法,基于底層結構以bigtable為基礎的現(xiàn)有key-value存儲系統(tǒng),其特征在于,包括如下兩個步驟:第一步,構造value在文件的寫入和讀取函數(shù),將value在單獨的文件中存儲;步驟1.1,構造value的寫入函數(shù),寫入函數(shù)的輸入參數(shù)包括value的內容和長度,返回值為value在文件中的偏移;每次在文件結尾處寫入value值,并設置一個變量用來保存文件結尾的偏移量;步驟1.2,構造value的讀取函數(shù),讀取函數(shù)的輸入參數(shù)包括value在文件中的偏移和長度,返回值是字符串形式的value值;value的讀取使用內存映射;第二步,實現(xiàn)鍵值對(key-value)的寫入和讀??;步驟2.1,鍵值對的寫入,具體是:對一個key-value,首先將value按照步驟1.1寫入文件,并獲得value在文件中的偏移,然后,將value在文件中的偏移和value的長度組合成一個64位的信息字段,并對信息字段進行base64編碼,最后,將key和經過base64編碼的信息字段作為一個鍵值對,寫入現(xiàn)有key-value存儲系統(tǒng);步驟2.2鍵值對的讀取,具體是:首先,根據(jù)key值,從現(xiàn)有key-value存儲系統(tǒng)中讀取對應的信息字段,然后,對讀取的信息字段進行base64解碼,從中獲取對應value在文件中的偏移和長度;最后,將獲得的偏移和長度作為參數(shù),調用步驟1.2中value的讀取函數(shù),得到value值。2.根據(jù)權利要求1所述的key-value存儲系統(tǒng)設計方法,其特征在于,所述的步驟1.2中,總的映射空間最多為100M。3.根據(jù)權利要求1或2所述的key-value存儲系統(tǒng)設計方法,其特征在于,步驟1.2所述的value的讀取函數(shù),所實現(xiàn)的操作為:首先,對輸入的value在文件中的偏移addr進行4kB的對齊操作,獲得偏移f_offset;然后,在總的映射空間中查找f_offset,若查找到,獲取對應的內存映射的起始地址mmap_start,否則,將文件中讀取從偏移f_offset開始的大小為K的內容,映射到內存中,并獲取對應的內容映射的起始地址_ap_start,K為每次內存映射的大??;最后,判斷所需的value內容是否全部在mmap_start開始的大小為K的內存中,若在,直接讀取內存mmap_start+addr_f_offset開始的長度為length個字節(jié)的內容,否則,先從內存mmap_start+addr_f_offset開始讀取f_offset+K_addr個字節(jié)的內容,再對f_offset+f_offset+K開始處的文件進行映射,讀取所需value剩下的內容;length為value的長度?!疚臋n編號】G06F9/44GK103559027SQ201310499659【公開日】2014年2月5日申請日期:2013年10月22日優(yōu)先權日:2013年10月22日【發(fā)明者】王雷,趙玉龍,王宇申請人:北京航空航天大學
網友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1
沐川县| 贺兰县| 湟源县| 建始县| 新巴尔虎右旗| 湘潭县| 锦州市| 永丰县| 班戈县| 方正县| 恩施市| 英山县| 若羌县| 大邑县| 枣强县| 兰溪市| 丰镇市| 伊宁市| 休宁县| 尚义县| 崇明县| 沭阳县| 阜新| 稷山县| 张掖市| 恭城| 常山县| 公主岭市| 天津市| 湄潭县| 拉萨市| 北票市| 越西县| 读书| 京山县| 郓城县| 常宁市| 江油市| 财经| 长春市| 罗田县|