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