本發(fā)明涉及數(shù)據(jù)處理領(lǐng)域,具體而言,涉及一種緩存數(shù)據(jù)處理方法及裝置。
背景技術(shù):
在計(jì)算機(jī)程序運(yùn)行中,緩存機(jī)制被大量使用,正確使用緩存能大幅度提高程序的性能。在多線程運(yùn)行的程序中,通常需要對緩存數(shù)據(jù)在多線程之間共享、在讀寫線程之間同步等問題進(jìn)行協(xié)調(diào)。為了協(xié)調(diào)多個線程對緩存數(shù)據(jù)的讀寫,常用的技術(shù)方案有排他鎖和寫時復(fù)制(Copy On Write)兩種,其中,排他鎖是指使用一個鎖表示線程對緩存數(shù)據(jù)的擁有權(quán),線程讀寫緩存數(shù)據(jù)前先要獲取這個鎖,獲得這個鎖的線程即可以對緩存數(shù)據(jù)進(jìn)行讀寫操作,其他線程則不能對該緩存數(shù)據(jù)進(jìn)行操作,例如,獨(dú)占鎖、讀寫鎖等。采用排他鎖的方式協(xié)調(diào)多個線程對緩存數(shù)據(jù)的讀寫容易頻繁阻塞線程,影響程序的并發(fā)能力。寫時復(fù)制是指對緩存數(shù)據(jù)進(jìn)行編輯操作前,先拷貝一份該緩存數(shù)據(jù),并對拷貝的緩存數(shù)據(jù)進(jìn)行編輯,后續(xù)的線程對拷貝的緩存數(shù)據(jù)進(jìn)行操作。采用寫時復(fù)制的方式協(xié)調(diào)多個線程對緩存數(shù)據(jù)的讀寫時,在緩存數(shù)據(jù)量多、緩存數(shù)據(jù)對象較大的情況下,頻繁進(jìn)行拷貝操作一方面效率較低,另一方面會消耗大量內(nèi)存資源。
針對相關(guān)技術(shù)中在實(shí)現(xiàn)多個線程讀寫緩存數(shù)據(jù)而不阻塞線程時效率較低的問題,目前尚未提出有效的解決方案。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明的主要目的在于提供一種緩存數(shù)據(jù)處理方法及裝置,以解決相關(guān)技術(shù)中在實(shí)現(xiàn)多個線程讀寫緩存數(shù)據(jù)而不阻塞線程時效率較低的問題。
為了實(shí)現(xiàn)上述目的,根據(jù)本發(fā)明的一個方面,提供了一種緩存數(shù)據(jù)處理方法。根據(jù)本發(fā)明的緩存數(shù)據(jù)處理方法包括:獲取緩存表,其中,緩存表中存儲有緩存數(shù)據(jù)的名稱和緩存數(shù)據(jù)的存儲地址之間的映射關(guān)系;從緩存表中讀取映射關(guān)系;以及根據(jù)映射關(guān)系對緩存數(shù)據(jù)執(zhí)行讀寫操作。
進(jìn)一步地,根據(jù)映射關(guān)系對緩存數(shù)據(jù)執(zhí)行讀寫操作包括:獲取讀數(shù)據(jù)請求;根據(jù)讀數(shù)據(jù)請求獲取待讀取數(shù)據(jù)的名稱,其中,緩存數(shù)據(jù)包括待讀取數(shù)據(jù);從映射關(guān)系中查找與待讀取數(shù)據(jù)的名稱對應(yīng)的存儲地址;以及根據(jù)待讀取數(shù)據(jù)的名稱對應(yīng)的存儲地址讀取待讀取數(shù)據(jù)。
進(jìn)一步地,緩存表包括第一緩存表和第二緩存表,根據(jù)映射關(guān)系對緩存數(shù)據(jù)執(zhí)行讀寫操作包括:獲取寫數(shù)據(jù)請求;根據(jù)寫數(shù)據(jù)請求在緩存中生成待更新數(shù)據(jù);獲取待更新數(shù)據(jù)的存儲地址;將第一緩存表中存儲的緩存數(shù)據(jù)的名稱和緩存數(shù)據(jù)的存儲地址之間的映射關(guān)系復(fù)制至第二緩存表中;以及根據(jù)待更新數(shù)據(jù)的存儲地址更新第二緩存表中存儲的映射關(guān)系。
進(jìn)一步地,寫數(shù)據(jù)請求為多個寫數(shù)據(jù)請求,獲取寫數(shù)據(jù)請求包括:分別獲取多個寫數(shù)據(jù)請求,根據(jù)寫數(shù)據(jù)請求在緩存中生成待更新數(shù)據(jù)包括:判斷多個寫數(shù)據(jù)請求是否可合并,其中,在判斷出多個寫數(shù)據(jù)請求可合并時,對多個寫數(shù)據(jù)請求進(jìn)行合并,得到第一寫數(shù)據(jù)請求;以及根據(jù)第一寫數(shù)據(jù)請求在緩存中生成待更新數(shù)據(jù)。
進(jìn)一步地,緩存表還存儲有時間戳,時間戳用于表示緩存表的生成時間,當(dāng)緩存表為多個緩存表時,從緩存表中讀取映射關(guān)系包括:分別獲取多個緩存表的時間戳,得到多個時間戳;獲取多個時間戳中最晚的時間戳;以及從最晚的時間戳對應(yīng)的緩存表中讀取映射關(guān)系。
進(jìn)一步地,緩存表還存儲有標(biāo)識符,標(biāo)識符用于表示緩存表是否可讀,其中,當(dāng)標(biāo)識符為第一值時,緩存表可讀,當(dāng)標(biāo)識符為第二值時,緩存表不可讀。
為了實(shí)現(xiàn)上述目的,根據(jù)本發(fā)明的另一方面,提供了一種緩存數(shù)據(jù)處理裝置。根據(jù)本發(fā)明的緩存數(shù)據(jù)處理裝置包括:獲取單元,用于獲取緩存表,其中,緩存表中存儲有緩存數(shù)據(jù)的名稱和緩存數(shù)據(jù)的存儲地址之間的映射關(guān)系;讀取單元,用于從緩存表中讀取映射關(guān)系;以及讀寫單元,用于根據(jù)映射關(guān)系對緩存數(shù)據(jù)執(zhí)行讀寫操作。
進(jìn)一步地,讀寫單元包括:第一獲取模塊,用于獲取讀數(shù)據(jù)請求;第二獲取模塊,用于根據(jù)讀數(shù)據(jù)請求獲取待讀取數(shù)據(jù)的名稱,其中,緩存數(shù)據(jù)包括待讀取數(shù)據(jù);查找模塊,用于從映射關(guān)系中查找與待讀取數(shù)據(jù)的名稱對應(yīng)的存儲地址;以及讀模塊,用于根據(jù)待讀取數(shù)據(jù)的名稱對應(yīng)的存儲地址讀取待讀取數(shù)據(jù)。
進(jìn)一步地,緩存表包括第一緩存表和第二緩存表,讀寫單元包括:第三獲取模塊,用于獲取寫數(shù)據(jù)請求;生成模塊,用于根據(jù)寫數(shù)據(jù)請求在緩存中生成待更新數(shù)據(jù);第四獲取模塊,用于獲取待更新數(shù)據(jù)的存儲地址;復(fù)制模塊,用于將第一緩存表中存儲的緩存數(shù)據(jù)的名稱和緩存數(shù)據(jù)的存儲地址之間的映射關(guān)系復(fù)制至第二緩存表中;以及更新模塊,用于根據(jù)待更新數(shù)據(jù)的存儲地址更新第二緩存表中存儲的映射關(guān)系。
進(jìn)一步地,緩存表還存儲有時間戳,時間戳用于表示緩存表的生成時間,當(dāng)緩存表為多個緩存表時,讀取單元包括:第五獲取模塊,用于分別獲取多個緩存表的時間戳,得到多個時間戳;第六獲取模塊,用于獲取多個時間戳中最晚的時間戳;以及讀取模塊,用于從最晚的時間戳對應(yīng)的緩存表中讀取映射關(guān)系。
通過本發(fā)明,采用獲取緩存表,其中,緩存表中存儲有緩存數(shù)據(jù)的名稱和緩存數(shù)據(jù)的存儲地址之間的映射關(guān)系;從緩存表中讀取映射關(guān)系;以及根據(jù)映射關(guān)系對緩存數(shù)據(jù)執(zhí)行讀寫操作,解決了相關(guān)技術(shù)中在實(shí)現(xiàn)多個線程讀寫緩存數(shù)據(jù)而不阻塞線程時效率較低的問題,進(jìn)而達(dá)到了在保證線程不堵塞時提高讀寫緩存數(shù)據(jù)的效率的效果。
附圖說明
構(gòu)成本申請的一部分的附圖用來提供對本發(fā)明的進(jìn)一步理解,本發(fā)明的示意性實(shí)施例及其說明用于解釋本發(fā)明,并不構(gòu)成對本發(fā)明的不當(dāng)限定。在附圖中:
圖1是根據(jù)本發(fā)明實(shí)施例的緩存數(shù)據(jù)處理方法的流程圖;
圖2是根據(jù)本發(fā)明實(shí)施例的緩存數(shù)據(jù)更新的示意圖;以及
圖3是根據(jù)本發(fā)明實(shí)施例的緩存數(shù)據(jù)處理裝置的示意圖。
具體實(shí)施方式
需要說明的是,在不沖突的情況下,本申請中的實(shí)施例及實(shí)施例中的特征可以相互組合。下面將參考附圖并結(jié)合實(shí)施例來詳細(xì)說明本發(fā)明。
為了使本技術(shù)領(lǐng)域的人員更好地理解本申請方案,下面將結(jié)合本申請實(shí)施例中的附圖,對本申請實(shí)施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實(shí)施例僅僅是本申請一部分的實(shí)施例,而不是全部的實(shí)施例?;诒旧暾堉械膶?shí)施例,本領(lǐng)域普通技術(shù)人員在沒有做出創(chuàng)造性勞動前提下所獲得的所有其他實(shí)施例,都應(yīng)當(dāng)屬于本申請保護(hù)的范圍。
需要說明的是,本申請的說明書和權(quán)利要求書及上述附圖中的術(shù)語“第一”、“第二”等是用于區(qū)別類似的對象,而不必用于描述特定的順序或先后次序。應(yīng)該理解這樣使用的數(shù)據(jù)在適當(dāng)情況下可以互換,以便這里描述的本申請的實(shí)施例。此外,術(shù)語“包括”和“具有”以及他們的任何變形,意圖在于覆蓋不排他的包含,例如,包含了一系列步驟或單元的過程、方法、系統(tǒng)、產(chǎn)品或設(shè)備不必限于清楚地列出的那些步驟或單元,而是可包括沒有清楚地列出的或?qū)τ谶@些過程、方法、產(chǎn)品或設(shè)備固有的其它步驟或單元。
本發(fā)明實(shí)施例提供了一種緩存數(shù)據(jù)處理方法。圖1是根據(jù)本發(fā)明實(shí)施例的緩存數(shù)據(jù)處理方法的流程圖。
如圖1所示,該緩存數(shù)據(jù)處理方法包括如下的步驟S101至步驟S103:
步驟S101:獲取緩存表,其中,緩存表中存儲有緩存數(shù)據(jù)的名稱和緩存數(shù)據(jù)的存儲地址之間的映射關(guān)系。
緩存表可以是鏈表、哈希表等,以引用的方式指向緩存數(shù)據(jù),例如,在表1所示的緩存表中,Obj_1對應(yīng)于0x001,Obj_2對應(yīng)于0x002,通過存儲地址0x001和0x002即可以找到Obj_1和Obj_2對應(yīng)的緩存數(shù)據(jù)。需要說明的是,表1僅是本發(fā)明實(shí)施例的緩存表的一種可選地表示形式,此外,本發(fā)明實(shí)施例在每次對緩存數(shù)據(jù)進(jìn)行更新后都生成新的緩存表,其中,新的緩存表中存儲著更新后的緩存數(shù)據(jù)的名稱和存儲地址的映射關(guān)系。
表1緩存表
優(yōu)選地,為了保證線程每次讀寫的是最新的緩存數(shù)據(jù),本發(fā)明實(shí)施例的緩存表還存儲有時間戳,時間戳用于表示緩存表的生成時間,當(dāng)緩存表為多個緩存表時,從緩存表中讀取映射關(guān)系包括:分別獲取多個緩存表的時間戳,得到多個時間戳;獲取多個時間戳中最晚的時間戳;以及從最晚的時間戳對應(yīng)的緩存表中讀取映射關(guān)系。
例如,當(dāng)前系統(tǒng)中僅存在緩存表1和緩存表2,其中,緩存表1是在2015年03月03日12:00:00創(chuàng)建的,則緩存表1中存儲的時間戳為20150303-12:00:00,緩存表2是在2015年03月03日12:01:00創(chuàng)建的,則緩存表2中存儲的時間戳為20150303-12:01:00,根據(jù)時間戳可以直觀地得到緩存表2的創(chuàng)建時間晚于緩存表1的創(chuàng)建時間,由此可知緩存表2對應(yīng)于最新的緩存數(shù)據(jù)。由于讀寫線程在對緩存數(shù)據(jù)進(jìn)行讀寫時,每次根據(jù)最晚的時間戳對應(yīng)的緩存表中存儲的映射關(guān)系來實(shí)現(xiàn)對緩存數(shù)據(jù)的讀寫,從而保證每次讀寫的都是最新的緩存數(shù)據(jù)。
步驟S102:從緩存表中讀取映射關(guān)系。
步驟S103:根據(jù)映射關(guān)系對緩存數(shù)據(jù)執(zhí)行讀寫操作。
本發(fā)明實(shí)施例通過緩存表實(shí)現(xiàn)多線程對緩存數(shù)據(jù)同時執(zhí)行讀寫操作,具體地,當(dāng)多個線程同時讀取緩存數(shù)據(jù)時,多個線程可以同時讀取緩存表中存儲的映射關(guān)系來實(shí)現(xiàn)對緩存數(shù)據(jù)的讀取,當(dāng)多個線程同時讀寫緩存數(shù)據(jù)時,為了便于描述,將上一次被讀寫的緩存表稱為原緩存表,將原緩存表中存儲的映射關(guān)系拷貝至新生成的緩存表中, 寫線程基于新生成的緩存表實(shí)現(xiàn)對緩存數(shù)據(jù)的寫操作,讀線程繼續(xù)根據(jù)原緩存表實(shí)現(xiàn)對緩存數(shù)據(jù)的讀操作,從而實(shí)現(xiàn)同時讀寫緩存數(shù)據(jù)而不阻塞線程,此外,寫操作時僅拷貝原緩存表中的映射關(guān)系,相比于現(xiàn)有技術(shù)中在寫操作時拷貝整個緩存數(shù)據(jù),數(shù)據(jù)量大大減少,提高了讀寫緩存數(shù)據(jù)的效率,而且能夠減少內(nèi)存資源的占用,解決了相關(guān)技術(shù)中在實(shí)現(xiàn)多個線程讀寫緩存數(shù)據(jù)而不阻塞線程時效率較低的問題。
可選地,根據(jù)映射關(guān)系對緩存數(shù)據(jù)執(zhí)行讀寫操作包括:獲取讀數(shù)據(jù)請求;根據(jù)讀數(shù)據(jù)請求獲取待讀取數(shù)據(jù)的名稱,其中,緩存數(shù)據(jù)包括待讀取數(shù)據(jù);從映射關(guān)系中查找與待讀取數(shù)據(jù)的名稱對應(yīng)的存儲地址;以及根據(jù)待讀取數(shù)據(jù)的名稱對應(yīng)的存儲地址讀取待讀取數(shù)據(jù)。
當(dāng)接收到讀數(shù)據(jù)請求時,根據(jù)讀數(shù)據(jù)請求可以得到待讀取數(shù)據(jù)的名稱,通常,在讀數(shù)據(jù)請求中包含了待讀取數(shù)據(jù)的名稱。例如,在表1所示的緩存表中,當(dāng)前需要讀取名稱為Obj_1的緩存數(shù)據(jù)時,則首先在讀數(shù)據(jù)請求中獲取該緩存數(shù)據(jù)的名稱Obj_1,根據(jù)該緩存數(shù)據(jù)的名稱Obj_1從緩存表中存儲的映射關(guān)系中可以查詢到該緩存數(shù)據(jù)的存儲地址0x001,根據(jù)該緩存數(shù)據(jù)的存儲地址0x001即可以讀取到該緩存數(shù)據(jù)。需要說明的是,上述讀數(shù)據(jù)請求可以是一個,也可以是多個。
優(yōu)選地,為了提高對緩存數(shù)據(jù)進(jìn)行更新的效率,緩存表包括第一緩存表和第二緩存表,根據(jù)映射關(guān)系對緩存數(shù)據(jù)執(zhí)行讀寫操作包括:獲取寫數(shù)據(jù)請求;根據(jù)寫數(shù)據(jù)請求在緩存中生成待更新數(shù)據(jù);獲取待更新數(shù)據(jù)的存儲地址;將第一緩存表中存儲的緩存數(shù)據(jù)的名稱和緩存數(shù)據(jù)的存儲地址之間的映射關(guān)系復(fù)制至第二緩存表中;以及根據(jù)待更新數(shù)據(jù)的存儲地址更新第二緩存表中存儲的映射關(guān)系。
為了保證在寫線程對緩存數(shù)據(jù)進(jìn)行更新操作時,讀線程可以同時對緩存數(shù)據(jù)進(jìn)行讀操作,本發(fā)明實(shí)施例將第一緩存表中存儲的映射關(guān)系拷貝至第二緩存表中,寫線程基于第二緩存表對緩存數(shù)據(jù)進(jìn)行更新操作,而讀線程可以繼續(xù)基于第一緩存表讀取緩存數(shù)據(jù)。
具體地,在寫數(shù)據(jù)請求中通常包含有待更新數(shù)據(jù)的名稱,當(dāng)需要向緩存中寫入新的數(shù)據(jù)時,可以在寫數(shù)據(jù)請求中包含待寫入數(shù)據(jù)和待寫入數(shù)據(jù)的名稱,例如,待寫入數(shù)據(jù)為mkj,待寫入數(shù)據(jù)的名稱為Obj_3,首先根據(jù)寫數(shù)據(jù)請求可以獲取到mkj和Obj_3,其次在緩存中新的位置處存儲mkj,假設(shè)mkj在緩存中存儲地址為0x003,獲取mkj的存儲地址0x003,最后將0x003和Obj_3更新至第二緩存表中存儲的映射關(guān)系中,即在第二緩存表中存儲的映射關(guān)系中增加Obj_3和0x003的映射關(guān)系。當(dāng)需要變更某個緩存數(shù)據(jù)的值時,可以在寫數(shù)據(jù)請求中包含待變更數(shù)據(jù)的名稱和變更后取值,例如,緩存數(shù)據(jù)中待變更數(shù)據(jù)的名稱為Obj_2,將其值由abc變更為edf時,首先根據(jù)寫數(shù)據(jù)請求獲取到Obj_2和edf,其次在緩存中新的位置處存儲edf,假設(shè)edf在緩存 中存儲的地址為0x012,獲取edf在緩存中存儲的地址0x012,最后在第二緩存表中將Obj_2的映射地址替換為0x012。由于在對緩存數(shù)據(jù)進(jìn)行更新操作時,是在緩存的新的位置存儲更新的數(shù)據(jù),而緩存中原先存儲的數(shù)據(jù)并沒有發(fā)生變化,因此,可以避免在寫線程更新緩存數(shù)據(jù)時讀線程因緩存數(shù)據(jù)丟失等出現(xiàn)異常。在寫線程完成更新緩存數(shù)據(jù)后,后續(xù)的線程可以根據(jù)第二緩存表中存儲的映射關(guān)系對緩存數(shù)據(jù)進(jìn)行讀寫,從而保證對最新緩存數(shù)據(jù)進(jìn)行讀寫。
優(yōu)選地,為了避免大量的緩存表和已經(jīng)被更新的緩存數(shù)據(jù)占用內(nèi)存資源,在每次完成緩存數(shù)據(jù)更新后,自動釋放內(nèi)存中之前存儲的緩存表和更新前的緩存數(shù)據(jù)以節(jié)省內(nèi)存空間。
優(yōu)選地,為了避免讀線程因讀取處于更新過程中的緩存數(shù)據(jù)導(dǎo)致線程異常,緩存表還存儲有標(biāo)識符,標(biāo)識符用于表示緩存表是否可讀,其中,當(dāng)標(biāo)識符為第一值時,緩存表可讀,當(dāng)標(biāo)識符為第二值時,緩存表不可讀。
標(biāo)識符可以設(shè)為任意字符,例如,標(biāo)識符設(shè)為state,當(dāng)state為1時表示該緩存表可讀,當(dāng)state為0時表示該緩存表不可讀,此時,讀線程不可以對該緩存表執(zhí)行讀操作。通常,在緩存表更新過程中將其設(shè)置為不可讀,在緩存表完成更新后再將其設(shè)置為可讀,從而使得后續(xù)線程可以讀取到最新的緩存數(shù)據(jù)。
優(yōu)選地,為了進(jìn)一步提高對緩存數(shù)據(jù)進(jìn)行更新的效率,寫數(shù)據(jù)請求為多個寫數(shù)據(jù)請求,獲取寫數(shù)據(jù)請求包括:分別獲取多個寫數(shù)據(jù)請求,根據(jù)寫數(shù)據(jù)請求在緩存中生成待更新數(shù)據(jù)包括:判斷多個寫數(shù)據(jù)請求是否可合并,其中,在判斷出多個寫數(shù)據(jù)請求可合并時,對多個寫數(shù)據(jù)請求進(jìn)行合并,得到第一寫數(shù)據(jù)請求;以及根據(jù)第一寫數(shù)據(jù)請求在緩存中生成待更新數(shù)據(jù)。
本發(fā)明實(shí)施例在獲取多個寫數(shù)據(jù)請求時,可以先分析多個寫數(shù)據(jù)請求的關(guān)系,例如,多個寫數(shù)據(jù)請求之間是否存在包含關(guān)系,是否可以進(jìn)行合并等,如果分析出多個寫數(shù)據(jù)請求可以合并,則對其進(jìn)行合并,可以避免冗余的寫數(shù)據(jù)請求,并減少數(shù)據(jù)更新的次數(shù),從而可以提高緩存數(shù)據(jù)更新的效率。
圖2是根據(jù)本發(fā)明實(shí)施例的緩存數(shù)據(jù)更新的示意圖。如圖2所示,緩存表1中存儲的映射關(guān)系為{Obj_1:0x001,Obj_2:0x002,Obj_3:0x003,Obj_4:0x009,Obj_5:0x010},其中,Obj_1、Obj_2、Obj_3、Obj_4和Obj_5為緩存數(shù)據(jù)的名稱,0x001、0x002、0x003、0x009和0x010為緩存數(shù)據(jù)的存儲地址,時間戳為20150326-09:10:20。當(dāng)在時刻20150326-10:03:30時寫線程需要將緩存數(shù)據(jù){Obj_2:0x002->abc}的值更新為mjk,即將Obj_2的值由abc更新為mjk,具體過程如下:
步驟S201:生成緩存表2,緩存表2的時間戳為20150326-10:03:30,并將緩 存表2設(shè)置為不可讀。
步驟S202:將緩存表1中的所有映射關(guān)系{Obj_1:0x001,Obj_2:0x002,Obj_3:0x003,Obj_4:0x009,Obj_5:0x010}拷貝到緩存表2中。
步驟S203:在緩存中重新創(chuàng)建Obj_2對應(yīng)的緩存數(shù)據(jù),例如,{Obj_2:0x102->mjk},即將Obj_2對應(yīng)的緩存數(shù)據(jù)變更為mjk,將mjk存儲于緩存0x102位置處。
步驟S204:在緩存表2中將Obj_2的映射地址替換成地址0x102,從而緩存表2中存儲的映射關(guān)系更新為{Obj_1:0x001,Obj_2:0x102,Obj_3:0x003,Obj_4:0x009,Obj_5:0x010},同時將緩存表2設(shè)置為可讀。
優(yōu)選地,為了避免大量的緩存表和已經(jīng)被更新的緩存數(shù)據(jù)占用內(nèi)存資源,在每次完成緩存數(shù)據(jù)更新后,自動釋放內(nèi)存中之前存儲的緩存表和更新前的緩存數(shù)據(jù)以節(jié)省內(nèi)存空間。
需要說明的是,在步驟S201至步驟S204完成前,讀線程讀取的仍是緩存表1,在步驟S204完成后,后續(xù)的讀線程讀取到的是緩存表2,從而保證對最新緩存數(shù)據(jù)進(jìn)行讀操作。
本發(fā)明實(shí)施例提供的緩存數(shù)據(jù)處理方法在緩存數(shù)據(jù)對象比較大,需要支持多個線程同時讀取緩存數(shù)據(jù),緩存讀取請求操作遠(yuǎn)多于緩存更新操作,以及讀取緩存數(shù)據(jù)具有時間敏感性(即應(yīng)該盡量短時間阻塞或者不阻塞數(shù)據(jù)讀取線程)等情況下具有良好的應(yīng)用前景,能夠支持多線程同時讀寫緩存數(shù)據(jù)而不阻塞線程,其次,由于更新緩存數(shù)據(jù)時,只拷貝緩存數(shù)據(jù)的名稱和存儲地址的映射關(guān)系而不拷貝實(shí)際緩存數(shù)據(jù),能夠有效減少內(nèi)存消耗,提高緩存數(shù)據(jù)更新效率,最后,本發(fā)明實(shí)施例可以實(shí)現(xiàn)批量更新緩存數(shù)據(jù),即,可以啟動一個獨(dú)立的線程定時處理隊(duì)列中的寫數(shù)據(jù)請求,例如,對寫數(shù)據(jù)請求進(jìn)行合并等運(yùn)算,減少冗余的寫數(shù)據(jù)請求,從而減少緩存更新的次數(shù)。
需要說明的是,在附圖的流程圖示出的步驟可以在諸如一組計(jì)算機(jī)可執(zhí)行指令的計(jì)算機(jī)系統(tǒng)中執(zhí)行,并且,雖然在流程圖中示出了邏輯順序,但是在某些情況下,可以以不同于此處的順序執(zhí)行所示出或描述的步驟。
根據(jù)本發(fā)明實(shí)施例的另一方面,提供了一種緩存數(shù)據(jù)處理裝置,該緩存數(shù)據(jù)處理裝置可以用于執(zhí)行本發(fā)明實(shí)施例的緩存數(shù)據(jù)處理方法,本發(fā)明實(shí)施例的緩存數(shù)據(jù)處理方法也可以通過本發(fā)明實(shí)施例的緩存數(shù)據(jù)處理裝置來執(zhí)行。
圖3是根據(jù)本發(fā)明實(shí)施例的緩存數(shù)據(jù)處理裝置的示意圖,如圖3所示,該裝置包括:獲取單元10、讀取單元20和讀寫單元30。
獲取單元10,用于獲取緩存表,其中,緩存表中存儲有緩存數(shù)據(jù)的名稱和緩存數(shù) 據(jù)的存儲地址之間的映射關(guān)系。
讀取單元20,用于從緩存表中讀取映射關(guān)系。
優(yōu)選地,為了保證線程每次讀寫的是最新的緩存數(shù)據(jù),緩存表還存儲有時間戳,時間戳用于表示緩存表的生成時間,當(dāng)緩存表為多個緩存表時,讀取單元20包括:第五獲取模塊,用于分別獲取多個緩存表的時間戳,得到多個時間戳;第六獲取模塊,用于獲取多個時間戳中最晚的時間戳;以及讀取模塊,用于從最晚的時間戳對應(yīng)的緩存表中讀取映射關(guān)系。
讀寫單元30,用于根據(jù)映射關(guān)系對緩存數(shù)據(jù)執(zhí)行讀寫操作。
例如,當(dāng)多個線程同時讀取緩存數(shù)據(jù)時,多個線程可以同時讀取緩存表中存儲的映射關(guān)系來實(shí)現(xiàn)對緩存數(shù)據(jù)的讀取,當(dāng)多個線程同時讀寫緩存數(shù)據(jù)時,為了便于描述,將當(dāng)前被讀寫的緩存表稱為原緩存表,將原緩存表中存儲的映射關(guān)系拷貝至新生成的緩存表中,寫線程基于新生成的緩存表實(shí)現(xiàn)對緩存數(shù)據(jù)的寫操作,讀線程繼續(xù)根據(jù)原緩存表實(shí)現(xiàn)對緩存數(shù)據(jù)的讀操作,從而實(shí)現(xiàn)同時讀寫緩存數(shù)據(jù)而不阻塞線程,此外,寫操作時僅拷貝原緩存表中的映射關(guān)系,相比于現(xiàn)有技術(shù)中在寫操作時拷貝整個緩存數(shù)據(jù),數(shù)據(jù)量大大減少,提高了讀寫緩存數(shù)據(jù)的效率,而且能夠減少內(nèi)存資源的占用,解決了相關(guān)技術(shù)中在實(shí)現(xiàn)多個線程讀寫緩存數(shù)據(jù)而不阻塞線程時效率較低的問題。
本發(fā)明實(shí)施例通過獲取單元10獲取緩存表,其中,緩存表中存儲有緩存數(shù)據(jù)的名稱和緩存數(shù)據(jù)的存儲地址之間的映射關(guān)系;讀取單元20從緩存表中讀取映射關(guān)系;以及讀寫單元30根據(jù)映射關(guān)系對緩存數(shù)據(jù)執(zhí)行讀寫操作,解決了相關(guān)技術(shù)中在實(shí)現(xiàn)多個線程讀寫緩存數(shù)據(jù)而不阻塞線程時效率較低的問題,進(jìn)而達(dá)到了在保證線程不堵塞時提高讀寫緩存數(shù)據(jù)的效率的效果。
可選地,讀寫單元30包括:第一獲取模塊,用于獲取讀數(shù)據(jù)請求;第二獲取模塊,用于根據(jù)讀數(shù)據(jù)請求獲取待讀取數(shù)據(jù)的名稱,其中,緩存數(shù)據(jù)包括待讀取數(shù)據(jù);查找模塊,用于從映射關(guān)系中查找與待讀取數(shù)據(jù)的名稱對應(yīng)的存儲地址;以及讀模塊,用于根據(jù)待讀取數(shù)據(jù)的名稱對應(yīng)的存儲地址讀取待讀取數(shù)據(jù)。
優(yōu)選地,為了提高緩存數(shù)據(jù)更新的效率,緩存表包括第一緩存表和第二緩存表,讀寫單元30包括:第三獲取模塊,用于獲取寫數(shù)據(jù)請求;生成模塊,用于根據(jù)寫數(shù)據(jù)請求在緩存中生成待更新數(shù)據(jù);第四獲取模塊,用于獲取待更新數(shù)據(jù)的存儲地址;復(fù)制模塊,用于將第一緩存表中存儲的緩存數(shù)據(jù)的名稱和緩存數(shù)據(jù)的存儲地址之間的映射關(guān)系復(fù)制至第二緩存表中;以及更新模塊,用于根據(jù)待更新數(shù)據(jù)的存儲地址更新第二緩存表中存儲的映射關(guān)系。
具體地,本發(fā)明實(shí)施通過將第一緩存表中存儲的映射關(guān)系拷貝至第二緩存表中, 并基于第二緩存表對緩存數(shù)據(jù)進(jìn)行更新操作,而讀線程可以繼續(xù)基于第一緩存表讀取緩存數(shù)據(jù),從而為了保證寫線程對緩存數(shù)據(jù)進(jìn)行更新操作時,讀線程可以同時對緩存數(shù)據(jù)進(jìn)行讀操作。
顯然,本領(lǐng)域的技術(shù)人員應(yīng)該明白,上述的本發(fā)明的各模塊或各步驟可以用通用的計(jì)算裝置來實(shí)現(xiàn),它們可以集中在單個的計(jì)算裝置上,或者分布在多個計(jì)算裝置所組成的網(wǎng)絡(luò)上,可選地,它們可以用計(jì)算裝置可執(zhí)行的程序代碼來實(shí)現(xiàn),從而,可以將它們存儲在存儲裝置中由計(jì)算裝置來執(zhí)行,或者將它們分別制作成各個集成電路模塊,或者將它們中的多個模塊或步驟制作成單個集成電路模塊來實(shí)現(xiàn)。這樣,本發(fā)明不限制于任何特定的硬件和軟件結(jié)合。
以上所述僅為本發(fā)明的優(yōu)選實(shí)施例而已,并不用于限制本發(fā)明,對于本領(lǐng)域的技術(shù)人員來說,本發(fā)明可以有各種更改和變化。凡在本發(fā)明的精神和原則之內(nèi),所作的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。