一種基于鍵值對(duì)的數(shù)據(jù)處理方法及系統(tǒng)的制作方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明屬于數(shù)據(jù)存儲(chǔ)技術(shù)領(lǐng)域,尤其涉及一種基于鍵值對(duì)的數(shù)據(jù)處理方法及系統(tǒng)。
【背景技術(shù)】
[0002]開源數(shù)據(jù)庫(kù)Redis是一個(gè)高性能的鍵值對(duì)數(shù)據(jù)庫(kù),也稱非關(guān)系型數(shù)據(jù)庫(kù),它支持主從同步,數(shù)據(jù)可以從主服務(wù)器向任意數(shù)量的從服務(wù)器上同步,從服務(wù)器可以是關(guān)聯(lián)其他從服務(wù)器的主服務(wù)器,這使得Redis可執(zhí)行單層樹復(fù)制。開源數(shù)據(jù)庫(kù)Redis的出現(xiàn),很大程度補(bǔ)償了關(guān)系型數(shù)據(jù)庫(kù)存儲(chǔ)的不足,在部分場(chǎng)合可以對(duì)關(guān)系型數(shù)據(jù)庫(kù)起到很好的補(bǔ)充作用。隨著互聯(lián)網(wǎng)web2.0網(wǎng)站的興起,開源數(shù)據(jù)庫(kù)Redis已經(jīng)成了一個(gè)極其熱門的新領(lǐng)域,非關(guān)系型數(shù)據(jù)庫(kù)產(chǎn)品的發(fā)展也非常迅速。但是,目前開源數(shù)據(jù)庫(kù)Redis的數(shù)據(jù)處理方式一般為單進(jìn)程處理,當(dāng)接收到客戶端發(fā)送的操作命令時(shí),服務(wù)器端只能通過隊(duì)列的方式處理客戶端發(fā)送的操作命令,無法利用處理器的多核優(yōu)勢(shì)進(jìn)行并發(fā)處理,而單核處理能力有限,因此使得開源數(shù)據(jù)庫(kù)Redis的數(shù)據(jù)處理性能較低。此外,目前在部署數(shù)據(jù)庫(kù)時(shí),由于單個(gè)數(shù)據(jù)庫(kù)實(shí)例性能瓶頸的問題,一般需要部署多個(gè)數(shù)據(jù)庫(kù)實(shí)例才能達(dá)到業(yè)務(wù)性能需求,這樣就需要投入大量的時(shí)間和人力對(duì)數(shù)據(jù)庫(kù)進(jìn)行監(jiān)控和運(yùn)維,增加了數(shù)據(jù)庫(kù)管理的負(fù)擔(dān)。
【發(fā)明內(nèi)容】
[0003]本發(fā)明實(shí)施例的目的在于提供一種基于鍵值對(duì)的數(shù)據(jù)處理方法及系統(tǒng),旨在解決上述開源數(shù)據(jù)庫(kù)Redis的數(shù)據(jù)處理性能較低,并且需要投入大量的時(shí)間和人力對(duì)數(shù)據(jù)庫(kù)進(jìn)行監(jiān)控和運(yùn)維,增加了數(shù)據(jù)庫(kù)管理的負(fù)擔(dān)的問題。
[0004]本發(fā)明實(shí)施例是這樣實(shí)現(xiàn)的,一種基于鍵值對(duì)的數(shù)據(jù)處理方法,包括:
[0005]服務(wù)器集群中的任一節(jié)點(diǎn)接收客戶端發(fā)送的數(shù)據(jù)庫(kù)鍵命令;
[0006]所述節(jié)點(diǎn)計(jì)算所述數(shù)據(jù)庫(kù)鍵命令中攜帶的key值所對(duì)應(yīng)的哈希槽,并判斷所述哈希槽是否由自己負(fù)責(zé);
[0007]若是,則所述節(jié)點(diǎn)執(zhí)行所述數(shù)據(jù)庫(kù)鍵命令;
[0008]若否,則所述節(jié)點(diǎn)向所述客戶端返回moved錯(cuò)誤的提示信息,使所述客戶端根據(jù)所述提示信息轉(zhuǎn)向所述服務(wù)器集群中正確的節(jié)點(diǎn)。
[0009]在本發(fā)明實(shí)施例所述的基于鍵值對(duì)的數(shù)據(jù)處理方法中,在服務(wù)器集群中的任一節(jié)點(diǎn)接收客戶端發(fā)送的數(shù)據(jù)庫(kù)鍵命令之前還包括:
[0010]將所述服務(wù)器集群中的多個(gè)哈希槽分別指派給所述服務(wù)器集群中的各個(gè)節(jié)點(diǎn),并將所述多個(gè)哈希槽的指派信息存儲(chǔ)至所述服務(wù)器集群中的每個(gè)節(jié)點(diǎn)。
[0011]在本發(fā)明實(shí)施例所述的基于鍵值對(duì)的數(shù)據(jù)處理方法中,所述提示信息包括所述key值所對(duì)應(yīng)的哈希槽被指派的節(jié)點(diǎn)名稱。
[0012]在本發(fā)明實(shí)施例所述的基于鍵值對(duì)的數(shù)據(jù)處理方法中,所述節(jié)點(diǎn)計(jì)算所述數(shù)據(jù)庫(kù)鍵命令中攜帶的key值所對(duì)應(yīng)的哈希槽具體包括:
[0013]所述節(jié)點(diǎn)采用集群使用公式CRC16 (key) % 16384來計(jì)算key值所對(duì)應(yīng)的哈希槽,其中,CRC16 (key)語句用于計(jì)算key值的CRC16校驗(yàn)和。
[0014]在本發(fā)明實(shí)施例所述的基于鍵值對(duì)的數(shù)據(jù)處理方法中,所述數(shù)據(jù)庫(kù)鍵命令包括get命令、set命令、del命令和hget命令。
[0015]本發(fā)明實(shí)施例的另一目的在于提供一種基于鍵值對(duì)的數(shù)據(jù)處理系統(tǒng),包括位于服務(wù)器集群中節(jié)點(diǎn)內(nèi)部的接收模塊、計(jì)算模塊、判斷模塊、執(zhí)行模塊以及提示模塊,所述接收模塊、所述計(jì)算模塊、所述判斷模塊以及所述執(zhí)行模塊依次連接,所述判斷模塊還與所述提示模塊連接,其中:
[0016]所述接收模塊,用于接收客戶端發(fā)送的數(shù)據(jù)庫(kù)鍵命令;
[0017]所述計(jì)算模塊,用于計(jì)算所述數(shù)據(jù)庫(kù)鍵命令中攜帶的key值所對(duì)應(yīng)的哈希槽;
[0018]所述判斷模塊,用于判斷所述哈希槽是否由所述節(jié)點(diǎn)負(fù)責(zé);
[0019]所述執(zhí)行模塊,用于若是由所述節(jié)點(diǎn)負(fù)責(zé),則執(zhí)行所述數(shù)據(jù)庫(kù)鍵命令;
[0020]所述提示模塊,用于若不是由所述節(jié)點(diǎn)負(fù)責(zé),則向所述客戶端返回moved錯(cuò)誤的提示信息,使所述客戶端根據(jù)所述提示信息轉(zhuǎn)向所述服務(wù)器集群中正確的節(jié)點(diǎn)。
[0021]在本發(fā)明實(shí)施例所述的基于鍵值對(duì)的數(shù)據(jù)處理系統(tǒng)中,還包括與所述服務(wù)器集群中的節(jié)點(diǎn)相連的分配模塊和位于所述節(jié)點(diǎn)內(nèi)部與所述分配模塊和所述判斷模塊連接的存儲(chǔ)模塊,其中:
[0022]所述分配模塊,用于將所述服務(wù)器集群中的多個(gè)哈希槽分別指派給所述服務(wù)器集群中的各個(gè)節(jié)點(diǎn);
[0023]所述存儲(chǔ)模塊,用于存儲(chǔ)所述多個(gè)哈希槽的指派信息。
[0024]在本發(fā)明實(shí)施例所述的基于鍵值對(duì)的數(shù)據(jù)處理系統(tǒng)中,所述提示信息包括所述key值所對(duì)應(yīng)的哈希槽被指派的節(jié)點(diǎn)名稱。
[0025]在本發(fā)明實(shí)施例所述的基于鍵值對(duì)的數(shù)據(jù)處理系統(tǒng)中,所述計(jì)算模塊具體用于:
[0026]采用集群使用公式CRC16(key) % 16384來計(jì)算key值所對(duì)應(yīng)的哈希槽,其中,CRC16 (key)語句用于計(jì)算key值的CRC16校驗(yàn)和。
[0027]在本發(fā)明實(shí)施例所述的基于鍵值對(duì)的數(shù)據(jù)處理系統(tǒng)中,所述數(shù)據(jù)庫(kù)鍵命令包括get命令、set命令、del命令和hget命令。
[0028]實(shí)施本發(fā)明實(shí)施例提供的基于鍵值對(duì)的數(shù)據(jù)處理方法及系統(tǒng)具有以下有益效果:
[0029]本發(fā)明實(shí)施例由于首先采用的由服務(wù)器集群中的任一節(jié)點(diǎn)接收客戶端發(fā)送的數(shù)據(jù)庫(kù)鍵命令;然后由所述節(jié)點(diǎn)計(jì)算所述數(shù)據(jù)庫(kù)鍵命令中攜帶的key值所對(duì)應(yīng)的哈希槽,并判斷所述哈希槽是否由自己負(fù)責(zé);若是,則所述節(jié)點(diǎn)執(zhí)行所述數(shù)據(jù)庫(kù)鍵命令;若否,則所述節(jié)點(diǎn)向所述客戶端返回moved錯(cuò)誤的提示信息,使所述客戶端根據(jù)所述提示信息轉(zhuǎn)向所述服務(wù)器集群中正確的節(jié)點(diǎn),從而使得開源數(shù)據(jù)庫(kù)Redis可以利用處理器的多核優(yōu)勢(shì)進(jìn)行并發(fā)處理,提升了數(shù)據(jù)庫(kù)的處理性能,使得只需部署一個(gè)數(shù)據(jù)庫(kù)實(shí)例即可達(dá)到業(yè)務(wù)性能指標(biāo),減少了數(shù)據(jù)庫(kù)實(shí)例的部署,減輕了數(shù)據(jù)庫(kù)管理的負(fù)擔(dān)。
【附圖說明】
[0030]圖1是本發(fā)明實(shí)施例提供的基于鍵值對(duì)的數(shù)據(jù)處理方法的具體實(shí)現(xiàn)流程圖;
[0031]圖2是本發(fā)明實(shí)施例提供的基于鍵值對(duì)的數(shù)據(jù)處理系統(tǒng)的結(jié)構(gòu)框圖。
【具體實(shí)施方式】
[0032]為了使本發(fā)明的目的、技術(shù)方案及優(yōu)點(diǎn)更加清楚明白,以下結(jié)合附圖及實(shí)施例,對(duì)本發(fā)明進(jìn)行進(jìn)一步詳細(xì)說明。應(yīng)當(dāng)理解,此處所描述的具體實(shí)施例僅僅用以解釋本發(fā)明,并不用于限定本發(fā)明。
[0033]圖1示出了本發(fā)明實(shí)施例提供的基于鍵值對(duì)的數(shù)據(jù)處理方法的具體實(shí)現(xiàn)流程。參見圖1所示,本發(fā)明實(shí)施例提供的一種基于鍵值對(duì)的數(shù)據(jù)處理方法,包括:
[0034]在S101中,服務(wù)器集群中的任一節(jié)點(diǎn)接收客戶端發(fā)送的數(shù)據(jù)庫(kù)鍵命令。
[0035]在本發(fā)明實(shí)施例中,在服務(wù)器集群中的任一節(jié)點(diǎn)接收客戶端發(fā)送的數(shù)據(jù)庫(kù)鍵命令之前還包括:將所述服務(wù)器集群中的多個(gè)哈希槽分別指派給所述服務(wù)器集群中的各個(gè)節(jié)點(diǎn),并將所述多個(gè)哈希槽的指派信息存儲(chǔ)至所述服務(wù)器集群中的每個(gè)節(jié)點(diǎn)。進(jìn)一步的,服務(wù)器集群中的每個(gè)哈希槽只能對(duì)應(yīng)指派給一個(gè)節(jié)點(diǎn),但是每個(gè)節(jié)點(diǎn)均可對(duì)應(yīng)負(fù)責(zé)處理多個(gè)哈希槽。
[0036]在S102中,所述節(jié)點(diǎn)計(jì)算所述數(shù)據(jù)庫(kù)鍵命令中攜帶的key值所對(duì)應(yīng)的哈希槽,并判斷所述哈希槽是否由自己負(fù)責(zé)。
[0037]在本發(fā)明實(shí)施例中,數(shù)據(jù)庫(kù)的服務(wù)器集群中包括有16384個(gè)哈希槽(hash slot),數(shù)據(jù)庫(kù)中的每個(gè)key值都屬于這16384個(gè)哈希槽的其中一個(gè)。所述節(jié)點(diǎn)在接收到客戶端發(fā)送的數(shù)據(jù)鍵命令后,會(huì)對(duì)所述數(shù)據(jù)鍵命令進(jìn)行解析,以獲取所述數(shù)據(jù)鍵命令中攜帶的key值,然后計(jì)算所述key值所對(duì)應(yīng)的哈希槽,并判斷所述哈希槽是否由自己負(fù)責(zé)。
[0038]其中,所述節(jié)點(diǎn)計(jì)算所述數(shù)據(jù)庫(kù)鍵命令中攜帶的key值所對(duì)應(yīng)的哈希槽具體包括:所述節(jié)點(diǎn)采用集群使用公式CRC16 (key) % 16384來計(jì)算key值所對(duì)應(yīng)的哈希槽,其中,CRC16 (key)語句用于計(jì)算key值的CRC16校驗(yàn)和。
[0039]其中,判斷所述哈希槽是否由自己負(fù)責(zé)具體包括:根據(jù)計(jì)算得出的哈希槽和所述節(jié)點(diǎn)中預(yù)先存儲(chǔ)的多個(gè)哈希槽的指派信息查找所述key值所對(duì)應(yīng)的哈希槽被指派的節(jié)點(diǎn)名稱,判斷所述節(jié)點(diǎn)名稱是否與自身存儲(chǔ)的節(jié)點(diǎn)名稱相同,若相同,則說明所述key值所對(duì)應(yīng)的哈希槽是由自己負(fù)責(zé);反之,所述key值所對(duì)應(yīng)的哈希槽不是由自己負(fù)責(zé)的。
[0040]在S103-1中,若是,則所述節(jié)點(diǎn)執(zhí)行所述數(shù)據(jù)庫(kù)鍵命令。
[0041]在本發(fā)明實(shí)施例中,若所述節(jié)點(diǎn)判斷出所述key值所對(duì)應(yīng)的哈希槽是