本發(fā)明涉及數(shù)據(jù)更新技術(shù)領(lǐng)域,特別是一種緩存最終一致性更新方法。
背景技術(shù):
隨著業(yè)務(wù)體量的不斷增加,對(duì)于服務(wù)器的需求量也不斷增大,因此相同功能的業(yè)務(wù)系統(tǒng)也不再只部署一臺(tái)服務(wù)器,而是會(huì)部署多個(gè)業(yè)務(wù)系統(tǒng)在不同的服務(wù)器上面。由于這些業(yè)務(wù)系統(tǒng)之間存在一些公用數(shù)據(jù)是放置在redis程序中的,同時(shí)這些業(yè)務(wù)系統(tǒng)也會(huì)對(duì)redis程序中的數(shù)據(jù)進(jìn)行查詢和修改,因此可能會(huì)造成redis程序中的數(shù)據(jù)與數(shù)據(jù)庫(kù)中的數(shù)據(jù)不一致。
技術(shù)實(shí)現(xiàn)要素:
為解決現(xiàn)有技術(shù)中存在的問(wèn)題,本發(fā)明的目的是提供一種緩存最終一致性更新方法,本發(fā)明利用redis程序的隊(duì)列、redis程序的incr命令以及隊(duì)列中的數(shù)據(jù)內(nèi)容和數(shù)據(jù)標(biāo)識(shí),來(lái)保證數(shù)據(jù)庫(kù)中的數(shù)據(jù)和redis程序中的數(shù)據(jù)的最終一致性。
為實(shí)現(xiàn)上述目的,本發(fā)明采用的技術(shù)方案是:一種緩存最終一致性更新方法,基于redis隊(duì)列保證緩存最終一致性,具體包括以下步驟:
步驟1、業(yè)務(wù)系統(tǒng)需要對(duì)redis程序中的數(shù)據(jù)進(jìn)行修改時(shí),首先從redis程序中獲取對(duì)應(yīng)的緩存標(biāo)志當(dāng)前的incr值;
步驟2、業(yè)務(wù)系統(tǒng)將需要更新的數(shù)據(jù)進(jìn)行拼裝,拼裝內(nèi)容包括緩存信息、incr值以及緩存內(nèi)容類型,然后對(duì)redis程序指定隊(duì)列進(jìn)行左入隊(duì)操作,既redis程序的lpush操作;
步驟3、定時(shí)更新程序在定時(shí)任務(wù)觸發(fā)時(shí),負(fù)責(zé)對(duì)redis程序指定隊(duì)列進(jìn)行右出隊(duì)操作,既redis程序的brpop操作;
步驟4、判斷redis程序的右出隊(duì)操作獲得的結(jié)果是否為空:如果redis程序的右出隊(duì)操作獲得的結(jié)果不為空,則對(duì)緩存進(jìn)行更新;如果redis程序的右出隊(duì)操作獲得的結(jié)果為空,則定時(shí)更新程序的該次執(zhí)行結(jié)束,等待下一次喚醒。
作為本發(fā)明的進(jìn)一步改進(jìn),所述步驟4中,如果redis程序的右出隊(duì)操作獲得的結(jié)果不為空,對(duì)緩存進(jìn)行更新具體包括以下步驟:
步驟4.1、定時(shí)更新程序解析出隊(duì)操作獲得的結(jié)果,獲取對(duì)應(yīng)的緩存標(biāo)志的incr值,判斷獲取的incr值和解析出隊(duì)操作獲得的結(jié)果的incr值是否一致,如果一致則說(shuō)明該數(shù)據(jù)屬于最新的數(shù)據(jù)庫(kù)數(shù)據(jù),則是屬于可以更新到redis程序緩存中的內(nèi)容;如果不一致,則說(shuō)明該數(shù)據(jù)不是最新的,則應(yīng)當(dāng)跳過(guò)該次更新;
步驟4.2、當(dāng)數(shù)據(jù)是屬于應(yīng)當(dāng)被更新到redis程序中的緩存數(shù)據(jù)時(shí),先更新redis程序中的對(duì)應(yīng)的緩存標(biāo)志的incr值,既對(duì)緩存標(biāo)志進(jìn)行incr操作;
步驟4.3、將解析到的數(shù)據(jù)更新到redis程序中去,替換之前的數(shù)據(jù)。
本發(fā)明的有益效果是:
本發(fā)明通過(guò)基于redis隊(duì)列的功能、redis程序的incr命令、隊(duì)列中的數(shù)據(jù)內(nèi)容和數(shù)據(jù)標(biāo)識(shí)以及一個(gè)專門(mén)用來(lái)負(fù)責(zé)更新redis程序緩存的單線程定時(shí)更新程序,來(lái)保證redis程序中的數(shù)據(jù)與數(shù)據(jù)庫(kù)中的屬于保持一致,解決最終一致性的問(wèn)題。
附圖說(shuō)明
圖1為本發(fā)明實(shí)施例1的流程框圖;
圖2為本發(fā)明實(shí)施例2的流程框圖。
具體實(shí)施方式
下面結(jié)合附圖對(duì)本發(fā)明的實(shí)施例進(jìn)行詳細(xì)說(shuō)明。
實(shí)施例1
如圖1所示,一種緩存最終一致性更新方法,利用redis程序的隊(duì)列、redis程序的incr命令以及隊(duì)列中的數(shù)據(jù)內(nèi)容和數(shù)據(jù)標(biāo)識(shí),來(lái)保證數(shù)據(jù)庫(kù)中的數(shù)據(jù)和redis程序中的數(shù)據(jù)的最終一致性;具體包括:
1、業(yè)務(wù)系統(tǒng)需要對(duì)redis程序中的數(shù)據(jù)進(jìn)行修改時(shí),首先需要先從redis程序中獲取對(duì)應(yīng)的緩存標(biāo)志的當(dāng)前incr的值;
2、業(yè)務(wù)系統(tǒng)將需要更新的數(shù)據(jù)進(jìn)行拼裝,拼裝內(nèi)容緩存信息外,也應(yīng)當(dāng)包含incr值以及緩存內(nèi)容類型,然后對(duì)redis程序指定隊(duì)列進(jìn)行左入隊(duì)操作,既redis程序的lpush操作;
3、定時(shí)更新程序在定時(shí)任務(wù)觸發(fā)時(shí),負(fù)責(zé)對(duì)redis的指定隊(duì)列進(jìn)行右出隊(duì)操作,既redis程序的brpop操作;
4、如果redis程序的右出隊(duì)操作獲得的結(jié)果不為空,則進(jìn)行下列操作:
4.1、定時(shí)更新程序解析出隊(duì)操作獲得的結(jié)果,獲取對(duì)應(yīng)的緩存標(biāo)志的incr的值,判斷獲取的incr值和解析出來(lái)的結(jié)果的incr值是否一致,如果一致則說(shuō)明該數(shù)據(jù)屬于最新的數(shù)據(jù)庫(kù)數(shù)據(jù),則是屬于可以更新到redis程序緩存中的內(nèi)容;如果不一致,則說(shuō)明該數(shù)據(jù)不是最新的,則應(yīng)當(dāng)跳過(guò)該次更新;
4.2、當(dāng)數(shù)據(jù)是屬于應(yīng)當(dāng)被更新到redis程序中的緩存數(shù)據(jù)時(shí),在這一步驟中,會(huì)先更新redis程序中的對(duì)應(yīng)的緩存標(biāo)志的incr值,既對(duì)緩存標(biāo)志進(jìn)行incr操作。
4.3、將解析到的數(shù)據(jù)更新到redis程序中去,替換之前的數(shù)據(jù)
5、如果redis程序的右出隊(duì)操作獲得的結(jié)果為空,則定時(shí)更新程序的該次執(zhí)行結(jié)束,等待下一次喚醒。
實(shí)施例2
本實(shí)施例中的關(guān)鍵名稱包含如下:
a、incr_index_single_code:類型為single_code的緩存更新的incr值。
b、incr_index_flag:業(yè)務(wù)系統(tǒng)左入隊(duì)和定時(shí)更新程序右出列的redis程序的緩存key。
c、singlecodecachedto:用于incr_index_flag隊(duì)列中的數(shù)據(jù)格式,主要包含incr的值和相關(guān)的業(yè)務(wù)數(shù)據(jù),其中incr值,在下文中以incrnum表示。
d、incr_type_single_code:用于標(biāo)識(shí)緩存更新的類型。
下面結(jié)合圖2,對(duì)本實(shí)施例的步驟進(jìn)行進(jìn)一步說(shuō)明:
1、業(yè)務(wù)系統(tǒng)步驟:
1.1、業(yè)務(wù)系統(tǒng)發(fā)現(xiàn)要更新singcode的redis程序的緩存信息;
1.2、業(yè)務(wù)系統(tǒng)通過(guò)redis的get操作,獲取到key為incr_index_single_code的值incrnum,然后將incrnum放入到singlecodecachedto中,然后將incr_type_single_code也放入到singlecodecachedto中,并將singlecodecachedto通過(guò)redis程序的lpush命令將其左入隊(duì)到incr_index_flag隊(duì)列中。
2、定時(shí)更新程序步驟:
2.1、定時(shí)更新程序滿足定時(shí)任務(wù)配置,開(kāi)始啟動(dòng);
2.2、定時(shí)更新程序?qū)edis程序中的incr_index_flag隊(duì)列進(jìn)行右出隊(duì)操作,使用命令brpop命令,得到singlecodecachedto;
2.3、如果singlecodecachedto不為空:
2.3.1、在singlecodecachedto對(duì)象中獲取到緩存類型為incr_type_single_code確定是更新singlecode信息,然后根據(jù)incr_index_single_code作為key獲取到redis程序中的值;
2.3.2、從程序中取到的值與singlecodecachedto中的incrnum進(jìn)行比較;
2.3.2.1、如果incrnum與緩存中的值一致:
2.3.2.1.1、將singlecodecachedto中的業(yè)務(wù)信息更新到redis緩存中;
2.3.2.1.2、更新redis程序中incr_incex_single_code的值;
2.3.2.2、如果incrnum與緩存中的值不一致,值不一致,則說(shuō)明不是最新的數(shù)據(jù),跳過(guò)該次更新;程序重新開(kāi)始執(zhí)行本示例的第2.2步驟;
2.4、如果singlecodecachedto為空,則本次更新完畢,定時(shí)任務(wù)等待下次啟動(dòng)。
以上所述實(shí)施例僅表達(dá)了本發(fā)明的具體實(shí)施方式,其描述較為具體和詳細(xì),但并不能因此而理解為對(duì)本發(fā)明專利范圍的限制。應(yīng)當(dāng)指出的是,對(duì)于本領(lǐng)域的普通技術(shù)人員來(lái)說(shuō),在不脫離本發(fā)明構(gòu)思的前提下,還可以做出若干變形和改進(jìn),這些都屬于本發(fā)明的保護(hù)范圍。