本發(fā)明屬于互聯(lián)網(wǎng)技術(shù)領(lǐng)域,具體涉及一種基于redis的數(shù)據(jù)庫數(shù)據(jù)聚合同步的方法。
背景技術(shù):
當(dāng)今數(shù)據(jù)庫軟件技術(shù)中關(guān)系型數(shù)據(jù)庫發(fā)展的已經(jīng)很成熟,產(chǎn)品類型也相當(dāng)?shù)亩?,主流常見的關(guān)系型數(shù)據(jù)庫有oracle,mysql,postgresql等,針對這些數(shù)據(jù)庫都有各自的數(shù)據(jù)主從同步方式,比如mysql的主從數(shù)據(jù)庫之間同步有自帶的binlog主從同步數(shù)據(jù)的方式,otter中間件同步等方式。但存在不足的地方是不能進行多個數(shù)據(jù)庫同步到一個數(shù)據(jù)庫的聚合同步。
然而,目前大部分互聯(lián)網(wǎng)公司內(nèi)部的業(yè)務(wù)支持系統(tǒng)會根據(jù)業(yè)務(wù)拆分到不同的系統(tǒng)中,但是,當(dāng)建立dw數(shù)據(jù)倉庫平臺或者bi平臺時需要聚合各個業(yè)務(wù)系統(tǒng)的數(shù)據(jù)到同一個數(shù)據(jù)庫中做后續(xù)的統(tǒng)計匯總分析,而目前尚不能進行多個數(shù)據(jù)到一個數(shù)據(jù)庫的聚合同步,因此對公司內(nèi)部業(yè)務(wù)執(zhí)行會造成不便。
技術(shù)實現(xiàn)要素:
本發(fā)明是為了解決上述問題而進行的,目的在于提供一種能夠?qū)⒅辽僖粋€目標(biāo)數(shù)據(jù)庫數(shù)據(jù)聚合同步到一個聚合數(shù)據(jù)庫中的基于redis的數(shù)據(jù)庫數(shù)據(jù)聚合同步的方法。
本發(fā)明提供了一種基于redis的數(shù)據(jù)庫數(shù)據(jù)聚合同步的方法,用于將至少一個目標(biāo)數(shù)據(jù)庫數(shù)據(jù)聚合同步到一個聚合數(shù)據(jù)庫中,其特征在于,包括以下步驟:
步驟1,使用同步程序從配置文件中加載各所述目標(biāo)數(shù)據(jù)庫的遠程連接信息,讀取所述目標(biāo)數(shù)據(jù)庫中的表結(jié)構(gòu),然后提取每個表的字段和主鍵信息,并在所述聚合數(shù)據(jù)庫中創(chuàng)建相對應(yīng)的表結(jié)構(gòu);
步驟2,所述同步程序掃描所有所述目標(biāo)數(shù)據(jù)庫表的數(shù)據(jù),然后逐行計算得到每行數(shù)據(jù)的key和value;
步驟3,將步驟2中得到的key和value作為redis的k-v緩存寫入redis中,將所有所述目標(biāo)數(shù)據(jù)庫表的每行數(shù)據(jù)拼裝出標(biāo)準(zhǔn)的“insert”sql語句執(zhí)行寫入到所述聚合數(shù)據(jù)庫中對應(yīng)的表中;
步驟4,當(dāng)所述目標(biāo)數(shù)據(jù)庫中表的數(shù)據(jù)發(fā)生變化時,執(zhí)行步驟2,重新得到新value和新key,對于每行數(shù)據(jù),判斷redis中是否存在與該行數(shù)據(jù)的新key相同的key,如果不存在,則該行數(shù)據(jù)執(zhí)行步驟3,如果存在,則判斷該行數(shù)據(jù)的新value與redis中存儲的相對應(yīng)的value是否相同,如果不同,則將該行數(shù)據(jù)的新value覆蓋掉redis中相對應(yīng)的value,同時將該行數(shù)據(jù)拼裝出標(biāo)準(zhǔn)的“update”sql語句對所述聚合數(shù)據(jù)庫中對應(yīng)表中的行數(shù)據(jù)進行更新;
步驟5,將發(fā)生變化后的所有的目標(biāo)數(shù)據(jù)庫數(shù)據(jù)的表主鍵集合與步驟4得到的聚合數(shù)據(jù)庫相應(yīng)的表主鍵集合進行差集計算得到差集,如果所述差集中存在元素,則在所述聚合數(shù)據(jù)庫中對應(yīng)的表生成標(biāo)準(zhǔn)的“delete”sql語句刪除所述聚合數(shù)據(jù)庫中與所述目標(biāo)數(shù)據(jù)庫中已刪除數(shù)據(jù)相應(yīng)的數(shù)據(jù)。。
進一步,在本發(fā)明提供的基于redis的數(shù)據(jù)庫數(shù)據(jù)聚合同步的方法中,還可以具有這樣的特征:其中,同步程序根據(jù)數(shù)據(jù)庫表的主鍵字段進行掃描。
進一步,在本發(fā)明提供的基于redis的數(shù)據(jù)庫數(shù)據(jù)聚合同步的方法中,還可以具有這樣的特征:其中,步驟2中,每行數(shù)據(jù)的key和value計算方法:首先每行數(shù)據(jù)采用md5算法得到一個唯一標(biāo)識的字符串value,然后利用表名拼接該行數(shù)據(jù)的主鍵字段值得到一個唯一的字符串key。
本發(fā)明的優(yōu)點如下:
根據(jù)本發(fā)明所涉及的基于redis的數(shù)據(jù)庫數(shù)據(jù)聚合同步的方法,由于同步程序掃描目標(biāo)數(shù)據(jù)庫表的數(shù)據(jù),計算每行數(shù)據(jù)的key和value,將其存儲到redis中,同時將該行數(shù)據(jù)寫入聚合數(shù)據(jù)庫,在目標(biāo)數(shù)據(jù)庫標(biāo)數(shù)據(jù)發(fā)生變化時,同步程序重新計算目標(biāo)數(shù)據(jù)庫中每行數(shù)據(jù)的新key和新value,并查詢redis中是否存在與新key相同的key,如果不存在,則將該新key和新value存儲到redis中,同時將該行數(shù)據(jù)寫入聚合數(shù)據(jù)庫,如果存在,則判斷新value是否與redis中存儲的value相同,如果不同,則將該新value覆蓋redis中相應(yīng)的value,同時將該行數(shù)據(jù)更新到聚合數(shù)據(jù)庫,然后,對目標(biāo)數(shù)據(jù)庫數(shù)據(jù)同步完成的表主鍵集合與聚合數(shù)據(jù)庫相應(yīng)的表主鍵集合進行差集計算,通過判斷差集中是否有元素來對聚合數(shù)據(jù)庫中數(shù)據(jù)進行刪除,本發(fā)明通過redis來實現(xiàn)聚合同步過程中的增、改、刪,從而將多個目標(biāo)數(shù)據(jù)庫數(shù)據(jù)聚合同步到一個聚合數(shù)據(jù)庫中,可輕松實現(xiàn)數(shù)據(jù)倉庫或者bi平臺所需數(shù)據(jù)的搭建。
附圖說明
圖1是本發(fā)明中基于redis的數(shù)據(jù)庫數(shù)據(jù)聚合同步的方法的關(guān)系圖;
圖2是本發(fā)明中同步程序處理的邏輯圖。
具體實施方式
為了使本發(fā)明實現(xiàn)的技術(shù)手段、創(chuàng)作特征、達成目的與功效易于明白了解,以下實施例結(jié)合附圖對本發(fā)明基于redis的數(shù)據(jù)庫數(shù)據(jù)聚合同步的方法作具體闡述。
基于redis的數(shù)據(jù)庫數(shù)據(jù)聚合同步的方法用于將至少一個目標(biāo)數(shù)據(jù)庫數(shù)據(jù)聚合同步到一個聚合數(shù)據(jù)庫中。本發(fā)明的方法的關(guān)系圖如圖1所示,目標(biāo)數(shù)據(jù)庫10為需要同步數(shù)據(jù)到聚合數(shù)據(jù)庫20的來源數(shù)據(jù)庫,包括一個或者多個。
聚合數(shù)據(jù)庫20存儲從目標(biāo)數(shù)據(jù)庫10同步而來的相同數(shù)據(jù),聚合數(shù)據(jù)庫20中的次數(shù)據(jù)庫類型、數(shù)據(jù)表空間、具體的數(shù)據(jù)內(nèi)容均與目標(biāo)數(shù)據(jù)庫10保持一致。
同步程序30執(zhí)行目標(biāo)數(shù)據(jù)庫10數(shù)據(jù)聚合同步到聚合數(shù)據(jù)庫20的程序過程。
redis40將同步程序30在執(zhí)行操作時提取的數(shù)據(jù)進行存儲,并供同步程序30進行查詢。
如圖2所示,基于redis的數(shù)據(jù)庫數(shù)據(jù)聚合同步的方法包含以下步驟:
步驟1,使用同步程序30從配置文件中加載各目標(biāo)數(shù)據(jù)庫10的遠程連接信息,讀取目標(biāo)數(shù)據(jù)庫10中的表結(jié)構(gòu),然后提取每個表的字段和主鍵信息,并在聚合數(shù)據(jù)庫20中創(chuàng)建相對應(yīng)的表結(jié)構(gòu)。
步驟2,同步程序30掃描所有目標(biāo)數(shù)據(jù)庫10表的數(shù)據(jù),然后逐行計算得到每行數(shù)據(jù)(row)的key和value。同步程序30是根據(jù)數(shù)據(jù)庫表的主鍵字段對目標(biāo)數(shù)據(jù)庫10進行掃描。每行數(shù)據(jù)(row)的key和value計算方法為:首先每行數(shù)據(jù)(row)采用md5算法得到一個唯一標(biāo)識的字符串value,然后利用表名拼接該行數(shù)據(jù)(row)的主鍵字段值(如圖2所示“tbl+id”)得到一個唯一的字符串key。
md5算法,message-digestalgorith的簡稱,即消息-摘要算法,為計算機安全領(lǐng)域廣泛使用的一種散列函數(shù)。
步驟3,將步驟2中得到的key和value作為redis的k-v緩存寫入redis中,將所有目標(biāo)數(shù)據(jù)庫表10的每行數(shù)據(jù)(row)拼裝出標(biāo)準(zhǔn)的“insert”sql語句執(zhí)行寫入到聚合數(shù)據(jù)庫20中對應(yīng)的表中,完成所有目標(biāo)數(shù)據(jù)庫表10和聚合數(shù)據(jù)庫20之間的新增同步。
步驟4,當(dāng)目標(biāo)數(shù)據(jù)庫10中表的數(shù)據(jù)發(fā)生變化時,執(zhí)行步驟2,重新得到新value和新key,對于每行數(shù)據(jù)(row),判斷redis中是否存在與該行數(shù)據(jù)(row)的新key相同的key,如果不存在,則該行數(shù)據(jù)執(zhí)行步驟3,如果存在,則判斷該行數(shù)據(jù)(row)的新value與redis中存儲的相對應(yīng)的value是否相同,如果不同,則將該行數(shù)據(jù)(row)的新value覆蓋掉redis中相對應(yīng)的value,同時將該行數(shù)據(jù)(row)拼裝出標(biāo)準(zhǔn)的“update”sql語句對聚合數(shù)據(jù)庫20中對應(yīng)表中的行數(shù)據(jù)(row)進行更新,如果相同,則對該行數(shù)據(jù)(row)不用進行處理,從而完成所有目標(biāo)數(shù)據(jù)庫表10和聚合數(shù)據(jù)庫20之間的更新同步。該步驟用于將目標(biāo)數(shù)據(jù)庫10中表的發(fā)生變化的行數(shù)據(jù)(即發(fā)生變化的row)進行更新。
步驟5,將發(fā)生變化后的所有的目標(biāo)數(shù)據(jù)庫10數(shù)據(jù)的表主鍵集合(set1)與步驟4得到的聚合數(shù)據(jù)庫20相應(yīng)的表主鍵集合(set2)進行差集計算得到差集,如果差集中存在元素,則在聚合數(shù)據(jù)庫20中對應(yīng)的表生成標(biāo)準(zhǔn)的“delete”sql語句刪除聚合數(shù)據(jù)庫20中與目標(biāo)數(shù)據(jù)庫10中已刪除數(shù)據(jù)相應(yīng)的數(shù)據(jù),如果差集中不存在元素,則不用進行處理,從而完成所有目標(biāo)數(shù)據(jù)庫表10和聚合數(shù)據(jù)庫20之間的刪除同步。該步驟用于從聚合數(shù)據(jù)庫20刪除與目標(biāo)數(shù)據(jù)庫10中刪除的行數(shù)據(jù)(即刪除的row)相應(yīng)的行數(shù)據(jù)。
其中,聚合數(shù)據(jù)庫20相應(yīng)的表主鍵集合(set2)與redis中存儲的value和key所代表的行數(shù)據(jù)(row)相同。所有的目標(biāo)數(shù)據(jù)庫10數(shù)據(jù)的表主鍵集合(set1)為所有目標(biāo)數(shù)據(jù)庫10數(shù)據(jù)發(fā)生變化后的表主鍵集合。由于所有目標(biāo)數(shù)據(jù)庫10數(shù)據(jù)發(fā)生變化可能是某些行數(shù)據(jù)被刪除,因此,對set1與set2做差集后,如果存在元素,則證明目標(biāo)數(shù)據(jù)庫10在發(fā)生變化時刪掉了某些行數(shù)據(jù),此時需將聚合數(shù)據(jù)庫20中與目標(biāo)數(shù)據(jù)庫10中刪除的這些行數(shù)據(jù)相對應(yīng)的行數(shù)據(jù)刪除,即可達到聚合數(shù)據(jù)庫20與目標(biāo)數(shù)據(jù)庫10中數(shù)據(jù)相同;如果不存在元素,則說明目標(biāo)數(shù)據(jù)庫10在發(fā)生變化時沒有刪除某一行數(shù)據(jù),聚合數(shù)據(jù)庫20與目標(biāo)數(shù)據(jù)庫10中數(shù)據(jù)相同,不需要再進行任何操作。set1與set2的差集可以是將redis中存儲的value-key(代表set2)、變化后的所有的目標(biāo)數(shù)據(jù)庫10中的value-key(代表set1)進行差集。
上述實施方式為本發(fā)明的優(yōu)選案例,并不用來限制本發(fā)明的保護范圍。