本發(fā)明涉及互聯(lián)網(wǎng)技術(shù)領(lǐng)域,尤其涉及一種數(shù)據(jù)查詢方法及裝置。
背景技術(shù):
數(shù)據(jù)庫是按照數(shù)據(jù)結(jié)構(gòu)來組織、存儲和管理數(shù)據(jù)的倉庫,數(shù)據(jù)庫對數(shù)據(jù)的查詢、處理速度遠遠超過普通文件的處理速度。隨著移動互聯(lián)網(wǎng)業(yè)務(wù)和用戶數(shù)量的快速增長,傳統(tǒng)的入庫機制已經(jīng)很難滿足入庫管理的需求,因此,采用多線程處理數(shù)據(jù)的方法應(yīng)運而生。
在處理數(shù)據(jù)時,每行數(shù)據(jù)都需要根據(jù)數(shù)字身份識別框架OpenID和頻道ID這兩項從數(shù)據(jù)庫中查找用戶ID,如果查找不到,則生成用戶ID并記錄到數(shù)據(jù)庫中。在單線程的情況下以上處理方式是沒問題的,但是如果是多線程處理數(shù)據(jù)時則會出現(xiàn)問題。當多個線程同時或者先后根據(jù)相同的OpenID和頻道ID來查找用戶ID時,如果數(shù)據(jù)庫中恰好沒有對應(yīng)的用戶ID,則需要生成用戶ID。由于多個線程是先后來查找的、可能前一個線程剛好生成了一個用戶ID、但還未來得及把生成的用戶ID記錄到數(shù)據(jù)庫中,另外一個線程就來查找相同的OpenID和頻道ID對應(yīng)的用戶ID了,此時后來的線程發(fā)現(xiàn)沒有對應(yīng)的用戶ID,就會又生成了一個新的用戶ID并存入到數(shù)據(jù)庫中,這樣則把之前線程生成的用戶ID給改變了,這樣在后面進行業(yè)務(wù)分析處理時被修改之前的用戶ID相關(guān)的數(shù)據(jù)就成為了錯誤數(shù)據(jù)了。
技術(shù)實現(xiàn)要素:
本發(fā)明實施例提供一種數(shù)據(jù)查詢方法及裝置,用于實現(xiàn)多線程處理數(shù)據(jù)時對用戶ID的正確查詢。
一種數(shù)據(jù)查詢方法,應(yīng)用于支持腳本語言Lua的數(shù)據(jù)庫中,包括以下步驟:
采用多線程的方式發(fā)出獲取待處理數(shù)據(jù)的用戶身份標識的請求;
按照預(yù)設(shè)順序啟動其中一條線程獲取所述用戶身份標識,且除所述其中一條線程之外的其他線程處于等待狀態(tài);
當所述其中一條線程獲取到所述用戶身份標識時,啟動所述其中一條線程的下一條線程獲取所述用戶身份標識。
在一個實施例中,所述獲取所述用戶身份標識,包括:
判斷所述數(shù)據(jù)庫中是否存儲有所述用戶身份標識;
當所述數(shù)據(jù)庫中存儲有所述用戶身份標識時,獲取所述存儲的用戶身份標識;
當所述數(shù)據(jù)庫中未存儲有所述用戶身份標識時,根據(jù)所述待處理數(shù)據(jù)的數(shù)字身份識別框架OpenID和頻道ID生成所述用戶身份標識。
在一個實施例中,所述根據(jù)所述待處理數(shù)據(jù)的數(shù)字身份識別框架OpenID和頻道ID生成所述用戶身份標識之后,所述獲取所述用戶身份標識,還包括:
將所述生成的用戶身份標識和所述數(shù)字身份識別框架OpenID以及所述頻道ID對應(yīng)存儲于所述數(shù)據(jù)庫中。
在一個實施例中,所述生成所述用戶身份標識,包括:
采用原子自增的方式生成所述用戶身份標識。
在一個實施例中,所述將所述生成的用戶身份標識和所述數(shù)字身份識別框架OpenID以及所述頻道ID對應(yīng)存儲于所述數(shù)據(jù)庫中,包括:
將所述生成的用戶身份標識和所述數(shù)字身份識別框架OpenID以及所述頻道ID以哈希表的方式存儲于所述數(shù)據(jù)庫中。
一種數(shù)據(jù)查詢裝置,應(yīng)用于支持腳本語言Lua的數(shù)據(jù)庫中,所述裝置包括:
請求模塊,用于采用多線程的方式發(fā)出獲取待處理數(shù)據(jù)的用戶身份標識的請求;
第一獲取模塊,用于按照預(yù)設(shè)順序啟動其中一條線程獲取所述用戶身份標識,且除所述其中一條線程之外的其他線程處于等待狀態(tài);
第二獲取模塊,用于當所述其中一條線程獲取到所述用戶身份標識時,啟動所述其中一條線程的下一條線程獲取所述用戶身份標識。
在一個實施例中,所述第一獲取模塊包括:
判斷單元,用于判斷所述數(shù)據(jù)庫中是否存儲有所述用戶身份標識;
獲取單元,用于當所述數(shù)據(jù)庫中存儲有所述用戶身份標識時,獲取所述存儲的用戶身份標識;
生成單元,用于當所述數(shù)據(jù)庫中未存儲有所述用戶身份標識時,根據(jù)所述待處理數(shù)據(jù)的數(shù)字身份識別框架OpenID和頻道ID生成所述用戶身份標識。
在一個實施例中,所述第一獲取模塊還包括:
存儲單元,用于根據(jù)所述待處理數(shù)據(jù)的數(shù)字身份識別框架OpenID和頻道ID生成所述用戶身份標識之后,將所述生成的用戶身份標識和所述數(shù)字身份識別框架OpenID以及所述頻道ID對應(yīng)存儲于所述數(shù)據(jù)庫中。
在一個實施例中,所述生成單元,還用于采用原子自增的方式生成所述用戶身份標識。
在一個實施例中,所述存儲單元,還用于將所述生成的用戶身份標識和所述數(shù)字身份識別框架OpenID以及所述頻道ID以哈希表的方式存儲于所述數(shù)據(jù)庫中。
本發(fā)明實施例的一些有益效果可以包括:
采用本發(fā)明實施例提供的技術(shù)方案,能夠在多線程都發(fā)出獲取待處理數(shù)據(jù)的用戶身份標識的請求時,按照預(yù)設(shè)順序啟動其中一條線程獲取用戶身份標識,且除該線程之外的其他線程均處于等待狀態(tài),避免了在數(shù)據(jù)庫中未存儲有用戶身份標識時多條線程重復生成用戶身份標識的情況,并且,僅在當前線程獲取到用戶身份標識之后,才會啟動下一條線程獲取用戶身份標識,使得之后的線程在獲取用戶身份標識時,可直接獲取到數(shù)據(jù)庫中存儲的用戶身份標識或者第一條線程生成的用戶身份標識,而無需重復性生成錯誤的用戶身份標識,從而提高數(shù)據(jù)處理的效率。
本發(fā)明的其它特征和優(yōu)點將在隨后的說明書中闡述,并且,部分地從說明書中變得顯而易見,或者通過實施本發(fā)明而了解。本發(fā)明的目的和其他優(yōu)點可通過在所寫的說明書、權(quán)利要求書、以及附圖中所特別指出的結(jié)構(gòu)來實現(xiàn)和獲得。
下面通過附圖和實施例,對本發(fā)明的技術(shù)方案做進一步的詳細描述。
附圖說明
附圖用來提供對本發(fā)明的進一步理解,并且構(gòu)成說明書的一部分,與本發(fā)明的實施例一起用于解釋本發(fā)明,并不構(gòu)成對本發(fā)明的限制。在附圖中:
圖1為本發(fā)明實施例中一種數(shù)據(jù)查詢方法的流程圖;
圖2為本發(fā)明實施例中一種數(shù)據(jù)查詢方法中獲取用戶ID的流程圖;
圖3為本發(fā)明實施例中一種數(shù)據(jù)查詢裝置的框圖;
圖4為本發(fā)明實施例中一種數(shù)據(jù)查詢裝置中第一獲取模塊的框圖。
具體實施方式
以下結(jié)合附圖對本發(fā)明的優(yōu)選實施例進行說明,應(yīng)當理解,此處所描述的優(yōu)選實施例僅用于說明和解釋本發(fā)明,并不用于限定本發(fā)明。
圖1為本發(fā)明實施例中一種數(shù)據(jù)查詢方法的流程圖。該數(shù)據(jù)查詢方法應(yīng)用于支持腳本語言Lua的數(shù)據(jù)庫(例如數(shù)據(jù)庫Redis)中,如圖1所示,包括以下步驟S11-S13:
步驟S11,采用多線程的方式發(fā)出獲取待處理數(shù)據(jù)的用戶身份標識的請求。
步驟S12,按照預(yù)設(shè)順序啟動其中一條線程獲取用戶身份標識,且除其中一條線程之外的其他線程處于等待狀態(tài)。
步驟S13,當其中一條線程獲取到用戶身份標識時,啟動其中一條線程的下一條線程獲取用戶身份標識。
其中,用戶身份標識即用戶ID,因此以下簡稱用戶ID。
上述實施例中,執(zhí)行步驟S12時,預(yù)設(shè)順序可設(shè)為多線程執(zhí)行任務(wù)的先后順序,例如,按照多線程執(zhí)行任務(wù)的先后順序,可先啟動第一條線程獲取用戶ID,當?shù)谝粭l線程獲取到用戶ID時,再啟動第二條線程獲取用戶ID,以此類推,直至所有線程都獲取到用戶ID。所啟動的其中一條線程可按照如圖2所示的步驟S21-S24來獲取用戶ID:
步驟S21,判斷所述數(shù)據(jù)庫中是否存儲有用戶ID;當數(shù)據(jù)庫中存儲有用戶ID時,執(zhí)行步驟S22;當數(shù)據(jù)庫中未存儲有用戶ID時,執(zhí)行步驟S23。
步驟S22,獲取存儲的用戶ID。
步驟S23,根據(jù)待處理數(shù)據(jù)的數(shù)字身份識別框架OpenID和頻道ID生成用戶ID。
執(zhí)行步驟S23時,可采用原子自增的方式生成用戶ID。例如,當數(shù)據(jù)庫為Redis時,可采用Redis中的incr命令生成用戶ID。
步驟S24,將生成的用戶ID和數(shù)字身份識別框架OpenID以及頻道ID對應(yīng)存儲于數(shù)據(jù)庫中。
執(zhí)行步驟S24時,可將生成的用戶ID和數(shù)字身份識別框架OpenID以及頻道ID以哈希表的方式存儲于數(shù)據(jù)庫中。在該哈希表中,頻道ID對應(yīng)哈希表中的key,數(shù)字身份識別框架OpenID對應(yīng)哈希表中的field,用戶ID對應(yīng)哈希表中的value。
當上述其中一條線程獲取到用戶ID之后,則啟動下一條線程獲取用戶ID,下一條線程獲取用戶ID的方式與圖2中所示的步驟S21-S24相同,即每條線程獲取用戶ID的方式均相同,因此不再贅述。
在一個具體實施例中,需要處理數(shù)據(jù)庫Redis中的一行數(shù)據(jù),當多條線程發(fā)出獲取該行數(shù)據(jù)對應(yīng)的用戶ID請求時,由主線程啟動多條線程中的第一條線程從Redis中獲取用戶ID,同時多線程中的其他線程均處于等待狀態(tài)。如果Redis中存儲有該行數(shù)據(jù)對應(yīng)的用戶ID,則第一條線程直接獲取該用戶ID;如果Redis中未存儲有該行數(shù)據(jù)對應(yīng)的用戶ID,則第一條線程根據(jù)該行數(shù)據(jù)的數(shù)字身份識別框架OpenID和頻道ID、并采用Redis中的incr命令生成該行數(shù)據(jù)對應(yīng)的用戶ID,同時將所生成的用戶ID與該行數(shù)據(jù)的OpenID、頻道ID對應(yīng)存儲在Redis中。此時,第一條數(shù)據(jù)已獲取到用戶ID,則由主線程啟動下一條線程(即第二條線程)獲取該行數(shù)據(jù)對應(yīng)的用戶ID,此時Redis中必然存儲有該行數(shù)據(jù)對應(yīng)的用戶ID(因為即使Redis中預(yù)先未存儲有該行數(shù)據(jù)對應(yīng)的用戶ID,也已由第一條線程在獲取用戶ID時生成并存儲該行數(shù)據(jù)對應(yīng)的用戶ID),因此第二條線程可直接獲取Redis中的用戶ID,而無需再重復性生成錯誤的用戶ID??梢?,該實施例中的技術(shù)方案能夠有效避免多條線程同時獲取用戶ID時導致的用戶ID發(fā)生錯誤的情況。
采用上述任一實施例提供的技術(shù)方案,能夠在多線程都發(fā)出獲取待處理數(shù)據(jù)的用戶身份標識的請求時,按照預(yù)設(shè)順序啟動其中一條線程獲取用戶身份標識,且除該線程之外的其他線程均處于等待狀態(tài),避免了在數(shù)據(jù)庫中未存儲有用戶身份標識時多條線程重復生成用戶身份標識的情況,并且,僅在當前線程獲取到用戶身份標識之后,才會啟動下一條線程獲取用戶身份標識,使得之后的線程在獲取用戶身份標識時,可直接獲取到數(shù)據(jù)庫中存儲的用戶身份標識或者第一條線程生成的用戶身份標識,而無需重復性生成錯誤的用戶身份標識,從而提高數(shù)據(jù)處理的效率。
圖3為本發(fā)明實施例中一種數(shù)據(jù)查詢裝置的框圖。如圖3所示,該裝置應(yīng)用于支持腳本語言Lua的數(shù)據(jù)庫中,包括:
請求模塊31,用于采用多線程的方式發(fā)出獲取待處理數(shù)據(jù)的用戶身份標識的請求;
第一獲取模塊32,用于按照預(yù)設(shè)順序啟動其中一條線程獲取用戶身份標識,且除其中一條線程之外的其他線程處于等待狀態(tài);
第二獲取模塊33,用于當其中一條線程獲取到用戶身份標識時,啟動其中一條線程的下一條線程獲取用戶身份標識。
在一個實施例中,如圖4所示,第一獲取模塊32包括:
判斷單元321,用于判斷數(shù)據(jù)庫中是否存儲有用戶身份標識;
獲取單元322,用于當數(shù)據(jù)庫中存儲有用戶身份標識時,獲取存儲的用戶身份標識;
生成單元323,用于當數(shù)據(jù)庫中未存儲有用戶身份標識時,根據(jù)待處理數(shù)據(jù)的數(shù)字身份識別框架OpenID和頻道ID生成用戶身份標識。
在一個實施例中,第一獲取模塊32還包括:
存儲單元,用于根據(jù)待處理數(shù)據(jù)的數(shù)字身份識別框架OpenID和頻道ID生成用戶身份標識之后,將生成的用戶身份標識和數(shù)字身份識別框架OpenID以及頻道ID對應(yīng)存儲于數(shù)據(jù)庫中。
在一個實施例中,生成單元323還用于采用原子自增的方式生成用戶身份標識。
在一個實施例中,存儲單元還用于將生成的用戶身份標識和數(shù)字身份識別框架OpenID以及頻道ID以哈希表的方式存儲于數(shù)據(jù)庫中。
采用本發(fā)明實施例提供的裝置,能夠在多線程都發(fā)出獲取待處理數(shù)據(jù)的用戶身份標識的請求時,按照預(yù)設(shè)順序啟動其中一條線程獲取用戶身份標識,且除該線程之外的其他線程均處于等待狀態(tài),避免了在數(shù)據(jù)庫中未存儲有用戶身份標識時多條線程重復生成用戶身份標識的情況,并且,僅在當前線程獲取到用戶身份標識之后,才會啟動下一條線程獲取用戶身份標識,使得之后的線程在獲取用戶身份標識時,可直接獲取到數(shù)據(jù)庫中存儲的用戶身份標識或者第一條線程生成的用戶身份標識,而無需重復性生成錯誤的用戶身份標識,從而提高數(shù)據(jù)處理的效率。
關(guān)于上述實施例中的裝置,其中各個模塊執(zhí)行操作的具體方式已經(jīng)在有關(guān)該方法的實施例中進行了詳細描述,此處將不做詳細闡述說明。
本領(lǐng)域內(nèi)的技術(shù)人員應(yīng)明白,本發(fā)明的實施例可提供為方法、系統(tǒng)、或計算機程序產(chǎn)品。因此,本發(fā)明可采用完全硬件實施例、完全軟件實施例、或結(jié)合軟件和硬件方面的實施例的形式。而且,本發(fā)明可采用在一個或多個其中包含有計算機可用程序代碼的計算機可用存儲介質(zhì)(包括但不限于磁盤存儲器和光學存儲器等)上實施的計算機程序產(chǎn)品的形式。
本發(fā)明是參照根據(jù)本發(fā)明實施例的方法、設(shè)備(系統(tǒng))、和計算機程序產(chǎn)品的流程圖和/或方框圖來描述的。應(yīng)理解可由計算機程序指令實現(xiàn)流程圖和/或方框圖中的每一流程和/或方框、以及流程圖和/或方框圖中的流程和/或方框的結(jié)合??商峁┻@些計算機程序指令到通用計算機、專用計算機、嵌入式處理機或其他可編程數(shù)據(jù)處理設(shè)備的處理器以產(chǎn)生一個機器,使得通過計算機或其他可編程數(shù)據(jù)處理設(shè)備的處理器執(zhí)行的指令產(chǎn)生用于實現(xiàn)在流程圖一個流程或多個流程和/或方框圖一個方框或多個方框中指定的功能的裝置。
這些計算機程序指令也可存儲在能引導計算機或其他可編程數(shù)據(jù)處理設(shè)備以特定方式工作的計算機可讀存儲器中,使得存儲在該計算機可讀存儲器中的指令產(chǎn)生包括指令裝置的制造品,該指令裝置實現(xiàn)在流程圖一個流程或多個流程和/或方框圖一個方框或多個方框中指定的功能。
這些計算機程序指令也可裝載到計算機或其他可編程數(shù)據(jù)處理設(shè)備上,使得在計算機或其他可編程設(shè)備上執(zhí)行一系列操作步驟以產(chǎn)生計算機實現(xiàn)的處理,從而在計算機或其他可編程設(shè)備上執(zhí)行的指令提供用于實現(xiàn)在流程圖一個流程或多個流程和/或方框圖一個方框或多個方框中指定的功能的步驟。
顯然,本領(lǐng)域的技術(shù)人員可以對本發(fā)明進行各種改動和變型而不脫離本發(fā)明的精神和范圍。這樣,倘若本發(fā)明的這些修改和變型屬于本發(fā)明權(quán)利要求及其等同技術(shù)的范圍之內(nèi),則本發(fā)明也意圖包含這些改動和變型在內(nèi)。