本發(fā)明涉及計算機數(shù)據(jù)存儲技術領域,尤其涉及一種leveldb數(shù)據(jù)庫中數(shù)據(jù)對寫入的方法、裝置及系統(tǒng)。
背景技術:
leveldb數(shù)據(jù)庫是google開源的一個key-value存儲引擎庫,本申請文件中所提到的數(shù)據(jù)對即key-value對,leveldb數(shù)據(jù)庫在存儲數(shù)據(jù)時,是根據(jù)記錄的key值有序存儲的,就是說相鄰的key值在存儲文件中是依次順序存儲的,而應用可以自定義key大小比較函數(shù),leveldb數(shù)據(jù)庫會按照用戶定義的比較函數(shù)依序存儲這些記錄。
在數(shù)據(jù)存儲領域,leveldb數(shù)據(jù)庫的應用場景很多, leveldb數(shù)據(jù)庫的應用過程中會存在一些性能不高的問題:比如大批量的寫入場景下,levedb數(shù)據(jù)庫中l(wèi)evel-0 的files數(shù)量達到kL0_SlowdownWritesTrigger(默認8)時,產生寫入延遲問題;達到kL0_StopWritesTrigger(默認12)時,產生寫入阻塞問題,導致了leveldb數(shù)據(jù)庫整體的寫入性能較低。
目前常用的解決方法是修改源碼中kL0_SlowdownWritesTrigger和kL0_StopWritesTrigger的大小來調整寫入延遲和寫入阻塞的條件,但是,該方案并不能徹底解決該問題。因為在大批量寫入的場景下,通過提高以上兩個變量的值,只能暫時延長達到寫入延遲與寫入阻塞條件的時間,而并沒有徹底解決這個問題。當時間達到后,依然會觸發(fā)寫入延遲與寫入阻塞的條件,導致寫入性能低下。這種方案只能延長到達觸發(fā)條件的時間,而不能解決達到觸發(fā)條件后寫入性能低下的問題。
技術實現(xiàn)要素:
鑒于此,本方法提供了一種leveldb數(shù)據(jù)庫中數(shù)據(jù)對寫入的方法、裝置及系統(tǒng),解決了在大壓力情況下leveldb數(shù)據(jù)庫的寫入性能較低的問題,提高了leveldb數(shù)據(jù)庫的寫入性能。
為了達到上述目的,本發(fā)明是通過以下技術方案實現(xiàn)的:
本發(fā)明提供一種leveldb數(shù)據(jù)庫中數(shù)據(jù)對寫入的方法,包括:
配置多個消息隊列對應多個leveldb數(shù)據(jù)庫;
將數(shù)據(jù)對寫入其中的一個消息隊列;
將消息隊列中的數(shù)據(jù)對寫入與該消息隊列相對應的leveldb數(shù)據(jù)庫。
其中,配置多個消息隊列對應多個數(shù)據(jù)庫之前,還包括步驟:創(chuàng)建多個目錄,配置多個leveldb數(shù)據(jù)庫對應多個目錄。
其中,將數(shù)據(jù)對寫入其中的一個消息隊列之前,包括步驟:通過哈希算法將數(shù)據(jù)對在多個消息隊列之間進行分配,確定數(shù)據(jù)對將要寫入的消息隊列。
優(yōu)選地,通過異步線程將數(shù)據(jù)對寫入到消息隊列。
其中,將消息隊列中的數(shù)據(jù)對寫入與該消息隊列相對應的leveldb數(shù)據(jù)庫之前,還包括步驟:在leveldb數(shù)據(jù)庫中創(chuàng)建線程池,線程池包括有多個線程。
其中,將消息隊列中的數(shù)據(jù)對寫入與該消息隊列相對應的leveldb數(shù)據(jù)庫,包括步驟:多個線程將消息隊列中的數(shù)據(jù)對寫入與該消息隊列相對應的leveldb數(shù)據(jù)庫。
本發(fā)明提供一種leveldb數(shù)據(jù)庫中數(shù)據(jù)對寫入的裝置,包括:
消息隊列配置模塊,用于配置與多個leveldb數(shù)據(jù)庫相對應的多個消息隊列;
第一數(shù)據(jù)對寫入模塊,用于將數(shù)據(jù)對寫入消息隊列;
第二數(shù)據(jù)對寫入模塊,用于將消息隊列中的數(shù)據(jù)對寫入與該消息隊列相對應的leveldb數(shù)據(jù)庫。
優(yōu)選地,還包括:
目錄創(chuàng)建模塊,用于創(chuàng)建多個目錄;
leveldb數(shù)據(jù)庫配置模塊,用于配置與多個目錄相關聯(lián)的多個leveldb數(shù)據(jù)庫。
優(yōu)選地,還包括:
哈希運算模塊,用于對數(shù)據(jù)對進行哈希運算,確定數(shù)據(jù)對將要寫入的消息隊列。
本發(fā)明提供一種leveldb數(shù)據(jù)庫中數(shù)據(jù)對寫入的系統(tǒng),包括:數(shù)據(jù)對運算單元、異步線程和多個目錄,其中,多個目錄的目錄名互不相同,每個目錄下分別設有與該目錄對應的leveldb數(shù)據(jù)庫、消息隊列和線程池,所述數(shù)據(jù)運算單元對數(shù)據(jù)對進行哈希運算后,通過異步線程將數(shù)據(jù)寫入其中一個目錄下的消息隊列,所述線程池包括有多個線程,線程將消息隊列中的數(shù)據(jù)對寫入與該消息隊列相對應的leveldb數(shù)據(jù)庫。
本發(fā)明的有益效果如下:
本發(fā)明所提供的一種leveldb數(shù)據(jù)庫中數(shù)據(jù)對寫入的方法,具有如下優(yōu)點:
1.通過創(chuàng)建多個目錄,并在多個目錄下配置多個leveldb數(shù)據(jù)庫,在數(shù)據(jù)對寫入時,當其中一個數(shù)據(jù)庫發(fā)生寫入延遲或寫入阻塞時,并不影響其他數(shù)據(jù)庫的正常寫入,同時將在大批量寫入的場景下,數(shù)據(jù)寫入的整體壓力分散給了多個數(shù)據(jù)庫,從另一方面降低了寫入延遲或寫入阻塞的發(fā)生幾率,提高數(shù)據(jù)寫入效率和性能;
2.通過對數(shù)據(jù)對中的key采取哈希算法,實現(xiàn)數(shù)據(jù)對入庫的均衡分布,快速決定數(shù)據(jù)對將要落入哪個數(shù)據(jù)庫,從一方面提高數(shù)據(jù)庫的寫入效率;
3.經過哈希算法確定數(shù)據(jù)對所要落入的數(shù)據(jù)庫之后,通過異步線程來進行數(shù)據(jù)對到消息隊列的寫入,異步線程的寫操作速度遠高于同步性線程,因此減少了leveldb數(shù)據(jù)庫處理寫入操作時的線程等待時間,提高處理效率;
4. 通過多線程池的方式,線程池內含有多個線程,采用多個線程操作多個數(shù)據(jù)對,提高了數(shù)據(jù)對在到達數(shù)據(jù)庫的效率;
leveldb數(shù)據(jù)庫中數(shù)據(jù)對寫入的裝置及系統(tǒng)的有益效果與leveldb數(shù)據(jù)庫中數(shù)據(jù)對寫入的方法的有益效果類似,不再贅述。
附圖說明:
圖1為本發(fā)明實施例所提供的leveldb數(shù)據(jù)庫中數(shù)據(jù)對寫入的方法的流程示意圖;
圖2為本發(fā)明實施例所提供的leveldb數(shù)據(jù)庫中數(shù)據(jù)對寫入的裝置的示意圖;
圖3為本發(fā)明實施例所提供的leveldb數(shù)據(jù)庫中數(shù)據(jù)對寫入的系統(tǒng)的框架圖;
具體實施方式:
本發(fā)明的核心是提供一種leveldb數(shù)據(jù)庫中數(shù)據(jù)對寫入的方法、裝置及系統(tǒng),解決了在大壓力情況下leveldb數(shù)據(jù)庫的寫入性能較低的問題,提高了leveldb數(shù)據(jù)庫的寫入性能。
為使本發(fā)明實施例的目的、技術方案和優(yōu)點更加清楚,下面將結合本發(fā)明實施例中的附圖,對本發(fā)明實施例中的技術方案進行清楚、完整地描述,顯然,所描述的實施例是本發(fā)明一部分實施例,而不是全部的實施例?;诒景l(fā)明中的實施例,本領域普通技術人員在沒有做出創(chuàng)造性勞動前提下所獲得的所有其他實施例,都屬于本發(fā)明保護的范圍。
請參考圖1,圖1為本發(fā)明實施例所提供的leveldb數(shù)據(jù)庫中數(shù)據(jù)對寫入的方法的流程示意圖;leveldb數(shù)據(jù)庫中數(shù)據(jù)對寫入的方法包括:
步驟S101、創(chuàng)建多個目錄,配置多個leveldb數(shù)據(jù)庫對應多個目錄;
其中,在磁盤上創(chuàng)建多個目錄,目錄的數(shù)量記為db_num,可以由用戶自行設定或者是系統(tǒng)默認設定,因為目錄的數(shù)量為一個定值,因此每一個目錄都相當于具有一個區(qū)別于其他目錄的目錄名,再為每一個目錄配置一個leveldb數(shù)據(jù)庫db,數(shù)據(jù)庫的數(shù)量也為db_num,每一個數(shù)據(jù)庫有唯一的名,記為dbID。
作為一種可實施方式,為目錄配置leveldb數(shù)據(jù)庫可以通過創(chuàng)建一個新的leveldb數(shù)據(jù)庫或者打開一個已有的leveldb數(shù)據(jù)庫來實現(xiàn)。
步驟S102、配置多個消息隊列對應多個leveldb數(shù)據(jù)庫;
其中,根據(jù)數(shù)據(jù)庫的數(shù)量db_num來為每一個數(shù)據(jù)庫配置一個消息隊列,消息隊列的數(shù)量也為db_num,因此數(shù)據(jù)的dbID也同樣適用于對應的消息隊列。
步驟S103、通過哈希算法將數(shù)據(jù)對在多個消息隊列之間進行分配,確定數(shù)據(jù)對將要寫入的消息隊列;
其中,本申請文件中所述的數(shù)據(jù)對是指含有key(鍵)、value(值)的數(shù)據(jù),數(shù)據(jù)對在寫入消息隊列queue[dbID]的時候,需要對key進行哈希運算后,對db_num進行取余來得到該數(shù)據(jù)的數(shù)據(jù)庫的dbID,公式為:dbID = hash(key) % db_num。例如:數(shù)據(jù)對為(17,value),數(shù)據(jù)庫的數(shù)量為5個,它們的dbID依次為1、2、3、4、5,即key=17,db_num=5,若哈希運算為直接尋址,即hash(key)=key,則不難得出dbID=2,即數(shù)據(jù)對(17,value)將要被寫入消息隊列queue[2]。
作為一種可實施方式,哈希運算可以選擇數(shù)字分析法、平方取中法、折疊法、隨機數(shù)法、除留余數(shù)法等。
步驟S104、通過異步線程將數(shù)據(jù)對寫入到消息隊列。異步線程將數(shù)據(jù)對(key,value)寫入消息隊列queue[dbID],然后異步線程返回處理其他消息。
步驟S105、在leveldb數(shù)據(jù)庫中創(chuàng)建線程池,線程池包括有多個線程;在leveldb數(shù)據(jù)庫db[dbID]中線程池Tpool[dbID],線程池Tpool[dbID]中包括有多個線程。
步驟S106、將消息隊列中的數(shù)據(jù)對寫入與該消息隊列相對應的leveldb數(shù)據(jù)庫;
其中,多個線程將消息隊列中的數(shù)據(jù)對寫入與該消息隊列相對應的leveldb數(shù)據(jù)庫。該數(shù)據(jù)庫對應的線程池Tpool[dbID]中的線程處理消息隊列queue[dbID]中的數(shù)據(jù)對(key,value),將其寫入leveldb數(shù)據(jù)庫db[dbID]。
請參考圖2,圖2為本發(fā)明實施例所提供的leveldb數(shù)據(jù)庫中數(shù)據(jù)對寫入的裝置的示意圖;leveldb數(shù)據(jù)庫中數(shù)據(jù)對寫入的裝置包括:
消息隊列配置模塊203,用于配置與多個leveldb數(shù)據(jù)庫相對應的多個消息隊列;
第一數(shù)據(jù)對寫入模塊204,用于將數(shù)據(jù)對寫入消息隊列, 異步線程將數(shù)據(jù)對(key,value)寫入消息隊列queue[dbID],然后異步線程返回處理其他消息;
第二數(shù)據(jù)對寫入模塊205,用于將消息隊列中的數(shù)據(jù)對寫入與該消息隊列相對應的leveldb數(shù)據(jù)庫。當前l(fā)eveldb數(shù)據(jù)庫對應的線程池Tpool[dbID]中的線程處理消息隊列queue[dbID]中的數(shù)據(jù)對(key,value),將其寫入leveldb數(shù)據(jù)庫db[dbID]。
目錄創(chuàng)建模塊201,用于創(chuàng)建多個目錄;
leveldb數(shù)據(jù)庫配置模塊202,用于配置與多個目錄相關聯(lián)的多個leveldb數(shù)據(jù)庫。
哈希運算模塊206,用于對數(shù)據(jù)對進行哈希運算,確定數(shù)據(jù)對將要寫入的消息隊列。
請參考圖3,圖3為本發(fā)明實施例所提供的leveldb數(shù)據(jù)庫中數(shù)據(jù)對寫入的系統(tǒng)的框架圖;leveldb數(shù)據(jù)庫中數(shù)據(jù)對寫入的系統(tǒng)包括:
數(shù)據(jù)對運算單元、異步線程和多個目錄,其中,多個目錄的目錄名互不相同,每個目錄下分別設有與該目錄對應的leveldb數(shù)據(jù)庫、消息隊列和線程池,所述數(shù)據(jù)運算單元對數(shù)據(jù)對進行哈希運算后,通過異步線程將數(shù)據(jù)寫入其中一個目錄下的消息隊列,所述線程池包括有多個線程,線程將消息隊列中的數(shù)據(jù)對寫入與該消息隊列相對應的leveldb數(shù)據(jù)庫。
以上所述僅為本發(fā)明示意性的具體實施方式,并非用以限定本發(fā)明的范圍,任何本領域的技術人員在不脫離本發(fā)明構思和原則的前提下所做出的等同變化與修改,均應屬于本發(fā)明保護的范圍。