本申請涉及計算機技術領域,尤其涉及一種臟數據更新方法及裝置。
背景技術:
隨著計算機技術的不斷發展,越來越多的軟件和系統都使用面向對象語言進行開發,如,大規模Web系統的開發一般都使用面向對象語言進行開發。
目前,由于使用大規模Web系統的用戶數量比較巨大,并且存儲數據的磁盤的讀寫性能低下,這樣勢必會導致服務器負載特別高,因此,需要使用內存作為緩存來提高整個大規模Web系統的性能,并且,建立面向對象緩存系統用于將向緩存中存入大規模Web系統的數據以及從緩存中獲取數據并提供給大規模Web系統。
整個數據存入的過程如圖1所示,大規模Web系統101通過外部接口102將需要寫入的數據以及該數據對應的標識(即,鍵值)傳輸給面向對象緩存系統103,面向對象緩存系統103將要寫入的數據序列化為字節流,根據該數據對應的標識將序列化成字節流的該數據寫入到緩存104中,再將該數據存入到數據庫105中。而整個數據獲取的過程如圖1所示,大規模Web系統101將待獲取的數據對應的標識(如,鍵值)通過外部接口102傳輸給面向對象緩存系統103,面向對象緩存系統103直接根據該數據對應的標識,先從緩存104中確定是否存在該標識對應的已經序列化的數據,如果存在,則將確定出的字節流反序列化成數據并通過外部接口102提供給大規模Web系統101,如果不存在,直接從數據庫105中確定該標識對應的數據,并通過外部接口102提供給大規模Web系統101。
在實際應用中,大規模Web系統對應的服務器上的服務需要不斷升級,而升級的時候有可能會更改數據庫中存儲的數據的數據結構,如,增加某數據的屬性,但是,該數據在緩存中依然不變,這樣會產生臟數據(也就是說,針對任一數據,在緩存中的該數據與數據庫中的該數據在數據結構上不一致,則該數據為臟數據),而后續,由于在將數據提供給大規模Web系統時,是需要先讀取緩存中數據,因此,可能會將臟數據通過外部接口提供給大規模Web系統,這樣勢必會使得大規模Web系統無法根據臟數據對外提供服務,也就是服務無法正常運行。
為了能夠使得服務能夠正常的運行,在現有技術中,當數據庫中的數據的數據結構發生更改,如,針對某數據,增加了該數據的屬性,需要將緩存中的數據全部清空,這樣外部系統(如,大規模Web系統)在獲取該數據時,直接訪問數據庫并從數據庫中獲取,如果訪問量巨大時,勢必會造成數據庫由于壓力過大而導致服務崩潰的問題。
技術實現要素:
本申請實施例提供一種臟數據更新方法及裝置,用以解決現有技術中當訪問量巨大時,勢必會造成數據庫由于訪問量巨大使得壓力過大而導致服務崩潰的問題。
本申請實施例提供一種臟數據更新方法,包括:
獲取對象的屬性名以及鍵值;
根據對象的屬性名,對緩存中的與鍵值對應的數據進行識別;
根據對象的屬性名識別緩存中的與鍵值對應的數據為臟數據時,根據鍵值從數據庫中獲取所述鍵值對應的數據;
根據從數據庫中獲取到的所述鍵值對應的數據,對緩存中的數據進行更新。
優選地,根據獲取到的對象的屬性名,在緩存中訪問屬性名對應的屬性,當獲取到的對象的至少一個屬性名在緩存中訪問不到對應的屬性時,確定緩存中的與鍵值對應的數據為臟數據。
優選地,調用getattr方法,從數據庫中獲取所述鍵值對應的數據。
優選地,將從數據庫中獲取到的所述鍵值對應的數據替換掉所述緩存中該鍵值對應的數據。
優選地,將從數據庫中獲取到的所述鍵值對應的數據構造成對象,并將該對象序列化為字節流,根據所述鍵值,在緩存中確定該鍵值對應的數據,將序列化字節流后的數據替換掉在緩存中確定出的該鍵值對應的數據。
本申請實施例提供一種臟數據更新裝置,包括:
第一獲取模塊,用于獲取對象的屬性名以及鍵值;
臟數據確定模塊,用于根據對象的屬性名,對緩存中的與鍵值對應的數據進行識別;
第二獲取模塊,用于根據對象的屬性名識別緩存中的與鍵值對應的數據為臟數據時,根據鍵值從數據庫中獲取所述鍵值對應的數據;
更新模塊,用于根據從數據庫中獲取到的所述鍵值對應的數據,對緩存中的數據進行更新。
優選地,所述臟數據確定模塊具體用于,根據獲取到的對象的屬性名,在緩存中訪問屬性名對應的屬性,當獲取到的對象的至少一個屬性名在緩存中訪問不到對應的屬性時,確定緩存中的與鍵值對應的數據為臟數據。
優選地,所述第二獲取模塊具體用于,調用getattr方法,從數據庫中獲取所述鍵值對應的數據。
優選地,所述更新模塊具體用于,將從數據庫中獲取到的所述鍵值對應的數據替換掉所述緩存中該鍵值對應的數據。
優選地,所述更新模塊具體用于,將從數據庫中獲取到的所述鍵值對應的數據構造成對象,并將該對象序列化為字節流,根據所述鍵值,在緩存中確定該鍵值對應的數據,將序列化字節流后的數據替換掉在緩存中確定出的該鍵值對應的數據。
本申請實施例提供一種臟數據更新方法及裝置,該方法首先獲取對象的屬性名以及鍵值,根據對象的屬性名,對緩存中的與鍵值對應的數據進行識別,根據對象的屬性名識別緩存中的與鍵值對應的數據為臟數據時,根據鍵值從數據庫中獲取該鍵值對應的數據,根據從數據庫中獲取到的該鍵值對應的數據,對緩存中的數據進行更新。通過上述方法,即使緩存中存在臟數據,也不用再清空緩存,而是對緩存中的臟數據進行識別,并對識別出的臟數據進行平滑更新,這樣可有效的解決數據庫由于訪問量巨大使得壓力過大而導致服務崩潰的問題。
附圖說明
此處所說明的附圖用來提供對本申請的進一步理解,構成本申請的一部分,本申請的示意性實施例及其說明用于解釋本申請,并不構成對本申請的不當限定。在附圖中:
圖1為本申請實施例提供的一種現有技術中存入和獲取數據的過程示意圖;
圖2為本申請實施例提供的一種臟數據更新的過程示意圖;
圖3為本申請實施例提供的一種臟數據更新裝置的結構示意圖。
具體實施方式
為使本申請的目的、技術方案和優點更加清楚,下面將結合本申請具體實施例及相應的附圖對本申請技術方案進行清楚、完整地描述。顯然,所描述的實施例僅是本申請一部分實施例,而不是全部的實施例。基于本申請中的實施例,本領域普通技術人員在沒有做出創造性勞動前提下所獲得的所有其他實施例,都屬于本申請保護的范圍。
圖2為本申請實施例提供的臟數據更新過程,具體包括以下步驟:
S201:獲取對象的屬性名以及鍵值。
在實際應用中,有些對外提供服務的系統通常都會使用面向對象語言進行開發,如,大規模Web系統的開發使用的就是面向對象語言進行開發的。
而使用面向對象語言進開發的系統在從緩存或數據庫中存儲和獲取數據時,都是以對象為整體進行存儲和讀取的,也就是說,將數據作為一個對象,并對該對象包含的數據進行存儲和獲取,對象中可包含一個數據,也可以包含多個數據,每個對象包含多少數據是可以預先定義的。所述對象為要執行或操作的任何事物,可以表示具體的事物,也可以表示抽象的事物,如,規則,并且,由于屬性能夠描述刻畫一個對象,因此,每個對象都是有各自的屬性的,如,售賣的蘋果是一個對象,蘋果有顏色:紅色、重量:0.5千克這兩個屬性,而每個屬性均包含屬性名和屬性值,如,蘋果的顏色為紅色,重量為0.5千克,則顏色以及重量為屬性的屬性名,而紅色以及0.5千克為屬性的屬性值。
進一步的,為了方便外部系統對存儲在緩存或者數據庫中的對象,因此,在緩存或數據庫中存儲對象的過程中,會為該對象確定一個鍵值,也就是說,為該對象確定一個唯一的標識,通過該鍵值能夠唯一確定出該對象。
由于鍵值只是能夠確定出需要獲取哪個對象對應的數據,而具體需要獲取該對象中的哪個屬性(其中,所述屬性包含屬性名和屬性值)時是由屬性名決定的,因此,在本申請中,外部系統為了對外提供服務而在緩存中獲取對象時,需要將待獲取對象的屬性名以及鍵值通過外部接口傳輸給面向對象緩存系統,面向對象緩存系統在獲取到對象的屬性名以及鍵值后,可直接根據對象的屬性名以及鍵值去緩存中查詢。
例如,某倉儲系統用于對外提供查詢服務,倉儲系統此刻接收到用戶輸入的查詢對象:蘋果,假設原先蘋果對應的鍵值為:XX,蘋果包含兩個屬性,顏色:紅色以及重量:0.5千克,后續,根據實際需求在數據庫中將蘋果(對象)對應的數據進行了更改(即,對蘋果對應的屬性進行了更改),在原來兩個屬性的基礎之上增加一個屬性:價格1RMB,但是緩存中的蘋果對應的屬性還是原來的兩個屬性,因此,倉儲系統將蘋果對應的鍵值(即,XX)以及蘋果的三個屬性名(顏色、重量和價格)通過外部接口傳輸給面向對象緩存系統,面向對象緩存系統在接收到倉儲系統傳輸的蘋果對應的三個屬性名以及鍵值后執行步驟S202。
S202:根據對象的屬性名,對緩存中的與鍵值對應的數據進行識別。
S203:根據對象的屬性名識別緩存中的與鍵值對應的數據為臟數據時,根據鍵值從數據庫中獲取所述鍵值對應的數據。
由于在實際應用中,外部系統對應的服務器上的服務需要不斷升級,而升級的時候有可能會更改數據庫中存儲的某對象對應的數據的數據結構,如,增加某對象的屬性,但是,該對象對應的數據在緩存中依然不變,這樣會產生臟數據(也就是說,針對任一數據,在緩存中的該數據與數據庫中的該數據在數據結構上不一致,則該數據為臟數據),而在本申請中,屬性缺失的對象所對應的數據即為臟數據,并且,屬性缺失的對象是無法通過外部接口直接提供給外部系統的,需要通過特定的方式去繼續查詢缺少的屬性所對應的數據,因此,在本申請中,面向對象緩存系統在獲取到外部系統通過接口傳輸的對象的屬性名和鍵值后,需要根據對象的屬性名,對緩存中的與鍵值對應的數據進行識別,確定緩存中的與鍵值對應的數據是不是臟數據。
進一步的,由于在緩存中存儲對象對應的數據中包含對象的屬性名,因此,本申請提供了一種根據對象的屬性名來識別緩存的數據為臟數據(即,屬性缺失的對象)的方法,具體的,可以根據對象的鍵值,在緩存中查詢該鍵值對應的對象,也就是說,查詢該鍵值對應的數據,在查詢出該鍵值對應的數據(也即,該鍵值對應的對象的數據)后,則根據獲取到的對象的屬性名,在緩存中訪問屬性名對應的屬性,當獲取到的對象的至少一個屬性名在緩存中訪問不到對應的屬性時(也即,屬性缺失),其中,所述屬性包括屬性名和屬性值,確定緩存的與鍵值對應的數據為臟數據。
在此需要說明的是,如果識別出的數據不是臟數據,則直接在該鍵值對應的數據中確定屬性名對應的屬性,將查詢到的屬性數據對應的字節流反序列化為相應的包含數據的對象,并將該包含數據的對象通過外部接口返回給外部系統。
進一步的,由于通常情況下,如果出現屬性缺失是因為數據庫中的數據的數據結構被更改,如,增加了某對象的屬性,而被更改的數據在緩存中卻依然不會改變,也就是說,數據庫中的數據的數據結構是全的,也是最新的、正確的,因此,在本申請中,當出現屬性缺失(即,臟數據)這種情況,需要通過特定的方式去繼續查詢缺少的屬性所對應的數據時,具體查詢方式直接調用getattr方法,從數據庫中獲取該鍵值對應的數據,在此著重強調在本申請中,該getattr方法可以實現從數據庫中獲取該鍵值對應的數據的功能。
在此需要說明的是,在從數據庫中獲取數據時,可只獲取所缺失的屬性對應的數據,也可以將鍵值對應的對象包含的數據全部獲取到。
延續上例,面向對象緩存系統首先根據鍵值在緩存中查詢蘋果對應的數據,在緩存中根據鍵值:XX,查詢到蘋果對應的數據“顏色:紅色,重量:0.5千克”,并根據獲取到的蘋果(即,對象)的“顏色、重量以及價格”這三個屬性名,在緩存中訪問屬性名對應的屬性,確定獲取到的對象的至少一個屬性名在緩存中訪問不到對應的屬性時(也即,緩存中不存在價格這一屬性對應的屬性名和屬性值,也就是屬性缺失),確定緩存的與鍵值“XX”對應的數據為臟數據,調用getattr方法,從數據庫中獲取該鍵值:XX對應的數據“顏色:紅色、重量0.5千克以及價格1RMB”。
S204:根據從數據庫中獲取到的所述鍵值對應的數據,對緩存中的數據進行更新。
在本申請中,為了能夠使外部系統繼續能在緩存中查找到數據,而不是去數據庫中查找到數據,以此降低數據庫的運行壓力,因此,在通過特定的方式獲取到所述鍵值對應的對象所包含的所有數據后,可根據該鍵值對應的所有數據,對緩存中的數據進行更新。
具體可以將從數據庫中獲取到的該鍵值對應的數據替換掉該緩存中該鍵鍵值對應的數據,在此需要說明的是,可只替換缺失的屬性對應的數據,也可以,將鍵值對應的所有數據整體替換掉緩存中該鍵值對應的所有數據。
進一步的,在將數據庫中獲取到的該鍵值對應的數據替換掉緩存中該鍵值對應的數據的過程中,需要將從數據庫中獲取到的該鍵值對應的數據構造成對象,并對該對象序列化字節流,并根據該鍵值,在緩存中確定出該鍵值對應的數據,將序列化字節流后的數據替換掉在緩存中確定出的該鍵值對應的數據。
繼續沿用上例,在數據庫中獲取到鍵值:XX對應的數據后,將數據“顏色:紅色、重量0.5千克以及價格1RMB”構造成對象,并將該對象序列化為字節流,并根據該鍵值:XX,在緩存中確定出該鍵值:XX對應的數據“顏色:紅色、重量:0.5千克”,將序列化字節流后的數據“顏色:紅色、重量0.5千克以及價格1RMB”替換掉在緩存中確定出的該鍵值對應的數據“顏色:紅色、重量:0.5千克”。
通過上述方法,即使緩存中存在臟數據,也不用再清空緩存,可對緩存中的臟數據進行識別,并對識別出的臟數據進行平滑更新,這樣可有效的解決數據庫由于壓力過大而導致服務崩潰的問題。
以上為本申請實施例提供的臟數據更新方法,基于同樣的思路,本申請實施例還提供一種臟數據更新裝置。
如圖3所示,本申請實施例提供的一種臟數據更新裝置,包括:
第一獲取模塊301,用于獲取對象的屬性名以及鍵值;
臟數據確定模塊302,用于根據對象的屬性名,對緩存中的與鍵值對應的數據進行識別;
第二獲取模塊303,用于根據對象的屬性名識別緩存中的與鍵值對應的數據為臟數據時,根據鍵值從數據庫中獲取所述鍵值對應的數據;
更新模塊304,用于根據從數據庫中獲取到的所述鍵值對應的數據,對緩存中的數據進行更新。
所述臟數據確定模塊302具體用于,根據獲取到的對象的屬性名,在緩存中訪問屬性名對應的屬性,當獲取到的對象的至少一個屬性名在緩存中訪問不到對應的屬性時,確定緩存中的與鍵值對應的數據為臟數據。
所述第二獲取模塊303具體用于,調用getattr方法,從數據庫中獲取所述鍵值對應的數據。
所述更新模塊304具體用于,將從數據庫中獲取到的所述鍵值對應的數據替換掉所述緩存中該鍵值對應的數據。
所述更新模塊304具體用于,將從數據庫中獲取到的所述鍵值對應的數據構造成對象,并將該對象序列化為字節流,根據所述鍵值,在緩存中確定該鍵值對應的數據,將序列化字節流后的數據替換掉在緩存中確定出的該鍵值對應的數據。
在一個典型的配置中,計算設備包括一個或多個處理器(CPU)、輸入/輸出接口、網絡接口和內存。
內存可能包括計算機可讀介質中的非永久性存儲器,隨機存取存儲器(RAM)和/或非易失性內存等形式,如只讀存儲器(ROM)或閃存(flash RAM)。內存是計算機可讀介質的示例。
計算機可讀介質包括永久性和非永久性、可移動和非可移動媒體可以由任何方法或技術來實現信息存儲。信息可以是計算機可讀指令、數據結構、程序的模塊或其他數據。計算機的存儲介質的例子包括,但不限于相變內存(PRAM)、靜態隨機存取存儲器(SRAM)、動態隨機存取存儲器(DRAM)、其他類型的隨機存取存儲器(RAM)、只讀存儲器(ROM)、電可擦除可編程只讀存儲器(EEPROM)、快閃記憶體或其他內存技術、只讀光盤只讀存儲器(CD-ROM)、數字多功能光盤(DVD)或其他光學存儲、磁盒式磁帶,磁帶磁磁盤存儲或其他磁性存儲設備或任何其他非傳輸介質,可用于存儲可以被計算設備訪問的信息。按照本文中的界定,計算機可讀介質不包括暫存電腦可讀媒體(transitory media),如調制的數據信號和載波。
還需要說明的是,術語“包括”、“包含”或者其任何其他變體意在涵蓋非排他性的包含,從而使得包括一系列要素的過程、方法、商品或者設備不僅包括那些要素,而且還包括沒有明確列出的其他要素,或者是還包括為這種過程、方法、商品或者設備所固有的要素。在沒有更多限制的情況下,由語句“包括一個……”限定的要素,并不排除在包括所述要素的過程、方法、商品或者設備中還存在另外的相同要素。
本領域技術人員應明白,本申請的實施例可提供為方法、系統或計算機程序產品。因此,本申請可采用完全硬件實施例、完全軟件實施例或結合軟件和硬件方面的實施例的形式。而且,本申請可采用在一個或多個其中包含有計算機可用程序代碼的計算機可用存儲介質(包括但不限于磁盤存儲器、CD-ROM、光學存儲器等)上實施的計算機程序產品的形式。
以上所述僅為本申請的實施例而已,并不用于限制本申請。對于本領域技術人員來說,本申請可以有各種更改和變化。凡在本申請的精神和原理之內所作的任何修改、等同替換、改進等,均應包含在本申請的權利要求范圍之內。