本發(fā)明涉及數(shù)據(jù)庫(kù)技術(shù)領(lǐng)域,特別是涉及Storm中Redis Key技術(shù)領(lǐng)域,具體為一種Redis Key管理方法及系統(tǒng)。
背景技術(shù):
Storm是個(gè)實(shí)時(shí)的、分布式以及具備高容錯(cuò)的計(jì)算系統(tǒng)。同Hadoop一樣,Storm也可以處理大批量的數(shù)據(jù)。然而Storm在保證高可靠性的前提下還可以讓處理進(jìn)行的更加實(shí)時(shí);也就是說(shuō),所有的信息都會(huì)被處理。Storm同樣還具備容錯(cuò)和分布計(jì)算這些特性,這就讓Storm可以擴(kuò)展到不同的機(jī)器上進(jìn)行大批量的數(shù)據(jù)處理。
Redis是一個(gè)開(kāi)源的使用ANSI C語(yǔ)言編寫(xiě)、支持網(wǎng)絡(luò)、可基于內(nèi)存亦可持久化的日志型、Key-Value數(shù)據(jù)庫(kù),并提供多種語(yǔ)言的API。Redis是一個(gè)高性能的Key-value數(shù)據(jù)庫(kù),和Memcached類似,它支持存儲(chǔ)的value類型相對(duì)更多,包括string(字符串)、list(鏈表)、set(集合)、zset(sorted set--有序集合)和hash(哈希類型)。這些數(shù)據(jù)類型都支持push/pop、add/remove及取交集并集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎(chǔ)上,Redis支持各種不同方式的排序。與memcached一樣,為了保證效率,數(shù)據(jù)都是緩存在內(nèi)存中。區(qū)別的是Redis會(huì)周期性的把更新的數(shù)據(jù)寫(xiě)入磁盤(pán)或者把修改操作寫(xiě)入追加的記錄文件,并且在此基礎(chǔ)上實(shí)現(xiàn)了master-slave(主從)同步。
在Storm業(yè)務(wù)處理過(guò)程中,系統(tǒng)使用Redis進(jìn)行數(shù)據(jù)的計(jì)算,并將數(shù)據(jù)暫存在Redis中。Redis是以Key-value形式存儲(chǔ)的數(shù)據(jù)庫(kù),使得海量的計(jì)算結(jié)果也會(huì)伴隨著海量的Key。當(dāng)Redis中同時(shí)保存多個(gè)業(yè)務(wù)的數(shù)據(jù)時(shí),要從這樣的數(shù)據(jù)庫(kù)中找到下一個(gè)進(jìn)行處理的Redis Key就會(huì)異常困難。
技術(shù)實(shí)現(xiàn)要素:
鑒于以上所述現(xiàn)有技術(shù)的缺點(diǎn),本發(fā)明的目的在于提供一種Redis Key管理方法及系統(tǒng),用于解決現(xiàn)有技術(shù)中沒(méi)有對(duì)Redis Key進(jìn)行管控導(dǎo)致的難以快速查找到所需的Redis Key的問(wèn)題。
為實(shí)現(xiàn)上述目的及其他相關(guān)目的,本發(fā)明提供一種Redis Key管理方法,用于對(duì)流式框架中同一個(gè)業(yè)務(wù)產(chǎn)生的Redis Key的管理控制過(guò)程中,所述Redis Key管理方法包括:將相同業(yè)務(wù)產(chǎn)生的Redis Key封裝后保存至同一個(gè)數(shù)據(jù)桶內(nèi);對(duì)同一個(gè)數(shù)據(jù)桶內(nèi)的Redis Key進(jìn)行 去重處理以供外部數(shù)據(jù)調(diào)用;對(duì)外部數(shù)據(jù)調(diào)用后的Redis Key進(jìn)行批量刪除。
優(yōu)選地,以去重集合的數(shù)據(jù)類型將相同業(yè)務(wù)產(chǎn)生的Redis Key封裝后保存至同一個(gè)數(shù)據(jù)桶內(nèi)。
優(yōu)選地,所述對(duì)同一個(gè)數(shù)據(jù)桶內(nèi)的Redis Key進(jìn)行去重處理以供外部數(shù)據(jù)調(diào)用具體包括:定時(shí)從所述數(shù)據(jù)桶內(nèi)分割出包含預(yù)設(shè)個(gè)數(shù)的Redis Key的子集;對(duì)分割出的各所述子集進(jìn)行去重處理,使得各所述子集中不存在重復(fù)的Redis Key;對(duì)去重處理后的子集進(jìn)行標(biāo)記以供外部數(shù)據(jù)調(diào)用。
優(yōu)選地,利用lua腳本編程實(shí)現(xiàn)從所述數(shù)據(jù)桶內(nèi)分割出包含預(yù)設(shè)個(gè)數(shù)的Redis Key的子集并對(duì)分割出的各所述子集進(jìn)行去重處理,使得各所述子集中不存在重復(fù)的Redis Key;每次在達(dá)到預(yù)設(shè)的去重的間隔時(shí)間時(shí),執(zhí)行所述lua腳本。
優(yōu)選地,所述對(duì)外部數(shù)據(jù)調(diào)用后的Redis Key進(jìn)行批量刪除具體包括:記錄標(biāo)記的所述子集中被外部數(shù)據(jù)調(diào)用的Redis Key;定時(shí)判斷所述子集中所包含的Redis Key是否全部被外部數(shù)據(jù)調(diào)用過(guò),并在所述子集中包含的Redis Key全部被外部數(shù)據(jù)調(diào)用過(guò)時(shí),刪除所述子集中的所有Redis Key。
優(yōu)選地,所述對(duì)外部數(shù)據(jù)調(diào)用后的Redis Key進(jìn)行批量刪除進(jìn)一步包括:每次在達(dá)到預(yù)設(shè)的刪除的間隔時(shí)間時(shí),確定所述子集是否為預(yù)先標(biāo)記的可刪除狀態(tài),若是則進(jìn)一步確定所述子集的長(zhǎng)度值,在所述子集的長(zhǎng)度值為零或所述子集的長(zhǎng)度值與預(yù)先記錄的所述子集中被外部數(shù)據(jù)調(diào)用的Redis Key的個(gè)數(shù)值相等時(shí),刪除所述子集中的所有Redis Key。
優(yōu)選地,以數(shù)組形式記錄標(biāo)記的所述子集中被外部數(shù)據(jù)調(diào)用的Redis Key。
優(yōu)選地,采用Redis的pipeline方式來(lái)批量刪除Redis key。
為實(shí)現(xiàn)上述目的,本發(fā)明還提供一種Redis Key管理系統(tǒng),用于對(duì)流式框架中同一個(gè)業(yè)務(wù)產(chǎn)生的Redis Key的管理控制過(guò)程中,所述Redis Key管理系統(tǒng)包括:數(shù)據(jù)桶保存模塊,用于將相同業(yè)務(wù)產(chǎn)生的Redis Key封裝后保存至同一個(gè)數(shù)據(jù)桶內(nèi);數(shù)據(jù)去重模塊,與所述數(shù)據(jù)桶保存模塊相連,用于對(duì)同一個(gè)數(shù)據(jù)桶內(nèi)的Redis Key進(jìn)行去重處理以供外部數(shù)據(jù)調(diào)用;數(shù)據(jù)刪除模塊,與所述數(shù)據(jù)去重模塊相連,用于對(duì)外部數(shù)據(jù)調(diào)用后的Redis Key進(jìn)行批量刪除。
優(yōu)選地,所述數(shù)據(jù)桶保存模塊以去重集合的數(shù)據(jù)類型將相同業(yè)務(wù)產(chǎn)生的Redis Key封裝后保存至同一個(gè)數(shù)據(jù)桶內(nèi)。
優(yōu)選地,所述數(shù)據(jù)去重模塊具體包括:子集分割單元,用于定時(shí)從所述數(shù)據(jù)桶內(nèi)分割出包含預(yù)設(shè)個(gè)數(shù)的Redis Key的子集;分割定時(shí)單元,與所述子集分割單元相連,用于設(shè)置所述子集分割單元每次執(zhí)行的間隔時(shí)間;去重處理單元,分別與所述子集分割單元和所述分割 定時(shí)單元相連,用于對(duì)分割出的各所述子集進(jìn)行去重處理,使得各所述子集中不存在重復(fù)的Redis Key;子集標(biāo)記單元,與所述去重處理單元相連,用于對(duì)去重處理后的子集進(jìn)行標(biāo)記以供外部數(shù)據(jù)調(diào)用。
優(yōu)選地,所述子集分割單元、所述定時(shí)單元以及所述去重處理單元利用lua腳本編程實(shí)現(xiàn),每次在達(dá)到預(yù)設(shè)的去重的間隔時(shí)間時(shí),執(zhí)行所述lua腳本。
優(yōu)選地,所述數(shù)據(jù)刪除模塊具體包括:記錄單元,與所述子集標(biāo)記單元相連,用于記錄標(biāo)記的所述子集中被外部數(shù)據(jù)調(diào)用的Redis Key;判斷單元,分別與所述子集標(biāo)記單元、所述記錄單元以及所述刪除定時(shí)單元相連,用于判斷所述所述子集中包含的Redis Key是否全部被外部數(shù)據(jù)調(diào)用過(guò);刪除定時(shí)單元,與所述判斷單元相連,用于設(shè)置所述判斷單元每次執(zhí)行的間隔時(shí)間;刪除單元,與所述判斷單元相連,在所述子集中包含的Redis Key全部被外部數(shù)據(jù)調(diào)用過(guò)時(shí),刪除所述子集中的所有Redis Key。
優(yōu)選地,所述判斷單元進(jìn)一步包括:刪除狀態(tài)判斷子單元,用于每次在達(dá)到預(yù)設(shè)的刪除的間隔時(shí)間時(shí),確定所述子集是否為預(yù)先標(biāo)記的可刪除狀態(tài);長(zhǎng)度值判斷子單元,與所述刪除狀態(tài)判斷子單元相連,用于在所述子集為預(yù)先標(biāo)記的可刪除狀態(tài)時(shí)確定所述子集的長(zhǎng)度值是否為零或所述子集的長(zhǎng)度值與預(yù)先記錄的所述子集中被外部數(shù)據(jù)調(diào)用的Redis Key的個(gè)數(shù)值是否相等;在所述子集的長(zhǎng)度值為零或所述子集的長(zhǎng)度值與預(yù)先記錄的所述子集中被外部數(shù)據(jù)調(diào)用的Redis Key的個(gè)數(shù)值相等時(shí),由所述刪除單元?jiǎng)h除所述子集中的所有Redis Key。
優(yōu)選地,所述記錄單元以數(shù)組形式記錄標(biāo)記的所述子集中被外部數(shù)據(jù)調(diào)用的Redis Key。
優(yōu)選地,所述刪除單元采用Redis的pipeline方式來(lái)批量刪除Redis key。
如上所述,本發(fā)明的一種Redis Key管理方法及系統(tǒng),具有以下有益效果:
1、本發(fā)明將同一個(gè)業(yè)務(wù)中的,位于同一分區(qū)中的Redis Key使用數(shù)據(jù)桶(Key bucket)進(jìn)行保存,可以根據(jù)業(yè)務(wù)標(biāo)識(shí)以及分區(qū)定位數(shù)據(jù)桶,對(duì)同一個(gè)數(shù)據(jù)桶內(nèi)的Redis Key進(jìn)行去重處理以供外部數(shù)據(jù)調(diào)用并對(duì)外部數(shù)據(jù)調(diào)用后的Redis Key進(jìn)行批量刪除,有效對(duì)Redis中Key進(jìn)行管控,快速查找到所需的Redis Key,有效解決了現(xiàn)有技術(shù)中Redis中Key的混亂局面。
2、本發(fā)明通過(guò)去重集合的數(shù)據(jù)類型將相同業(yè)務(wù)產(chǎn)生的Redis Key封裝后保存至同一個(gè)數(shù)據(jù)桶內(nèi),將Redis Key的唯一性由內(nèi)存進(jìn)行維護(hù),可以避免在Redis Key在保存至數(shù)據(jù)桶時(shí)存在重復(fù)的情況,保證Redis Key的唯一性,提高去重處理的速度,提高管理性能。
3、本發(fā)明利用lua腳本進(jìn)行去重操作,可以避免使用其他方式進(jìn)行去重時(shí)速度緩慢的情況,可以避免編程過(guò)程中的復(fù)雜邏輯,編程更為簡(jiǎn)單。
4、本發(fā)明對(duì)Redis Key使用批量刪除,可以減少Redis的客戶端與服務(wù)器交互過(guò)程中的 rtt(round-trip time:往返時(shí)延)。
附圖說(shuō)明
圖1顯示為本發(fā)明的Redis Key管理方法的流程示意圖。
圖2顯示為本發(fā)明的Redis Key管理方法中Storm的業(yè)務(wù)處理架構(gòu)圖。
圖3顯示為本發(fā)明的Redis Key管理方法中數(shù)據(jù)保存至Redis的示意圖。
圖4顯示為本發(fā)明的Redis Key管理方法中Key去重處理的示意圖。
圖5顯示為本發(fā)明的Redis Key管理方法中Key批量刪除的示意圖。
圖6顯示為本發(fā)明的Redis Key管理方法中數(shù)據(jù)保存至Hbase的示意圖。
圖7顯示為本發(fā)明的Redis Key管理系統(tǒng)的整體結(jié)構(gòu)示意圖。
圖8顯示為本發(fā)明的Redis Key管理系統(tǒng)中數(shù)據(jù)去重模塊的結(jié)構(gòu)示意圖。
圖9顯示為本發(fā)明的Redis Key管理系統(tǒng)中數(shù)據(jù)刪除模塊的結(jié)構(gòu)示意圖。
圖10顯示為本發(fā)明的Redis Key管理系統(tǒng)中判斷單元的結(jié)構(gòu)示意圖。
元件標(biāo)號(hào)說(shuō)明
1 Redis Key管理系統(tǒng)
11 數(shù)據(jù)桶保存模塊
12 數(shù)據(jù)去重模塊
121 子集分割單元
122 分割定時(shí)單元
123 去重處理單元
124 子集標(biāo)記單元
13 數(shù)據(jù)刪除模塊
131 記錄單元
132 判斷單元
132a 刪除狀態(tài)判斷子單元
132b 長(zhǎng)度值判斷子單元
133 刪除定時(shí)單元
134 刪除單元
S1~S3 步驟
具體實(shí)施方式
以下通過(guò)特定的具體實(shí)例說(shuō)明本發(fā)明的實(shí)施方式,本領(lǐng)域技術(shù)人員可由本說(shuō)明書(shū)所揭露的內(nèi)容輕易地了解本發(fā)明的其他優(yōu)點(diǎn)與功效。本發(fā)明還可以通過(guò)另外不同的具體實(shí)施方式加以實(shí)施或應(yīng)用,本說(shuō)明書(shū)中的各項(xiàng)細(xì)節(jié)也可以基于不同觀點(diǎn)與應(yīng)用,在沒(méi)有背離本發(fā)明的精神下進(jìn)行各種修飾或改變。
在Storm業(yè)務(wù)處理過(guò)程中,系統(tǒng)使用redis進(jìn)行數(shù)據(jù)的計(jì)算,并將數(shù)據(jù)暫存在redis中。redis是的key-value存儲(chǔ)形式,使得海量的計(jì)算結(jié)果也會(huì)伴隨著海量的key。當(dāng)redis中同時(shí)保存多個(gè)業(yè)務(wù)的數(shù)據(jù)時(shí),要從這樣的數(shù)據(jù)庫(kù)中找到下一個(gè)進(jìn)行處理的redis key就會(huì)異常困難。本實(shí)施例的目的在于提供一種Redis Key管理方法及系統(tǒng),用于解決現(xiàn)有技術(shù)中沒(méi)有對(duì)Redis Key進(jìn)行管控導(dǎo)致的難以快速查找到所需的Redis Key的問(wèn)題。以下將詳細(xì)闡述本實(shí)施例的一種Redis Key管理方法及系統(tǒng)的原理及實(shí)施方式,使本領(lǐng)域技術(shù)人員不需要?jiǎng)?chuàng)造性勞動(dòng)即可理解本實(shí)施例的一種Redis Key管理方法及系統(tǒng)。
如圖1至圖10所示,本實(shí)施例提供一種Redis Key管理方法及系統(tǒng),涉及流式框架(例如Storm,為說(shuō)明方便,本實(shí)施例中均以流式框架為Storm為例進(jìn)行說(shuō)明)在復(fù)雜業(yè)務(wù)場(chǎng)景中Redis Key的處理,尤其涉及Redis Key的去重及刪除的處理。本實(shí)施例提供的一種Redis Key管理方法及系統(tǒng)中提出采用Key bucket(數(shù)據(jù)桶)的概念,將同一個(gè)業(yè)務(wù)產(chǎn)生的Redis Key進(jìn)行統(tǒng)一管理,方便系統(tǒng)對(duì)相關(guān)業(yè)務(wù)中Redis Key的使用,采用更為高效的方式,實(shí)現(xiàn)對(duì)Redis Key進(jìn)行去重處理并在Redis Key使用結(jié)束后,將Key從Redis中刪除。
具體地,如圖1所示,本實(shí)施例提供一種Redis Key管理方法,用于對(duì)流式框架中同一個(gè)業(yè)務(wù)產(chǎn)生的Redis Key的管理控制過(guò)程中,所述Redis Key管理方法包括以下步驟。
步驟S1,將相同業(yè)務(wù)產(chǎn)生的Redis Key封裝后保存至同一個(gè)數(shù)據(jù)桶內(nèi)。
本實(shí)施例提出數(shù)據(jù)桶(key bucket)的概念,統(tǒng)一管理同一個(gè)業(yè)務(wù)產(chǎn)生的redis key,可以根據(jù)業(yè)務(wù)標(biāo)識(shí)以及分區(qū)定位數(shù)據(jù)桶,對(duì)同一個(gè)數(shù)據(jù)桶內(nèi)的Redis Key進(jìn)行去重處理以供外部數(shù)據(jù)調(diào)用并對(duì)外部數(shù)據(jù)調(diào)用后的Redis Key進(jìn)行批量刪除,有效對(duì)Redis中Key進(jìn)行管控,快速查找到所需的Redis Key,有效解決現(xiàn)有技術(shù)中Redis中Key的混亂局面。
具體地,于本實(shí)施例中,以去重集合的數(shù)據(jù)類型將相同業(yè)務(wù)產(chǎn)生的Redis Key封裝后保存至同一個(gè)數(shù)據(jù)桶內(nèi)。例如,Storm在將數(shù)據(jù)保存至Redis數(shù)據(jù)庫(kù)時(shí),將同一個(gè)業(yè)務(wù)中產(chǎn)生的且位于同一分區(qū)中的Redis Key以set數(shù)據(jù)類型的形式保存至Key bucket內(nèi)。通過(guò)去重集合的數(shù)據(jù)類型將相同業(yè)務(wù)產(chǎn)生的Redis Key封裝后保存至同一個(gè)數(shù)據(jù)桶內(nèi),將Redis Key的唯一性由內(nèi)存進(jìn)行維護(hù),可以避免在Redis Key在保存至數(shù)據(jù)桶時(shí)存在重復(fù)的情況,保證Redis Key 的唯一性,提高去重處理的速度,提高管理性能。
其中,于本實(shí)施例中,Storm業(yè)務(wù)處理架構(gòu)圖如圖2所示。Storm讀取數(shù)據(jù)后會(huì)分別將數(shù)據(jù)保存至Redis數(shù)據(jù)庫(kù)和Hbase數(shù)據(jù)庫(kù)。
具體地,如圖3所示,Storm在將數(shù)據(jù)保存至Redis數(shù)據(jù)庫(kù)時(shí),將同一個(gè)業(yè)務(wù)中產(chǎn)生的且位于同一分區(qū)中的Redis Key以set數(shù)據(jù)類型的形式保存至Key bucket內(nèi),具體包括:Storm讀取數(shù)據(jù),然后Storm將所述數(shù)據(jù)中同一個(gè)業(yè)務(wù)中產(chǎn)生的且位于同一分區(qū)中的Redis Key封裝,之后,Storm將封裝后的Redis Key以set的形式保存在Key bucket中,Storm將所述數(shù)據(jù)保存至Redis數(shù)據(jù)庫(kù)。
步驟S2,對(duì)同一個(gè)數(shù)據(jù)桶內(nèi)的Redis Key進(jìn)行去重處理以供外部數(shù)據(jù)調(diào)用。
具體地,于本實(shí)施例中,所述對(duì)同一個(gè)數(shù)據(jù)桶內(nèi)的Redis Key進(jìn)行去重處理以供外部數(shù)據(jù)調(diào)用具體包括:定時(shí)從所述數(shù)據(jù)桶內(nèi)分割出包含預(yù)設(shè)個(gè)數(shù)的Redis Key的子集,然后對(duì)分割出的各所述子集進(jìn)行去重處理,使得各所述子集中不存在重復(fù)的Redis Key,最后對(duì)去重處理后的子集進(jìn)行標(biāo)記以供外部數(shù)據(jù)調(diào)用。
于本實(shí)施例中,具體地,利用lua腳本編程實(shí)現(xiàn)從所述數(shù)據(jù)桶內(nèi)分割出包含預(yù)設(shè)個(gè)數(shù)的Redis Key的子集并對(duì)分割出的各所述子集進(jìn)行去重處理,使得各所述子集中不存在重復(fù)的Redis Key,每次在達(dá)到預(yù)設(shè)的去重的間隔時(shí)間時(shí),執(zhí)行所述lua腳本。在lua腳本中,定時(shí)從set中取出某個(gè)長(zhǎng)度(該長(zhǎng)度根據(jù)具體業(yè)務(wù)產(chǎn)生的日志量進(jìn)行設(shè)定)的小set(子集),保證在子集與子集中不存在重復(fù)的Key,并有利于后續(xù)Redis Key的處理。利用lua腳本進(jìn)行去重操作,可以避免使用其他方式進(jìn)行去重時(shí)速度緩慢的情況,而且可以避免編程過(guò)程中的復(fù)雜邏輯,編程更為簡(jiǎn)單。
具體地,于本實(shí)施例中,如圖4所示,每次在達(dá)到預(yù)設(shè)的去重的間隔時(shí)間時(shí),為分割后的子集創(chuàng)建名稱(即為Key bucket內(nèi)分割后的子集創(chuàng)建新的Redis Key)并執(zhí)行l(wèi)ua腳本,再次從Key bucket內(nèi)分割出預(yù)設(shè)長(zhǎng)度的子集。其中,預(yù)設(shè)的去重的間隔時(shí)間為10s~50s。于本實(shí)施例中,具體選用30s的去重的間隔時(shí)間。
具體在實(shí)施步驟S2時(shí),可以設(shè)置一個(gè)用于去重操作的線程,Storm啟動(dòng)該線程,判斷去重的間隔時(shí)間是否大于30s,若是,則進(jìn)行去重操作;否則繼續(xù)下一個(gè)循環(huán)。接著,根據(jù)Key bucket的RedisKey,為分割后的子集(rotating)創(chuàng)建newRedisKey(子集名稱),然后執(zhí)行l(wèi)ua腳本,從Key bucket上分割出某個(gè)長(zhǎng)度(長(zhǎng)度根據(jù)業(yè)務(wù)進(jìn)行設(shè)置)的子集(rotating)。
步驟S3,對(duì)外部數(shù)據(jù)調(diào)用后的Redis Key進(jìn)行批量刪除。
具體地,于本實(shí)施例中,所述對(duì)外部數(shù)據(jù)調(diào)用后的Redis Key進(jìn)行批量刪除具體包括: 記錄標(biāo)記的所述子集中被外部數(shù)據(jù)調(diào)用的Redis Key,其中,于本實(shí)施例中,以數(shù)組形式(例如segment)記錄標(biāo)記的所述子集中被外部數(shù)據(jù)調(diào)用的Redis Key,然后,定時(shí)判斷所述子集中所包含的Redis Key是否全部被外部數(shù)據(jù)調(diào)用過(guò),并在所述子集中包含的Redis Key全部被外部數(shù)據(jù)調(diào)用過(guò)時(shí),刪除所述子集中的所有Redis Key,其中,采用Redis的pipeline方式來(lái)批量刪除Redis key。
更進(jìn)一步地,如圖5所示,所述對(duì)外部數(shù)據(jù)調(diào)用后的Redis Key進(jìn)行批量刪除進(jìn)一步包括:每次在達(dá)到預(yù)設(shè)的刪除的間隔時(shí)間時(shí),確定所述子集是否為預(yù)先標(biāo)記的可刪除狀態(tài),若是則進(jìn)一步確定所述子集的長(zhǎng)度值,在所述子集的長(zhǎng)度值為零或所述子集的長(zhǎng)度值與預(yù)先記錄的所述子集中被外部數(shù)據(jù)調(diào)用的Redis Key的個(gè)數(shù)值相等時(shí),采用Redis的pipeline方式來(lái)批刪除所述子集中的所有Redis Key。其中,預(yù)設(shè)的刪除的間隔時(shí)間為0.1s~5s。于本實(shí)施例中,具體選用1s的刪除的間隔時(shí)間。
于本實(shí)施例中,如圖6所示,在對(duì)各子集進(jìn)行去重操作后,Storm將數(shù)據(jù)保存至Hbase數(shù)據(jù)庫(kù)中,并利用所述Key bucket對(duì)所述Redis Key進(jìn)行處理。
具體地,于本實(shí)施例中,如圖6所示,在步驟S3中,Storm根據(jù)業(yè)務(wù)的標(biāo)識(shí)和數(shù)據(jù)保存Redis的分區(qū)確定Redis Key所在的Key bucket,然后Key bucket根據(jù)子集(rotating)的狀態(tài)(分為active和deleting),確定可以進(jìn)行處理的子集(rotating),然后Key bucket將子集子集(rotating)中可進(jìn)行處理的Key放入nextKeys(確定可以處理的子集的名稱),Key bucket使用segment記錄子集子集(rotating)中進(jìn)行處理的Key的個(gè)數(shù),最后Storm將數(shù)據(jù)保存Hbase數(shù)據(jù)庫(kù)。
具體地,于本實(shí)施例中,如圖5所示,每次在達(dá)到預(yù)設(shè)的刪除的間隔時(shí)間時(shí),確定所述子集是否為預(yù)先標(biāo)記的可刪除狀態(tài),若所述子集處在可刪除狀態(tài),則繼續(xù)判斷所述子集的長(zhǎng)度是否為0,在所述子集的長(zhǎng)度值為0時(shí),采用Redis的pipeline方式來(lái)批量刪除所述子集中所有的Key。若所述子集的長(zhǎng)度值不為0,則繼續(xù)判斷所述子集的長(zhǎng)度與所述segment記錄的子集進(jìn)行處理的Key的個(gè)數(shù)是否相等,在所述子集的長(zhǎng)度與所述segment記錄的子集進(jìn)行處理的Key的個(gè)數(shù)相等時(shí)采用Redis的pipeline方式來(lái)批量刪除所述子集中所有的Key。
具體實(shí)施步驟S3時(shí),可以設(shè)置一個(gè)用于批量刪除操作的線程,Storm啟動(dòng)該線程,判斷delete的間隔時(shí)間是否大于1s,若是,則刪除,否則繼續(xù)下一個(gè)循環(huán);在Key bucket中循環(huán),判斷子集(rotating)是否可以刪除,然后判斷子集(rotating)是否處于active狀態(tài),若是,則繼續(xù)下一個(gè)循環(huán),接著進(jìn)一步判斷子集(rotating)的長(zhǎng)度是否為0,若是,則使用Redis的pipeline方式,批量刪除該子集(rotating)中的所有Key;若判斷子集(rotating)的長(zhǎng)度 不為0,則計(jì)算在segment中記錄的當(dāng)前子集(rotating)中Key使用的數(shù)量size,并判斷Key使用的數(shù)量size是否等于子集(rotating)的長(zhǎng)度,若是,則使用Redis的pipeline方式,批量刪除該子集(rotating)中的所有Key,若否,則繼續(xù)下一個(gè)循環(huán)。也就是說(shuō),可以對(duì)子集中已使用的Redis Key進(jìn)行計(jì)數(shù),當(dāng)使用的Redis Key個(gè)數(shù)與子集的長(zhǎng)度相同時(shí),將該子集中的Redis Key批量刪除,采用這樣的方式可以大大提高系統(tǒng)的效率。此外,Redis Key使用批量刪除,這個(gè)過(guò)程可以減少Redis的client與server交互過(guò)程中的rtt(round-trip time:往返時(shí)延)。
為實(shí)現(xiàn)本實(shí)施例中的一種Redis Key管理方法,本實(shí)施例還提供一種Redis Key管理系統(tǒng),用用于對(duì)流式框架中同一個(gè)業(yè)務(wù)產(chǎn)生的Redis Key的管理控制過(guò)程中,具體地,如圖7所示,所述Redis Key管理系統(tǒng)1包括:數(shù)據(jù)桶保存模塊11,數(shù)據(jù)去重模塊12以及數(shù)據(jù)刪除模塊13。
于本實(shí)施例中,所述數(shù)據(jù)桶保存模塊11用于將相同業(yè)務(wù)產(chǎn)生的Redis Key封裝后保存至同一個(gè)數(shù)據(jù)桶內(nèi)。
本實(shí)施例提出數(shù)據(jù)桶(key bucket)的概念,統(tǒng)一管理同一個(gè)業(yè)務(wù)產(chǎn)生的redis key,可以根據(jù)業(yè)務(wù)標(biāo)識(shí)以及分區(qū)定位數(shù)據(jù)桶,對(duì)同一個(gè)數(shù)據(jù)桶內(nèi)的Redis Key進(jìn)行去重處理以供外部數(shù)據(jù)調(diào)用并對(duì)外部數(shù)據(jù)調(diào)用后的Redis Key進(jìn)行批量刪除,有效對(duì)Redis中Key進(jìn)行管控,快速查找到所需的Redis Key,有效解決現(xiàn)有技術(shù)中Redis中Key的混亂局面。
具體地,于本實(shí)施例中,所述數(shù)據(jù)桶保存模塊11以去重集合的數(shù)據(jù)類型將相同業(yè)務(wù)產(chǎn)生的Redis Key封裝后保存至同一個(gè)數(shù)據(jù)桶內(nèi)。例如,Storm在將數(shù)據(jù)保存至Redis數(shù)據(jù)庫(kù)時(shí),所述數(shù)據(jù)桶保存模塊11將同一個(gè)業(yè)務(wù)中產(chǎn)生的且位于同一分區(qū)中的Redis Key以set數(shù)據(jù)類型的形式保存至Key bucket內(nèi)。通過(guò)去重集合的數(shù)據(jù)類型將相同業(yè)務(wù)產(chǎn)生的Redis Key封裝后保存至同一個(gè)數(shù)據(jù)桶內(nèi),將Redis Key的唯一性由內(nèi)存進(jìn)行維護(hù),可以避免在Redis Key在保存至數(shù)據(jù)桶時(shí)存在重復(fù)的情況,保證Redis Key的唯一性,提高去重處理的速度,提高管理性能。
其中,于本實(shí)施例中,Storm業(yè)務(wù)處理架構(gòu)圖如圖2所示。Storm讀取數(shù)據(jù)后會(huì)分別將數(shù)據(jù)保存至Redis數(shù)據(jù)庫(kù)和Hbase數(shù)據(jù)庫(kù)。
具體地,如圖3所示,Storm在將數(shù)據(jù)保存至Redis數(shù)據(jù)庫(kù)時(shí),所述數(shù)據(jù)桶保存模塊11將同一個(gè)業(yè)務(wù)中產(chǎn)生的且位于同一分區(qū)中的Redis Key以set數(shù)據(jù)類型的形式保存至Key bucket內(nèi),具體包括:Storm讀取數(shù)據(jù),然后所述數(shù)據(jù)桶保存模塊11將所述數(shù)據(jù)中同一個(gè)業(yè)務(wù)中產(chǎn)生的且位于同一分區(qū)中的Redis Key封裝之后將封裝后的Redis Key以set的形式保存 在Key bucket中,這樣,Storm將所述數(shù)據(jù)保存至Redis數(shù)據(jù)庫(kù)。
于本實(shí)施例中,所述數(shù)據(jù)去重模塊12與所述數(shù)據(jù)桶保存模塊11相連,用于對(duì)同一個(gè)數(shù)據(jù)桶內(nèi)的Redis Key進(jìn)行去重處理以供外部數(shù)據(jù)調(diào)用。
具體地,于本實(shí)施例中,如圖8所示,所述數(shù)據(jù)去重模塊12具體包括:子集分割單元121,分割定時(shí)單元122,去重處理單元123以及子集標(biāo)記單元124。
于本實(shí)施例中,所述子集分割單元121用于定時(shí)從所述數(shù)據(jù)桶內(nèi)分割出包含預(yù)設(shè)個(gè)數(shù)的Redis Key的子集;所述分割定時(shí)單元122與所述子集分割單元121相連,用于設(shè)置所述子集分割單元121每次執(zhí)行的間隔時(shí)間,其中,其中,預(yù)設(shè)的去重的間隔時(shí)間為10s~50s。于本實(shí)施例中,具體選用30s的去重的間隔時(shí)間;所述去重處理單元123分別與所述子集分割單元121和所述分割定時(shí)單元122相連,用于對(duì)分割出的各所述子集進(jìn)行去重處理,使得各所述子集中不存在重復(fù)的Redis Key;所述子集標(biāo)記單元124與所述去重處理單元123相連,用于對(duì)去重處理后的子集進(jìn)行標(biāo)記以供外部數(shù)據(jù)調(diào)用。
具體地,于本實(shí)施例中,利用所述分割定時(shí)單元122定時(shí)使得所述子集分割單元121按一定間隔時(shí)間從所述數(shù)據(jù)桶內(nèi)分割出包含預(yù)設(shè)個(gè)數(shù)的Redis Key的子集,然后所述去重處理單元123對(duì)分割出的各所述子集進(jìn)行去重處理,使得各所述子集中不存在重復(fù)的Redis Key,最后所述子集標(biāo)記單元124對(duì)去重處理后的子集進(jìn)行標(biāo)記以供外部數(shù)據(jù)調(diào)用。
于本實(shí)施例中,所述子集分割單元121、所述定時(shí)單元以及所述去重處理單元123利用lua腳本編程實(shí)現(xiàn),每次在達(dá)到預(yù)設(shè)的去重的間隔時(shí)間時(shí),執(zhí)行所述lua腳本。
具體地,利用lua腳本編程實(shí)現(xiàn)從所述數(shù)據(jù)桶內(nèi)分割出包含預(yù)設(shè)個(gè)數(shù)的Redis Key的子集并對(duì)分割出的各所述子集進(jìn)行去重處理,使得各所述子集中不存在重復(fù)的Redis Key,每次在達(dá)到預(yù)設(shè)的去重的間隔時(shí)間時(shí),執(zhí)行所述lua腳本。在lua腳本中,定時(shí)從set中取出某個(gè)長(zhǎng)度(該長(zhǎng)度根據(jù)具體業(yè)務(wù)產(chǎn)生的日志量進(jìn)行設(shè)定)的小set(子集),保證在子集與子集中不存在重復(fù)的Key,并有利于后續(xù)Redis Key的處理。利用lua腳本進(jìn)行去重操作,可以避免使用其他方式進(jìn)行去重時(shí)速度緩慢的情況,而且可以避免編程過(guò)程中的復(fù)雜邏輯,編程更為簡(jiǎn)單。
具體地,于本實(shí)施例中,如圖4所示,每次在達(dá)到所述分割定時(shí)單元122預(yù)設(shè)的去重的間隔時(shí)間時(shí),為分割后的子集創(chuàng)建名稱(即為Key bucket內(nèi)分割后的子集創(chuàng)建新的Redis Key)并執(zhí)行l(wèi)ua腳本進(jìn)行去重處理,再次從Key bucket內(nèi)分割出預(yù)設(shè)長(zhǎng)度的子集。
具體在實(shí)施時(shí),可以設(shè)置一個(gè)用于去重操作的線程,Storm啟動(dòng)該線程,判斷去重的間隔時(shí)間是否大于30s,若是,則進(jìn)行去重操作;否則繼續(xù)下一個(gè)循環(huán)。接著,根據(jù)Key bucket的RedisKey,為分割后的子集(rotating)創(chuàng)建newRedisKey(子集名稱),然后執(zhí)行l(wèi)ua腳本, 從Key bucket上分割出某個(gè)長(zhǎng)度(長(zhǎng)度根據(jù)業(yè)務(wù)進(jìn)行設(shè)置)的子集(rotating)。
于本實(shí)施例中,所述數(shù)據(jù)刪除模塊13與所述數(shù)據(jù)去重模塊12相連,用于對(duì)外部數(shù)據(jù)調(diào)用后的Redis Key進(jìn)行批量刪除。
具體地,于本實(shí)施例中,如圖9所示,所述數(shù)據(jù)刪除模塊13具體包括:記錄單元131,判斷單元132,刪除定時(shí)單元133以及刪除單元134。
于本實(shí)施例中,所述記錄單元131與所述子集標(biāo)記單元124相連,用于記錄標(biāo)記的所述子集中被外部數(shù)據(jù)調(diào)用的Redis Key,其中,于本實(shí)施例中,所述記錄單元131以數(shù)組形式記錄標(biāo)記的所述子集中被外部數(shù)據(jù)調(diào)用的Redis Key。所述判斷單元132分別與所述子集標(biāo)記單元124、所述記錄單元131以及所述刪除定時(shí)單元133相連,用于判斷所述所述子集中包含的Redis Key是否全部被外部數(shù)據(jù)調(diào)用過(guò);所述刪除定時(shí)單元133與所述判斷單元132相連,用于設(shè)置所述判斷單元132每次執(zhí)行的間隔時(shí)間,其中,預(yù)設(shè)的刪除的間隔時(shí)間為0.1s~5s。于本實(shí)施例中,具體選用1s的刪除的間隔時(shí)間;所述刪除單元134與所述判斷單元132相連,在所述子集中包含的Redis Key全部被外部數(shù)據(jù)調(diào)用過(guò)時(shí),刪除所述子集中的所有Redis Key。
于本實(shí)施例中,具體地,如圖10所示,所述判斷單元132進(jìn)一步包括:刪除狀態(tài)判斷子單元132a和長(zhǎng)度值判斷子單元132b。
具體地,于本實(shí)施例中,所述刪除狀態(tài)判斷子單元132a用于每次在達(dá)到預(yù)設(shè)的刪除的間隔時(shí)間時(shí),確定所述子集是否為預(yù)先標(biāo)記的可刪除狀態(tài)。所述長(zhǎng)度值判斷子單元132b與所述刪除狀態(tài)判斷子單元132a相連,用于在所述子集為預(yù)先標(biāo)記的可刪除狀態(tài)時(shí)確定所述子集的長(zhǎng)度值是否為零或所述子集的長(zhǎng)度值與預(yù)先記錄的所述子集中被外部數(shù)據(jù)調(diào)用的Redis Key的個(gè)數(shù)值是否相等。
在所述子集的長(zhǎng)度值為零或所述子集的長(zhǎng)度值與預(yù)先記錄的所述子集中被外部數(shù)據(jù)調(diào)用的Redis Key的個(gè)數(shù)值相等時(shí),由所述刪除單元134采用Redis的pipeline方式來(lái)批量刪除所述子集中的所有Redis Key。
具體地,于本實(shí)施例中,每次在達(dá)到所述刪除定時(shí)單元133預(yù)設(shè)的刪除的間隔時(shí)間時(shí),所述判斷單元132確定所述子集是否為預(yù)先標(biāo)記的可刪除狀態(tài),若所述子集處在可刪除狀態(tài),則所述長(zhǎng)度值判斷子單元132b繼續(xù)判斷所述子集的長(zhǎng)度是否為0,在所述子集的長(zhǎng)度值為0時(shí),所述刪除單元134采用Redis的pipeline方式來(lái)批批量刪除所述子集中所有的Key。若所述長(zhǎng)度值判斷子單元132b判斷所述子集的長(zhǎng)度值不為0,則所述長(zhǎng)度值判斷子單元132b繼續(xù)判斷所述子集的長(zhǎng)度與所述segment記錄的子集進(jìn)行處理的Key的個(gè)數(shù)是否相等,在所述子集的長(zhǎng)度與所述segment記錄的子集進(jìn)行處理的Key的個(gè)數(shù)相等時(shí),由所述刪除單元134 采用Redis的pipeline方式來(lái)批量刪除所述子集中所有的Key。
具體地,可以設(shè)置一個(gè)用于批量刪除操作的線程,Storm啟動(dòng)該線程,所述刪除定時(shí)單元133判斷delete的間隔時(shí)間是否大于1s,若是,則繼續(xù)執(zhí)行刪除,否則繼續(xù)下一個(gè)循環(huán);在Key bucket中循環(huán),所述刪除狀態(tài)判斷子單元132a判斷子集(rotating)是否可以刪除,即判斷子集(rotating)是否處于active狀態(tài),若是,則繼續(xù)下一個(gè)循環(huán),接著所述判斷單元132進(jìn)一步判斷子集(rotating)的長(zhǎng)度是否為0,若是,則使用Redis的pipeline方式,批量刪除該子集(rotating)中的所有Key;若判斷子集(rotating)的長(zhǎng)度不為0,則計(jì)算在segment中記錄的當(dāng)前子集(rotating)中Key使用的數(shù)量size,并判斷Key使用的數(shù)量size是否等于子集(rotating)的長(zhǎng)度,若是,則使用Redis的pipeline方式,批量刪除該子集(rotating)中的所有Key,若否,則繼續(xù)下一個(gè)循環(huán)。也就是說(shuō),可以對(duì)子集中已使用的Redis Key進(jìn)行計(jì)數(shù),當(dāng)使用的Redis Key個(gè)數(shù)與子集的長(zhǎng)度相同時(shí),將該子集中的Redis Key批量刪除,采用這樣的方式可以大大提高系統(tǒng)的效率。此外,Redis Key使用批量刪除,這個(gè)過(guò)程可以減少Redis的client與server交互過(guò)程中的rtt(round-trip time:往返時(shí)延)。
綜上所述,本發(fā)明將同一個(gè)業(yè)務(wù)中的,位于同一分區(qū)中的Redis Key使用數(shù)據(jù)桶(Key bucket)進(jìn)行保存,可以根據(jù)業(yè)務(wù)標(biāo)識(shí)以及分區(qū)定位數(shù)據(jù)桶,對(duì)同一個(gè)數(shù)據(jù)桶內(nèi)的Redis Key進(jìn)行去重處理以供外部數(shù)據(jù)調(diào)用并對(duì)外部數(shù)據(jù)調(diào)用后的Redis Key進(jìn)行批量刪除,有效對(duì)Redis中Key進(jìn)行管控,快速查找到所需的Redis Key,有效解決了現(xiàn)有技術(shù)中Redis中Key的混亂局面;本發(fā)明通過(guò)去重集合的數(shù)據(jù)類型將相同業(yè)務(wù)產(chǎn)生的Redis Key封裝后保存至同一個(gè)數(shù)據(jù)桶內(nèi),將Redis Key的唯一性由內(nèi)存進(jìn)行維護(hù),可以避免在Redis Key在保存至數(shù)據(jù)桶時(shí)存在重復(fù)的情況,保證Redis Key的唯一性,提高去重處理的速度,提高管理性能;本發(fā)明利用lua腳本進(jìn)行去重操作,可以避免使用其他方式進(jìn)行去重時(shí)速度緩慢的情況,可以避免編程過(guò)程中的復(fù)雜邏輯,編程更為簡(jiǎn)單;本發(fā)明對(duì)Redis Key使用批量刪除,可以減少Redis的客戶端與服務(wù)器交互過(guò)程中的rtt(round-trip time:往返時(shí)延)。所以,本發(fā)明有效克服了現(xiàn)有技術(shù)中的種種缺點(diǎn)而具高度產(chǎn)業(yè)利用價(jià)值。
上述實(shí)施例僅例示性說(shuō)明本發(fā)明的原理及其功效,而非用于限制本發(fā)明。任何熟悉此技術(shù)的人士皆可在不違背本發(fā)明的精神及范疇下,對(duì)上述實(shí)施例進(jìn)行修飾或改變。因此,舉凡所屬技術(shù)領(lǐng)域中具有通常知識(shí)者在未脫離本發(fā)明所揭示的精神與技術(shù)思想下所完成的一切等效修飾或改變,仍應(yīng)由本發(fā)明的權(quán)利要求所涵蓋。