本公開涉及數(shù)據(jù)處理領域,具體地,涉及一種同步數(shù)據(jù)的方法及裝置。
背景技術:
在數(shù)據(jù)處理領域,源數(shù)據(jù)庫的源數(shù)據(jù)經(jīng)過抽取、轉換之后,需要同步到目標數(shù)據(jù)庫中。在源數(shù)據(jù)同步到目標數(shù)據(jù)庫之前,需要先逐條在目標數(shù)據(jù)庫中進行查詢,在該源數(shù)據(jù)與目標數(shù)據(jù)已有記錄匹配的情況下,將該源數(shù)據(jù)更新到目標數(shù)據(jù)庫中,在不匹配的情況下,將該源數(shù)據(jù)插入到目標數(shù)據(jù)庫中。
然而,由于數(shù)據(jù)庫的匹配性能不高,導致數(shù)據(jù)同步效率過低,不能滿足海量數(shù)據(jù)處理的需要。
技術實現(xiàn)要素:
有鑒于此,本公開提供了一種同步數(shù)據(jù)的方法及裝置,以實現(xiàn)提高數(shù)據(jù)同步效率的目的。
在本公開實施例的一個方面中,提供了一種同步數(shù)據(jù)的方法。該方法包括:獲取源數(shù)據(jù);將所述源數(shù)據(jù)與緩存中的目標數(shù)據(jù)進行匹配,得到所述源數(shù)據(jù)的匹配結果,其中,所述緩存中的目標數(shù)據(jù)為從目標數(shù)據(jù)庫預先加載到所述緩存;根據(jù)所述匹配結果,確定需要對所述源數(shù)據(jù)進行的數(shù)據(jù)庫操作;根據(jù)預設條件,將需要對所述源數(shù)據(jù)進行的數(shù)據(jù)庫操作提交給所述目標數(shù)據(jù)庫執(zhí)行。
可選地,所述獲取源數(shù)據(jù)包括:數(shù)據(jù)讀線程讀取源數(shù)據(jù)庫中的源數(shù)據(jù);發(fā)送所述源數(shù)據(jù)至數(shù)據(jù)緩存;對應地,所述將所述源數(shù)據(jù)與緩存中的目標數(shù)據(jù)進行匹配包括:獲取所述數(shù)據(jù)緩存中的所述源數(shù)據(jù),將所述源數(shù)據(jù)與哈希緩存中的目標數(shù)據(jù)進行匹配,得到所述匹配結果。
可選地,所述哈希緩存中的數(shù)據(jù)是從目標數(shù)據(jù)庫的無主鍵表的部分關鍵字段預先加載到所述哈希緩存的。
可選地,所述根據(jù)所述匹配結果,確定需要對所述源數(shù)據(jù)進行的數(shù)據(jù)庫操作,包括:在所述源數(shù)據(jù)與緩存中的目標數(shù)據(jù)匹配時,確定對所述源數(shù)據(jù)進行的數(shù)據(jù)庫操作為數(shù)據(jù)庫更新操作,或者;在所述源數(shù)據(jù)與緩存中的目標數(shù)據(jù)不匹配時,確定對所述源數(shù)據(jù)進行的數(shù)據(jù)庫操作為數(shù)據(jù)庫插入操作。
可選地,所述根據(jù)預設條件,將需要對所述源數(shù)據(jù)進行的數(shù)據(jù)庫操作提交給所述目標數(shù)據(jù)庫執(zhí)行,包括:當匹配成功的所述源數(shù)據(jù)的數(shù)據(jù)量達到批量更新閾值時,使用所述匹配成功的源數(shù)據(jù),批量更新所述目標數(shù)據(jù)庫中匹配成功的目標數(shù)據(jù)對應的數(shù)據(jù)記錄,或者;當匹配不成功的所述源數(shù)據(jù)的數(shù)據(jù)量達到批量插入閾值時,將所有匹配不成功的源數(shù)據(jù)插入到所述目標數(shù)據(jù)庫。
在本公開實施例的另一個方面中,提供了一種同步數(shù)據(jù)的裝置。該裝置包括:獲取模塊,被配置為獲取源數(shù)據(jù)。匹配模塊,被配置為將所述源數(shù)據(jù)與緩存中的目標數(shù)據(jù)進行匹配,得到所述源數(shù)據(jù)的匹配結果,其中,所述緩存中的目標數(shù)據(jù)為從目標數(shù)據(jù)庫預先加載到所述緩存。操作確定模塊,被配置為根據(jù)所述匹配結果,確定需要對所述源數(shù)據(jù)進行的數(shù)據(jù)庫操作。操作提交模塊,被配置為根據(jù)預設條件,將需要對所述源數(shù)據(jù)進行的數(shù)據(jù)庫操作提交給所述目標數(shù)據(jù)庫執(zhí)行。
可選地,所述獲取模塊被配置為觸發(fā)數(shù)據(jù)讀線程讀取源數(shù)據(jù)庫中的源數(shù)據(jù);發(fā)送所述源數(shù)據(jù)至數(shù)據(jù)緩存。所述匹配模塊被配置為獲取所述數(shù)據(jù)緩存中的所述源數(shù)據(jù),將所述源數(shù)據(jù)與哈希緩存中的目標數(shù)據(jù)進行匹配,得到所述匹配結果。
可選地,所述哈希緩存中的數(shù)據(jù)是從目標數(shù)據(jù)庫的無主鍵表的部分關鍵字段預先加載到所述哈希緩存的。
可選地,所述操作確定模塊被配置為在所述源數(shù)據(jù)與緩存中的目標數(shù)據(jù)匹配時,確定對所述源數(shù)據(jù)進行的數(shù)據(jù)庫操作為數(shù)據(jù)庫更新操作,或者;在所述源數(shù)據(jù)與緩存中的目標數(shù)據(jù)不匹配時,確定對所述源數(shù)據(jù)進行的數(shù)據(jù)庫操作為數(shù)據(jù)庫插入操作。
可選地,所述操作提交模塊被配置為當匹配成功的所述源數(shù)據(jù)的數(shù)據(jù)量達到批量更新閾值時,使用所述匹配成功的源數(shù)據(jù),批量更新所述目標數(shù)據(jù)庫中匹配成功的目標數(shù)據(jù)對應的數(shù)據(jù)記錄,或者;當匹配不成功的所述源數(shù)據(jù)的數(shù)據(jù)量達到批量插入閾值時,將所有匹配不成功的源數(shù)據(jù)插入到所述目標數(shù)據(jù)庫。
通過本公開上述技術方案,先將目標數(shù)據(jù)庫的目標數(shù)據(jù)進行緩存,然后借助緩存的高性能來進行源數(shù)據(jù)與目標數(shù)據(jù)的匹配,從而提高了匹配效率,根據(jù)匹配結果確定需要對源數(shù)據(jù)進行的數(shù)據(jù)庫操作之后,再根據(jù)預設條件,將需要對源數(shù)據(jù)進行的數(shù)據(jù)庫操作提交給所述目標數(shù)據(jù)庫執(zhí)行,從而實現(xiàn)了數(shù)據(jù)同步性能大幅提升的目的。
本公開的其他特征和優(yōu)點將在隨后的具體實施方式部分予以詳細說明。
附圖說明
附圖是用來提供對本公開的進一步理解,并且構成說明書的一部分,與下面的具體實施方式一起用于解釋本公開,但并不構成對本公開的限制。在附圖中:
圖1是根據(jù)一示例性實施例示出的實施環(huán)境示意圖。
圖2是根據(jù)本發(fā)明的一示例性實施例示出的一種同步數(shù)據(jù)的方法的流程圖。
圖3是根據(jù)本發(fā)明的另一示例性實施例示出的一種同步數(shù)據(jù)的方法的流程圖。
圖4是根據(jù)本發(fā)明的一示例性實施例示出的一種同步數(shù)據(jù)的裝置的框圖。
圖5是根據(jù)本發(fā)明的另一示例性實施例示出的一種同步數(shù)據(jù)的裝置的框圖。
具體實施方式
以下結合附圖對本公開的具體實施方式進行詳細說明。應當理解的是,此處所描述的具體實施方式僅用于說明和解釋本公開,并不用于限制本公開。
圖1是根據(jù)一示例性實施例示出的實施環(huán)境示意圖。該實施環(huán)境包括:應用了本公開實施例提供的同步數(shù)據(jù)的方法的數(shù)據(jù)采集器101、目標數(shù)據(jù)庫102、源數(shù)據(jù)庫103。其中,數(shù)據(jù)采集器101、目標數(shù)據(jù)庫102可以布置在服務器側。例如,數(shù)據(jù)采集器101,可以從源數(shù)據(jù)庫103抓取源數(shù)據(jù),將源數(shù)據(jù)同步到目標數(shù)據(jù)庫102。其中,該源數(shù)據(jù)可以經(jīng)過需要的轉換之后,再同步到目標數(shù)據(jù)庫102。
可以理解的是,圖1所示實施環(huán)境僅用于示意本發(fā)明實施例提供的方法,并不構成對本發(fā)明實施例的限制。
圖2是根據(jù)本發(fā)明的一示例性實施例示出的一種同步數(shù)據(jù)的方法的流程圖。該方法可以包括:
在步驟210中,獲取源數(shù)據(jù)。
在步驟220中,將所述源數(shù)據(jù)與緩存中的目標數(shù)據(jù)進行匹配,得到所述源數(shù)據(jù)的匹配結果。
需要說明的是,本實施例所述步驟210中,所述源數(shù)據(jù)可以一次獲取多條,也可以一次獲取一條。所述步驟220中,可以是在步驟210獲取一條源數(shù)據(jù)后即與緩存中的目標數(shù)據(jù)進行匹配,也可以是在步驟210獲取多條源數(shù)據(jù)后再與緩存中的目標數(shù)據(jù)進行匹配。本實施例對此并不進行限制。
其中,所述緩存中的目標數(shù)據(jù)為從目標數(shù)據(jù)庫預先加載到所述緩存的。
例如,一種可能的實施方式中,可以由數(shù)據(jù)讀線程讀取源數(shù)據(jù)庫中的源數(shù)據(jù),發(fā)送所述源數(shù)據(jù)至數(shù)據(jù)緩存。由數(shù)據(jù)寫線程獲取所述數(shù)據(jù)緩存中的所述源數(shù)據(jù),將所述源數(shù)據(jù)與哈希緩存中的目標數(shù)據(jù)進行匹配,得到所述匹配結果。所述哈希緩存中的目標數(shù)據(jù)是預先從目標數(shù)據(jù)庫加載到所述哈希緩存的。由于哈希緩存主要采用哈希算法來構建緩存索引,具有很高的數(shù)據(jù)查詢效率,因此,通過借助哈希緩存的高性能可進一步提高查詢效率,從而可以更進一步提高數(shù)據(jù)同步性能。
可以理解的是,本公開實施例獲取源數(shù)據(jù)的操作以及匹配數(shù)據(jù)、提交源數(shù)據(jù)給目標數(shù)據(jù)庫的操作可以由同一線程執(zhí)行,也可以如上面實施方式中分別由不同的線程執(zhí)行,本公開對此并不進行限制??梢岳斫獾氖?,在分別由不同線程執(zhí)行的情況下,可以更一進步提高數(shù)據(jù)同步的效率。
在一些應用場景中,例如,數(shù)據(jù)采集場景中,所要存儲的數(shù)據(jù)通常為無主鍵表的數(shù)據(jù)。對于無主鍵表的數(shù)據(jù)來說,無法通過主鍵來查詢數(shù)據(jù),只能通過匹配關鍵字段的數(shù)據(jù)來確定數(shù)據(jù)庫中是否已存在相應的記錄。為了減少存儲空間的浪費,本公開所述哈希緩存中的目標數(shù)據(jù)是從目標數(shù)據(jù)庫的無主鍵表的部分關鍵字段預先加載到所述哈希緩存的。其中,目標數(shù)據(jù)可以經(jīng)過壓縮再放入緩存。例如,對于用于存儲人口信息的目標數(shù)據(jù)庫來說,關鍵字段中的數(shù)據(jù)可以為人名及身份證號。結合放入哈希緩存的實施方式,可以將人名及身份證號進行拼接,對拼接后的人名及身份證號進行哈希計算,將用于代表該人名及身份證號的哈希值存入哈希緩存。在需要進行匹配時,可以將源數(shù)據(jù)中相應關鍵字段的數(shù)據(jù)進行哈希計算,得到所述源數(shù)據(jù)的哈希值,根據(jù)所述源數(shù)據(jù)的哈希值直接到哈希緩存中去匹配目標數(shù)據(jù)以確定目標數(shù)據(jù)庫中是否存在相應記錄??梢?,相對于在哈希緩存中預加載目標數(shù)據(jù)庫的全部數(shù)據(jù)來說,將目標數(shù)據(jù)庫部分關鍵字段的數(shù)據(jù)哈希值預先加載到哈希緩存,占用的存儲空間更少。
例如,所述數(shù)據(jù)緩存可以通過內存實現(xiàn),也可以如上面實施方式中的哈希緩存通過NoSQL數(shù)據(jù)庫實現(xiàn)。例如,所述數(shù)據(jù)緩存與所述哈希緩存可以分別采用不同NoSQL數(shù)據(jù)庫實現(xiàn),也可以采用同一NoSQL數(shù)據(jù)庫實現(xiàn)。在采用同一NoSQL數(shù)據(jù)庫實現(xiàn)的情況下,可以通過在鍵名上添加前綴或后綴來區(qū)分兩個緩存。
在步驟230中,根據(jù)所述匹配結果,確定需要對所述源數(shù)據(jù)進行的數(shù)據(jù)庫操作。
例如,在所述源數(shù)據(jù)與緩存中的目標數(shù)據(jù)匹配時,可以確定對所述源數(shù)據(jù)進行的數(shù)據(jù)庫操作為數(shù)據(jù)庫更新操作,或者;在所述源數(shù)據(jù)與緩存中的目標數(shù)據(jù)不匹配時,確定對所述源數(shù)據(jù)進行的數(shù)據(jù)庫操作為數(shù)據(jù)庫插入操作。
在步驟240中,根據(jù)預設條件,將需要對所述源數(shù)據(jù)進行的數(shù)據(jù)庫操作提交給所述目標數(shù)據(jù)庫執(zhí)行。
例如,可以為更新和插入操作共同設置一個預設條件。如,若距上一次提交更新和插入操作的間隔時長達到一個設定的時長閾值,或,若上一次提交更新和插入操作之后獲取的源數(shù)據(jù)的條數(shù)達到一個設定的條數(shù)閾值,則將需要對這些源數(shù)據(jù)分別進行的數(shù)據(jù)庫更新操作和插入操作批量一塊提交給所述目標數(shù)據(jù)庫執(zhí)行。
再例如,可以為更新和插入操作分別設置不同的預設條件。在該實施方式中,所述根據(jù)預設條件,將需要對所述源數(shù)據(jù)進行的數(shù)據(jù)庫操作提交給所述目標數(shù)據(jù)庫執(zhí)行,可以包括:當匹配成功的所述源數(shù)據(jù)的數(shù)據(jù)量達到批量更新閾值時,使用所述匹配成功的源數(shù)據(jù),批量更新所述目標數(shù)據(jù)庫中匹配成功的目標數(shù)據(jù)對應的數(shù)據(jù)記錄,或者;當匹配不成功的所述源數(shù)據(jù)的數(shù)據(jù)量達到批量插入閾值時,將所有匹配不成功的源數(shù)據(jù)插入到所述目標數(shù)據(jù)庫。其中,批量更新閾值以及批量插入閾值可以根據(jù)實際需要設置,如,可以分別設置為500條數(shù)據(jù)。
可見,通過本公開技術方案,先將目標數(shù)據(jù)庫的目標數(shù)據(jù)進行緩存,然后借助緩存的高性能來提高匹配效率,從而提高了匹配效率,根據(jù)匹配結果確定需要對源數(shù)據(jù)進行的數(shù)據(jù)庫操作之后,再根據(jù)預設條件,將需要對源數(shù)據(jù)進行的數(shù)據(jù)庫操作提交給所述目標數(shù)據(jù)庫執(zhí)行,從而實現(xiàn)了數(shù)據(jù)同步性能大幅提升的目的。另外,可以利用數(shù)據(jù)庫的高性能的批量更新和插入來提高數(shù)據(jù)寫入能力,進一步提高數(shù)據(jù)同步性能。
圖3是根據(jù)本發(fā)明的另一示例性實施例示出的一種同步數(shù)據(jù)的方法的流程圖。該方法可以包括:
在步驟310中,獲取源數(shù)據(jù)。
在步驟320中,將所述源數(shù)據(jù)與緩存中的目標數(shù)據(jù)進行匹配,得到所述源數(shù)據(jù)的匹配結果。
其中,所述緩存中的數(shù)據(jù)為從目標數(shù)據(jù)庫預先加載到所述緩存的。
在步驟330中,根據(jù)所述匹配結果,確定需要對所述源數(shù)據(jù)進行的數(shù)據(jù)庫操作。
在步驟340中,根據(jù)預設條件,將需要對所述源數(shù)據(jù)進行的數(shù)據(jù)庫操作提交給所述目標數(shù)據(jù)庫執(zhí)行。
在步驟350中,根據(jù)預設條件,將需要對所述源數(shù)據(jù)進行的數(shù)據(jù)庫操作在所述緩存中執(zhí)行。
本實施例中,可以預先從目標數(shù)據(jù)庫加載目標數(shù)據(jù)到緩存,可以在首次啟動時加載,后續(xù)通過該步驟350使緩存與目標數(shù)據(jù)庫同步即可,無需再次從目標數(shù)據(jù)庫加載目標數(shù)據(jù)到緩存,減少了數(shù)據(jù)的傳輸,更進一步提高了數(shù)據(jù)同步的效率。
圖4是根據(jù)本發(fā)明的一示例性實施例示出的一種同步數(shù)據(jù)的裝置400的框圖。該裝置可以包括:獲取模塊410、匹配模塊420、操作確定模塊430、以及操作提交模塊440。
該獲取模塊410,可以被配置為獲取源數(shù)據(jù)。
該匹配模塊420,可以被配置為將所述源數(shù)據(jù)與緩存中的目標數(shù)據(jù)進行匹配,得到所述源數(shù)據(jù)的匹配結果。
其中,所述緩存中的目標數(shù)據(jù)為從目標數(shù)據(jù)庫預先加載到所述緩存。
該操作確定模塊430,可以被配置為根據(jù)所述匹配結果,確定需要對所述源數(shù)據(jù)進行的數(shù)據(jù)庫操作。
該操作提交模塊440,可以被配置為根據(jù)預設條件,將需要對所述源數(shù)據(jù)進行的數(shù)據(jù)庫操作提交給所述目標數(shù)據(jù)庫執(zhí)行。
可見,通過本公開技術方案,先將目標數(shù)據(jù)庫的目標數(shù)據(jù)進行緩存,然后借助緩存的高性能來提高匹配效率,從而提高了匹配效率,根據(jù)匹配結果確定需要對源數(shù)據(jù)進行的數(shù)據(jù)庫操作之后,再根據(jù)預設條件,將需要對源數(shù)據(jù)進行的數(shù)據(jù)庫操作提交給所述目標數(shù)據(jù)庫執(zhí)行,從而實現(xiàn)了數(shù)據(jù)同步性能大幅提升的目的。
可以理解的是,本公開實施例獲取源數(shù)據(jù)的操作以及匹配數(shù)據(jù)、提交源數(shù)據(jù)給目標數(shù)據(jù)庫的操作可以由同一線程執(zhí)行,也可以分別由不同的線程執(zhí)行,本公開對此并不進行限制。例如,所述獲取模塊410可以被配置為觸發(fā)數(shù)據(jù)讀線程讀取源數(shù)據(jù)庫中的源數(shù)據(jù);發(fā)送所述源數(shù)據(jù)至數(shù)據(jù)緩存。所述匹配模塊420可以被配置為觸發(fā)數(shù)據(jù)寫線程獲取所述數(shù)據(jù)緩存中的所述源數(shù)據(jù),將所述源數(shù)據(jù)與哈希緩存中的目標數(shù)據(jù)進行匹配,得到所述匹配結果。
在一些應用場景中,例如,數(shù)據(jù)采集場景中,所要存儲的數(shù)據(jù)通常為無主鍵表的數(shù)據(jù)。對于無主鍵表的數(shù)據(jù)來說,無法通過主鍵來查詢數(shù)據(jù),只能通過匹配關鍵字段的數(shù)據(jù)來確定數(shù)據(jù)庫中是否已存在相應的記錄。為了減少對存儲空間的浪費,本公開預先加載到緩存中的目標數(shù)據(jù)是從目標數(shù)據(jù)庫的無主鍵表的部分關鍵字段預先加載到所述哈希緩存的。其中,目標數(shù)據(jù)可以經(jīng)過壓縮再放入緩存??梢姡鄬τ谠诰彺嬷蓄A加載目標數(shù)據(jù)庫的全部數(shù)據(jù)來說,將目標數(shù)據(jù)庫部分關鍵字段的數(shù)據(jù)的哈希值預先加載到哈希緩存,占用存儲空間更少。
需要說明的是,更新和插入操作可以共同設置一個批量提交條件,也可以分別設置不同的批量提交條件。例如,所述操作確定模塊430可以被配置為在所述源數(shù)據(jù)與緩存中的目標數(shù)據(jù)匹配時,確定對所述源數(shù)據(jù)進行的數(shù)據(jù)庫操作為數(shù)據(jù)庫更新操作,或者;在所述源數(shù)據(jù)與緩存中的目標數(shù)據(jù)不匹配時,確定對所述源數(shù)據(jù)進行的數(shù)據(jù)庫操作為數(shù)據(jù)庫插入操作。所述操作提交模塊440可以被配置為在當匹配成功的所述源數(shù)據(jù)的數(shù)據(jù)量達到批量更新閾值時,使用所述匹配成功的源數(shù)據(jù),批量更新所述目標數(shù)據(jù)庫中匹配成功的目標數(shù)據(jù)對應的數(shù)據(jù)記錄,或者;當匹配不成功的所述源數(shù)據(jù)的數(shù)據(jù)量達到批量插入閾值時,將所有匹配不成功的源數(shù)據(jù)插入到所述目標數(shù)據(jù)庫。
一種可能的實施方式中,先從目標數(shù)據(jù)庫加載數(shù)據(jù)到緩存,可以在首次啟動時加載,后續(xù)使緩存與目標數(shù)據(jù)庫同步更新即可,無需再次從目標數(shù)據(jù)庫加載數(shù)據(jù)到緩存,減少了數(shù)據(jù)的傳輸,更進一步提高了數(shù)據(jù)同步的效率。具體地,如圖5所示,所述裝置還可以包括:緩存更新模塊450,可以被配置為根據(jù)預設條件,將需要對所述源數(shù)據(jù)進行的數(shù)據(jù)庫操作在所述緩存中執(zhí)行。
以上結合附圖詳細描述了本公開的優(yōu)選實施方式,但是,本公開并不限于上述實施方式中的具體細節(jié),在本公開的技術構思范圍內,可以對本公開的技術方案進行多種簡單變型,這些簡單變型均屬于本公開的保護范圍。
另外需要說明的是,在上述具體實施方式中所描述的各個具體技術特征,在不矛盾的情況下,可以通過任何合適的方式進行組合。為了避免不必要的重復,本公開對各種可能的組合方式不再另行說明。
此外,本公開的各種不同的實施方式之間也可以進行任意組合,只要其不違背本公開的思想,其同樣應當視為本公開所公開的內容。