數(shù)據(jù)處理方法和系統(tǒng)的制作方法
【專利摘要】本申請公開了一種數(shù)據(jù)處理方法和系統(tǒng),其中,該方法包括:確定客戶端待處理的數(shù)據(jù)項的鎖的狀態(tài)為未鎖定,其中,鎖的狀態(tài)保存在服務(wù)端上;請求將數(shù)據(jù)項對應(yīng)的鎖的狀態(tài)更改為鎖定;在數(shù)據(jù)項對應(yīng)的鎖的狀態(tài)被更改為鎖定之后,對數(shù)據(jù)項中的數(shù)據(jù)進行處理;在處理數(shù)據(jù)成功之后,請求將數(shù)據(jù)項對應(yīng)的鎖的狀態(tài)更改為未鎖定。通過本申請,解決了相關(guān)技術(shù)中采用二階段提交協(xié)議進行數(shù)據(jù)處理導(dǎo)致的效率低的問題,提高了數(shù)據(jù)處理的效率。
【專利說明】數(shù)據(jù)處理方法和系統(tǒng)
【技術(shù)領(lǐng)域】
[0001] 本申請涉及數(shù)據(jù)處理領(lǐng)域,具體而言,涉及數(shù)據(jù)處理方法和系統(tǒng)。
【背景技術(shù)】
[0002] 隨著后臺系統(tǒng)訪問量的不斷增加,數(shù)據(jù)存儲系統(tǒng)中的數(shù)據(jù)處理技術(shù)越來越重要。
[0003] 在相關(guān)技術(shù)中,對于數(shù)據(jù)處理有一種方法是采用二階段提交協(xié)議,即對關(guān)鍵數(shù)據(jù) 進行更改之前先進行準備階段,查詢每個節(jié)點的狀態(tài),然后根據(jù)準備節(jié)點的狀態(tài),進入提交 階段,來對數(shù)據(jù)進行更改。
[0004] 本申請的發(fā)明人在研究和實踐過程中發(fā)現(xiàn),相關(guān)技術(shù)至少存在下列技術(shù)問題:相 關(guān)技術(shù)每次做數(shù)據(jù)更改都需要經(jīng)過準備階段和提交階段的網(wǎng)絡(luò)操作,同步的效率和性能不 高;由于在對多個無關(guān)的數(shù)據(jù)進行更改時,需要分別經(jīng)過多個二階段提交過程,無法并行處 理,即并行性差;必須要有一個節(jié)點用來準備和提交,容易產(chǎn)生瓶頸,并且系統(tǒng)不易擴展,這 些問題中的至少之一導(dǎo)致了相關(guān)技術(shù)中的數(shù)據(jù)同步處理效率低。
[0005] 針對相關(guān)技術(shù)中的采用二階段提交協(xié)議進行數(shù)據(jù)處理導(dǎo)致的效率低的問題,目前 尚未提出有效的解決辦法。
【發(fā)明內(nèi)容】
[0006] 本申請?zhí)峁┝艘环N數(shù)據(jù)處理方法和系統(tǒng),以解決相關(guān)技術(shù)中采用二階段提交協(xié)議 進行數(shù)據(jù)處理導(dǎo)致的效率低的問題。
[0007] 根據(jù)本申請的一個方面,提供了一種數(shù)據(jù)處理系統(tǒng),該系統(tǒng)包括客戶端和服務(wù)端, 其中:所述服務(wù)端與所述客戶端相連,包括:保存模塊,用于保存所述客戶端待處理的數(shù)據(jù) 項對應(yīng)的鎖的狀態(tài);更改模塊,用于更改所述鎖的狀態(tài)為鎖定或未鎖定;所述客戶端包括: 確定模塊,用于確定所述待處理的數(shù)據(jù)項對應(yīng)的鎖的狀態(tài)為未鎖定;第一請求模塊,用于請 求將所述數(shù)據(jù)項對應(yīng)的鎖的狀態(tài)更改為鎖定;處理模塊,用于在所述數(shù)據(jù)項對應(yīng)的鎖的狀 態(tài)被更改為鎖定之后,對所述數(shù)據(jù)項中的數(shù)據(jù)進行處理;第二請求模塊,用于在處理所述數(shù) 據(jù)成功之后,請求將所述數(shù)據(jù)項對應(yīng)的鎖的狀態(tài)更改為未鎖定。
[0008] 根據(jù)本申請的另一個方面,還提供了一種數(shù)據(jù)處理方法,該方法包括:確定客戶端 待處理的數(shù)據(jù)項的鎖的狀態(tài)為未鎖定,其中,所述鎖的狀態(tài)保存在服務(wù)端上;請求將所述數(shù) 據(jù)項對應(yīng)的鎖的狀態(tài)更改為鎖定;在所述數(shù)據(jù)項對應(yīng)的鎖的狀態(tài)被更改為鎖定之后,對所 述數(shù)據(jù)項中的數(shù)據(jù)進行處理;在處理所述數(shù)據(jù)成功之后,請求將所述數(shù)據(jù)項對應(yīng)的鎖的狀 態(tài)更改為未鎖定。
[0009] 通過本申請,采用了確定客戶端待處理的數(shù)據(jù)項的鎖的狀態(tài)為未鎖定,其中,該鎖 的狀態(tài)保存在服務(wù)端上;請求將該數(shù)據(jù)項對應(yīng)的鎖的狀態(tài)更改為鎖定;在該數(shù)據(jù)項對應(yīng)的 鎖的狀態(tài)被更改為鎖定之后,對該數(shù)據(jù)項中的數(shù)據(jù)進行處理;在處理該數(shù)據(jù)成功之后,請求 將該數(shù)據(jù)項對應(yīng)的鎖的狀態(tài)更改為未鎖定。解決了相關(guān)技術(shù)中采用二階段提交協(xié)議進行數(shù) 據(jù)處理導(dǎo)致的效率低的問題,提高了數(shù)據(jù)處理的效率。
【專利附圖】
【附圖說明】
[0010] 此處所說明的附圖用來提供對本申請的進一步理解,構(gòu)成本申請的一部分,本申 請的示意性實施例及其說明用于解釋本申請,并不構(gòu)成對本申請的不當限定。并且,對于本 領(lǐng)域普通技術(shù)人員而言,在不付出創(chuàng)造性勞動的前提下,還可以根據(jù)這些附圖獲得其他的 附圖。在附圖中:
[0011] 圖1是根據(jù)本申請實施例的數(shù)據(jù)處理系統(tǒng)的系統(tǒng)結(jié)構(gòu)框圖;
[0012] 圖2是根據(jù)本申請實施例的數(shù)據(jù)處理系統(tǒng)的優(yōu)選系統(tǒng)結(jié)構(gòu)框圖;
[0013] 圖3是根據(jù)本申請實施例的數(shù)據(jù)處理方法的流程示意圖;
[0014] 圖4是根據(jù)本申請優(yōu)選實施例的數(shù)據(jù)處理系統(tǒng)的系統(tǒng)框圖;
[0015] 圖5是根據(jù)本申請優(yōu)選實施例的位圖的示意圖。
【具體實施方式】
[0016] 需要說明的是,在不沖突的情況下,本申請中的實施例及實施例中的特征可以相 互組合。下面將參考附圖并結(jié)合實施例來詳細說明本申請。
[0017] 在以下描述中,除非另外指明,否則將參考由一個或多個計算機執(zhí)行的動作和操 作的符號表示來描述本申請的各實施例。其中,計算機可以包括個人計算機、服務(wù)器、移動 終端等各種產(chǎn)品,在以下實施例中,使用了 CPU、單片機、DSP等具有處理芯片的設(shè)備均可以 稱為計算機。由此,可以理解,有時被稱為計算機執(zhí)行的這類動作和操作包括計算機的處理 單元對以結(jié)構(gòu)化形式表示數(shù)據(jù)的電信號的操縱。這一操縱轉(zhuǎn)換了數(shù)據(jù)或在計算機的存儲器 系統(tǒng)中的位置上維護它,這以本領(lǐng)域的技術(shù)人員都理解的方式重配置或改變了計算機的操 作。維護數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)是具有數(shù)據(jù)的格式所定義的特定屬性的存儲器的物理位置。然 而,盡管在上述上下文中描述本申請,但它并不意味著限制性的,如本領(lǐng)域的技術(shù)人員所理 解的,后文所描述的動作和操作的各方面也可用硬件來實現(xiàn)。
[0018] 轉(zhuǎn)向附圖,其中相同的參考標號指代相同的元素,本申請的原理被示為在合適的 計算環(huán)境中實現(xiàn)。以下描述基于所述的本申請的實施例,并且不應(yīng)認為是關(guān)于此處未明確 描述的替換實施例而限制本申請。
[0019] 優(yōu)選地,本申請實施例可以提供一個其上存儲有本申請實施例的機器可讀媒體。 需要說明的是,任一適合存儲設(shè)計關(guān)于本申請的指令的媒體都在本申請的范圍以內(nèi)。例如, 這樣的媒體可以采用磁性媒體、光學(xué)媒體或半導(dǎo)體媒體的形式。
[0020] 本實施例提供了一種數(shù)據(jù)處理系統(tǒng),圖1是根據(jù)本申請實施例的數(shù)據(jù)處理系統(tǒng)的 系統(tǒng)結(jié)構(gòu)框圖,如圖1所示,該系統(tǒng)包括客戶端10和服務(wù)端12,如圖1所示,在該圖1中,客 戶端10可以是多個,服務(wù)端12可以是一個或者一組服務(wù)器,也可以是一種服務(wù),該服務(wù)可 以由任何設(shè)備提供,例如,可以由服務(wù)器提供,或者也可以由多個客戶端10中的一個或多 個來提供這種服務(wù)。
[0021] 客戶端可以是個人電腦(PC),也可以是需要對數(shù)據(jù)進行處理的任何一個終端,這 里的終端是相對于服務(wù)端而言的,需要從服務(wù)端獲取到鎖服務(wù)的任何一個設(shè)備或者該設(shè)備 上的軟件或者一個功能模塊均可以理解為是本實施例中的客戶端10。
[0022] 客戶端與服務(wù)端之間的連接可以是有線連接,也可以是無線連接??梢灶A(yù)料到的, 客戶端與服務(wù)端的任何物理的連接方式都不影響實施例的實現(xiàn)。客戶端和服務(wù)端可能在同 一網(wǎng)絡(luò),或者在不同的網(wǎng)絡(luò),為了實現(xiàn)客戶端和服務(wù)端之間的連接可能還需要其他的中間 設(shè)備,附圖中示出的是客戶端和服務(wù)端之間的連接關(guān)系,其余并未在附圖中示出。
[0023] 在以下實施例中,數(shù)據(jù)項所對應(yīng)的可以是一個數(shù)據(jù)項目的名稱,該數(shù)據(jù)項可以有 不同的值或者內(nèi)容,這些值或者內(nèi)容在本實施例中稱為是該數(shù)據(jù)項中存儲的數(shù)據(jù)。下面 通過一個例子來說明數(shù)據(jù)項和數(shù)據(jù)項中的數(shù)據(jù)的關(guān)系,該例子不應(yīng)當理解為對數(shù)據(jù)項的限 定。例如:對應(yīng)于一個相同用戶的用戶名信息。在數(shù)據(jù)存儲系統(tǒng)中,該數(shù)據(jù)項的名稱是用戶 名信息,對于不同的用戶該數(shù)據(jù)項的名稱是一樣的,均是用戶名信息,但是,對于不同的用 戶該數(shù)據(jù)項的值可以是不同的。例如,用戶1的用戶名信息這一數(shù)據(jù)項的值是"Tom",而用 戶2的用戶名信息這一數(shù)據(jù)項的值是"Jerry"。
[0024] 在本實施例中一個或多個客戶端10均可以對數(shù)據(jù)存儲系統(tǒng)中同一數(shù)據(jù)項中的數(shù) 據(jù)進行處理(例如,修改、更新、寫入等處理)。
[0025] 如圖1所示,服務(wù)端12可以與一個或多個客戶端10相連,該服務(wù)端12可以包括: 保存模塊122和更改模塊124,其中,保存模塊122用于保存客戶端10待處理的數(shù)據(jù)項對應(yīng) 的鎖的狀態(tài);更改模塊124耦合至保存模塊122,用于更改鎖的狀態(tài)為鎖定或未鎖定;
[0026] 客戶端10包括:確定模塊102、第一請求模塊104、處理模塊106和第二請求模塊 108,其中,確定模塊102用于確定客戶端10待處理的數(shù)據(jù)項對應(yīng)的鎖的狀態(tài)為未鎖定;第 一請求模塊104耦合至確定模塊102,用于請求服務(wù)端12將該數(shù)據(jù)項對應(yīng)的鎖的狀態(tài)更改 為鎖定;處理模塊106耦合至第一請求模塊104,用于在該數(shù)據(jù)項對應(yīng)的鎖的狀態(tài)被更改為 鎖定之后,對該數(shù)據(jù)項中的數(shù)據(jù)進行處理;第二請求模塊108耦合至處理模塊106,用于在 處理數(shù)據(jù)成功之后,請求服務(wù)端12將該數(shù)據(jù)項對應(yīng)的鎖的狀態(tài)更改為未鎖定。
[0027] 本實施例中所涉及到的模塊、單元可以通過軟件的方式實現(xiàn),也可以通過硬件的 方式來實現(xiàn)。本實施例中所描述的模塊、單元也可以設(shè)置在處理器中,例如,可以描述為:一 種處理器包括確定模塊102、第一請求模塊104、處理模塊106和第二請求模塊108。其中, 這些模塊的名稱在某些情況下并不構(gòu)成對該模塊本身的限定,例如,確定模塊還可以被描 述為"用于確定客戶端10待處理的數(shù)據(jù)項的鎖的狀態(tài)為未鎖定的模塊"。
[0028] 通過上述系統(tǒng),采用了客戶端10根據(jù)服務(wù)端12中保存的鎖的狀態(tài)對確定該客戶 端10是否能夠?qū)υ摂?shù)據(jù)項對應(yīng)的數(shù)據(jù)進行處理的方式。由于對于每一個數(shù)據(jù)項,在每個客 戶端10對其進行處理時都需要獲得鎖之后才能進行處理,并且,該鎖的狀態(tài)均由服務(wù)端12 提供,因此客戶端10在要對這個數(shù)據(jù)項中的數(shù)據(jù)進行更改的情況下,只需要判斷客戶端10 對于該數(shù)據(jù)項對應(yīng)的鎖的狀態(tài),就能確定能否對該數(shù)據(jù)項進行處理。對于多個客戶端10,當 存在一項數(shù)據(jù)項中的數(shù)據(jù)可能被多個客戶端10修改的時候,每個客戶端10在對該數(shù)據(jù)項 中的處理進行處理之前,均可以讀取服務(wù)端上的該客戶端對應(yīng)的該數(shù)據(jù)項的鎖的狀態(tài),如 果該鎖的狀態(tài)為未鎖定,可以進行數(shù)據(jù)的處理。這相比于相關(guān)技術(shù)中的二階段提交協(xié)議而 言,只需要通過獲取鎖的狀態(tài)就可以對數(shù)據(jù)進行處理,提供了處理的效率。
[0029] 在本實施例中,對于客戶端10而言,鎖服務(wù)的提供是由服務(wù)端12來提供的,該鎖 服務(wù)可以是與數(shù)據(jù)存儲系統(tǒng)分離存在的,這樣就可以實現(xiàn)鎖服務(wù)與數(shù)據(jù)存儲之間的分離, 為多個數(shù)據(jù)項的并行數(shù)據(jù)處理提供了基礎(chǔ)。
[0030] 客戶端10和服務(wù)端12之間的通信可以采用通信方式來實現(xiàn),例如,可以采用 socket等技術(shù)來實現(xiàn),也可以采用不同的協(xié)議來讀取服務(wù)端上的鎖狀態(tài),但并緊緊限于此。
[0031] 在上述實施例中,客戶端10作為數(shù)據(jù)存儲系統(tǒng)的數(shù)據(jù)操作者出現(xiàn),在另外一個優(yōu) 選的實施方式,多個客戶端10可以作為一個集群的數(shù)據(jù)存儲系統(tǒng)(即,分布式存儲系統(tǒng))出 現(xiàn),此時,多個客戶端10中的每個客戶端10均用于保存數(shù)據(jù),當需要對數(shù)據(jù)進行更新時,需 要更新每個客戶端10上的數(shù)據(jù)。在本優(yōu)選實施方式,服務(wù)端的鎖服務(wù)可以表示每個客戶端 10上保存的相同數(shù)據(jù)項所對應(yīng)鎖狀態(tài)。相同數(shù)據(jù)項可以指對應(yīng)于一個相同實例的數(shù)據(jù)項, 例如:對應(yīng)于一個相同用戶的用戶名信息。在分布式存儲系統(tǒng)中的每一個存儲數(shù)據(jù)的客戶 端10可以都存儲對應(yīng)于一個相同用戶的用戶名信息,而且在一般情況下,該用戶名信息應(yīng) 該是相同的。在其中的一個客戶端10接受外部指令需要變更的情況下,分布式存儲系統(tǒng)中 用于存儲的其他客戶端10中如果也存在該相同用戶的用戶名信息,則需要進行同步變更。 該優(yōu)選實施例可以用于上述同步變更的過程。下面對這種應(yīng)用場景下的一個例子進行說 明。例如,當該數(shù)據(jù)項對應(yīng)于各個客戶端10的鎖的狀態(tài)都為未鎖定的情況下,將該數(shù)據(jù)項 對應(yīng)的鎖的狀態(tài)更改為鎖定之后,再對該數(shù)據(jù)項中的數(shù)據(jù)進行處理,從而保證了數(shù)據(jù)的正 確處理;當數(shù)據(jù)項對應(yīng)于各個客戶端10的鎖的狀態(tài)中存在鎖定狀態(tài)的鎖,則說明此時至少 有一個客戶端10上的該數(shù)據(jù)項處于無法正確讀寫的狀態(tài),此時如果對數(shù)據(jù)進行處理,則可 能無法保證所有客戶端10的該數(shù)據(jù)的均被正確處理。此時,可以對其他的處于未鎖定的客 戶端上的數(shù)據(jù)進行處理,后續(xù)等待處于鎖定狀態(tài)的客戶端10的狀態(tài)變?yōu)槲存i定時,再對該 客戶端10的數(shù)據(jù)進行處理;或者,也可以對等待所有的客戶端的狀態(tài)均變?yōu)槲存i定時,一 起進行數(shù)據(jù)的處理。
[0032] 通過這樣的方式,在進行數(shù)據(jù)處理的時候,可以不需要像二階段提交那樣,選擇一 個主客戶端然后再等待其他的每一個客戶端10的提交確認,而只需要根據(jù)不同的數(shù)據(jù)項 的處理需求,選擇從服務(wù)端獲取鎖的方式來進行處理即可,從而解決了相關(guān)技術(shù)中數(shù)據(jù)同 步處理的效率低的問題,提高了數(shù)據(jù)同步處理的效率。
[0033] 在上述的實施例及優(yōu)選實施方式中,數(shù)據(jù)項可以是一個或多個,客戶端10也可以 是一個或多個,此時,服務(wù)端12上保存的鎖的狀態(tài)可以包括:多個客戶端10分別對應(yīng)的同 一數(shù)據(jù)項的鎖的狀態(tài),例如,可以保存一個數(shù)據(jù)項分別對應(yīng)的10個客戶端10的鎖的狀態(tài); 或者,服務(wù)端12上保存的所的狀態(tài)也可以包括:多個數(shù)據(jù)項分別對應(yīng)的鎖的狀態(tài),例如,數(shù) 據(jù)項1至數(shù)據(jù)項10分別對應(yīng)的一個客戶端10的鎖的狀態(tài)。當然也可以這兩者都包括,例 如,10個數(shù)據(jù)項分別對應(yīng)的10個客戶端10的鎖的狀態(tài)。這些不同的多個數(shù)據(jù)項之間可 以存在耦合關(guān)系,例如相同類型,也可以不存在任何耦合關(guān)系,即是無關(guān)的數(shù)據(jù)項。即不同 的多個數(shù)據(jù)項是否存耦合關(guān)系在本申請的實施例的處理過程中并沒有差異。這是因為,將 不同的多個數(shù)據(jù)項對應(yīng)的鎖的狀態(tài)保存在服務(wù)端12上之后,如果客戶端10發(fā)起對多個不 同的數(shù)據(jù)項進行處理,則可以通過判斷服務(wù)端12上保存的對應(yīng)于這些不同的多個數(shù)據(jù)項 的鎖的狀態(tài)來確定是否對這些數(shù)據(jù)項進行處理??赡艹霈F(xiàn)的情況是,多個客戶端的數(shù)據(jù)項 1對應(yīng)的鎖的狀態(tài)都是未鎖定,而多個客戶端的數(shù)據(jù)項2對應(yīng)的鎖的狀態(tài)中存在鎖定的狀 態(tài),對于數(shù)據(jù)項1和數(shù)據(jù)2的處理可以分別進行。
[0034] 在本申請實施例的一些優(yōu)選實施方式中,需要對不同的多個數(shù)據(jù)項進行處理時, 可以依次發(fā)起并處理其中每一個數(shù)據(jù)項中的數(shù)據(jù),在另一些優(yōu)選實施方式中,也可以同時 發(fā)起并處理處理這多個數(shù)據(jù)項中的數(shù)據(jù)。這兩種優(yōu)選實施方式都是可以被構(gòu)想并在本申請 實施例中的系統(tǒng)中實現(xiàn)的。通過在服務(wù)端12上保存多個數(shù)據(jù)項對應(yīng)的鎖的狀態(tài),可以實現(xiàn) 同時發(fā)起并處理這多個數(shù)據(jù)項,從而使系統(tǒng)具有并行處理的能力,并且對于并行處理中的 每一個線程或者進程等都可以是獨立的,不會相互干擾,具有良好的處理性能,進一步提高 了系統(tǒng)處理效率,并且提升了系統(tǒng)的穩(wěn)定性。
[0035] 在本申請的一些優(yōu)選實施方式中,每個客戶端10的所有待處理的數(shù)據(jù)項對應(yīng)的 鎖的狀態(tài)都保存在這個客戶端10中,并映射到服務(wù)端12中進行保存,即對于每個客戶端10 中的每個數(shù)據(jù)項而言,其是否被占用都被表示在這個客戶端10中保存的鎖的狀態(tài)中,這些 鎖的狀態(tài)通過映射的方式實時映射到服務(wù)端12中,使得服務(wù)端12中保存的鎖的狀態(tài)與客 戶端10中保存的鎖的狀態(tài)對應(yīng)且同步。在另一些優(yōu)選實施方式中,還有一種方式也是可以 被構(gòu)想的:每一個客戶端10同時也是服務(wù)端12,即在每一個客戶端10中都完整保存了其 他的客戶端10中的數(shù)據(jù)項對應(yīng)的鎖的狀態(tài)。
[0036] 鎖的狀態(tài)可以采用相關(guān)技術(shù)中各種公知的方式進行存儲,例如列表、棧堆等形式。
[0037] 作為一個比較優(yōu)的實施例,鎖的狀態(tài)可以以位圖的方式保存在服務(wù)端12。位圖是 由位(例如比特位)集合而成的一種具有索引的數(shù)據(jù)結(jié)構(gòu),其中,位圖中的每一位用于表示 多個存儲數(shù)據(jù)的客戶端10中每個客戶端10對應(yīng)的數(shù)據(jù)項對應(yīng)的鎖的狀態(tài)。位圖中的每個 位在二進制系統(tǒng)中存在兩種狀態(tài),一般用"0"和" 1"表示,而在本申請實施例中鎖的狀態(tài)也 具有最基本的兩種狀態(tài)"鎖定"和"未鎖定",因此,可以用位的兩種狀態(tài)分別表示本申請實 施例中鎖的兩種基本狀態(tài),而用位圖的位的索引號表示對應(yīng)的客戶端10。由于二進制系統(tǒng) 中一個位僅占用一個比特,能表示一個鎖的狀態(tài),因此,占用的存儲資源比較少,例如四個 字節(jié)就可以用來表示三十二個鎖的狀態(tài)。同時,由于位圖的數(shù)據(jù)結(jié)構(gòu)簡單,可以通過索引查 詢的方式定位一個鎖,通過讀取位的值直接確定鎖的狀態(tài),而不需要通過其他的計算,占用 的系統(tǒng)資源也很少。通過上述的描述可知使用位圖的方式保存鎖的狀態(tài)節(jié)約了存儲空間, 提商了處理效率。
[0038] 在本申請實施例的一些優(yōu)選實施方式中,可以構(gòu)想的一種方式是共享位圖中的同 一個位來表示多個鎖的狀態(tài),這多個鎖的狀態(tài)可以是同一個客戶端10中多個數(shù)據(jù)項對應(yīng) 的鎖的狀態(tài),也可以是多個客戶端10中一個數(shù)據(jù)項對應(yīng)的鎖的狀態(tài)。在另一些優(yōu)選的實 施方式中,共享位圖中同一個位的多個鎖的狀態(tài)對應(yīng)的多個數(shù)據(jù)項是存在耦合關(guān)系的數(shù)據(jù) 項,例如,在相關(guān)技術(shù)中,在處理一個數(shù)據(jù)的時候,記錄或更新這個數(shù)據(jù)被處理的時間是常 用的操作。在這種情況下,在表示這個數(shù)據(jù)和數(shù)據(jù)被處理的時間分別對應(yīng)的鎖的狀態(tài)時,共 享位圖中的同一個位。采用這種優(yōu)選實施方式,不僅可以進一步節(jié)約存儲資源,而且位圖的 規(guī)模也可以變小,也提高了位圖處理的效率。
[0039] 優(yōu)選地,在數(shù)據(jù)項的數(shù)量為多個的情況下,鎖的狀態(tài)以位圖的方式保存在服務(wù)端 12包括:鎖的狀態(tài)以多個位圖的方式保存在服務(wù)端12,其中,每個位圖用于表示多個客戶 端10的同一個數(shù)據(jù)項對應(yīng)的鎖的狀態(tài),或用于表示多個客戶端10中一個客戶端10中的多 個數(shù)據(jù)項對應(yīng)的鎖的狀態(tài)。在這種優(yōu)選實施方式中,提出了兩種位圖的結(jié)構(gòu):根據(jù)數(shù)據(jù)項劃 分或根據(jù)客戶端10劃分。在系統(tǒng)中可以根據(jù)需要采用合適的位圖的結(jié)構(gòu)。位圖的不同結(jié) 構(gòu)表現(xiàn)在索引方式的區(qū)別上。例如,采用根據(jù)相同數(shù)據(jù)項劃分的方式,不同客戶端10上的 數(shù)據(jù)項對應(yīng)的鎖在位圖中存儲位置的索引是相鄰的,在對一個數(shù)據(jù)項進行處理時,僅需要 根據(jù)一個位圖中的位的信息進行處理,因此相對于根據(jù)客戶端10劃分的位圖而言,其索引 速度更快,效率更高。需要說明的是上述的"多個位圖"僅是為了便于描述進行的概念上的 劃分。在一些優(yōu)選實施例中,多個位圖僅僅是一個位圖中的多個部分。
[0040] 需要說明的是,由于采用了本申請實施例中鎖的狀態(tài)保存方法,在客戶端10的結(jié) 構(gòu)發(fā)生變化的情況下,鎖的狀態(tài)的存儲結(jié)構(gòu)是可以不發(fā)生改變的,因此具有一定的兼容性; 此外,在系統(tǒng)中的客戶端10的數(shù)量改變或者待處理的數(shù)據(jù)項的數(shù)量改變的情況下,只需要 對存儲的鎖的狀態(tài)的數(shù)據(jù)結(jié)構(gòu)進行相應(yīng)調(diào)整就能適應(yīng)新的系統(tǒng),因此,其系統(tǒng)的適應(yīng)性較 強,且升級維護很靈活和容易。
[0041] 優(yōu)選地,可能存在多個客戶端10請求更改鎖的狀態(tài)的情況,為了避免死鎖等情況 出現(xiàn),第一請求模塊104用于根據(jù)預(yù)先確定的順序請求將該數(shù)據(jù)項對應(yīng)的鎖的狀態(tài)更改為 鎖定;此時,第二請求模塊108用于根據(jù)與該順序相反的順序請求將該數(shù)據(jù)項對應(yīng)的鎖的 狀態(tài)更改為未鎖定。優(yōu)選地,服務(wù)端12在接受這些請求時,如果來自多個客戶端10的請求 對一個相同的數(shù)據(jù)項進行處理,則可以按照一定的次序,例如請求接收的次序?qū)碜远鄠€ 客戶端10的請求進行響應(yīng),以將對應(yīng)的鎖的狀態(tài)更改為鎖定或未鎖定。其中,在服務(wù)端12 將鎖的狀態(tài)更改為鎖定和更改為未鎖定的順序也可以是相反的。在客戶端10請求服務(wù)端 12對即將處理的數(shù)據(jù)項進行處理之前,需要請求服務(wù)端12對即將處理的數(shù)據(jù)項對應(yīng)的鎖 的狀態(tài)更改為鎖定,以防止其他客戶端10再次請求這個數(shù)據(jù)項進行處理而導(dǎo)致處理失敗。 然而,以下這種情況是很有可能發(fā)生的:兩個客戶端10都請求對同一個數(shù)據(jù)項進行處理 時,兩個客戶端10都要將這個數(shù)據(jù)項對應(yīng)的鎖的狀態(tài)分別由未鎖定狀態(tài)更改為鎖定狀態(tài); 如果兩個客戶端10對于這一個數(shù)據(jù)項對應(yīng)的鎖的上鎖請求沒有按照相同的先后次序?qū)︽i 的狀態(tài)進行更改,則可能會產(chǎn)生競爭現(xiàn)象。在上述優(yōu)選方式中,采用請求按照相同的先后次 序?qū)⑼粩?shù)據(jù)項對應(yīng)的鎖的狀態(tài)更改為鎖定的方式避免了競爭和死鎖現(xiàn)象的發(fā)生,提高了 系統(tǒng)的穩(wěn)定性和可靠性。并且,按照由低位至高位或者由高位至低位將鎖的狀態(tài)更改為鎖 定或未鎖定的方式,在防止競爭和死鎖現(xiàn)象時并不是必需的,甚至對相鄰的位的鎖的狀態(tài) 進行更改也不是必需的。只要是按照相同的起點和一定的次序?qū)︽i的狀態(tài)進行更改即可。
[0042] 在本申請的一些優(yōu)選實施方式中,將同一個數(shù)據(jù)項對應(yīng)于多個客戶端10的鎖的 狀態(tài)更改為鎖定和更改為未鎖定的順序是相反的,例如,在更改為未鎖定時按照由低位向 高位依次更改,在更改為鎖定時則按照由高位向低位依次更改。從而避免了由于各個客戶 端10請求更改鎖狀態(tài)和服務(wù)端12更改鎖狀態(tài)的時延不一致的情況下導(dǎo)致的死鎖現(xiàn)象,提 高了系統(tǒng)的穩(wěn)定性和可靠性。
[0043] 優(yōu)選地,保存模塊122還用于將鎖的狀態(tài)保存在服務(wù)端12的內(nèi)存或共享內(nèi)存中。 在多個客戶端10確定或更改鎖的狀態(tài)時,可以通過同時訪問服務(wù)端12共享的邏輯內(nèi)存的 方式,從而使得多個客戶端10中的每一個客戶端10都能夠通過共享內(nèi)存同時對鎖的狀態(tài) 進行查詢和請求服務(wù)端12對鎖的狀態(tài)更改,提高了鎖狀態(tài)的查詢和更改的效率。
[0044] 在上述的實施例及其優(yōu)選的實施方式中,采用客戶端10請求更改鎖狀態(tài),然后由 服務(wù)端進行更改的方式。這是由于客戶端10在服務(wù)端上的操作需要被服務(wù)端許可,因此, 可以認為是服務(wù)端在更改鎖的狀態(tài)。作為另一種實現(xiàn)方式,客戶端10也可以直接發(fā)送命 令,該命令用于修改鎖的狀態(tài),該命令也可以理解為是一種請求。
[0045] 圖2是根據(jù)本申請實施例的數(shù)據(jù)處理系統(tǒng)的優(yōu)選系統(tǒng)結(jié)構(gòu)框圖,如圖2所示,優(yōu)選 地,服務(wù)端12還包括:判斷模塊22耦合至更改模塊124用于根據(jù)時間和當前時間,判斷鎖 的鎖定狀態(tài)是否超過預(yù)定時長;以及,更改模塊124還用于在將鎖的狀態(tài)更改為鎖定的情 況下,記錄鎖的位置和鎖的狀態(tài)更改的時間;更改模塊124還用于在判斷結(jié)果為是的情況 下,根據(jù)記錄的鎖的位置,將鎖的狀態(tài)更改為未鎖定。
[0046] 在上述的一些優(yōu)選實施方式中描述了一種死鎖現(xiàn)象和優(yōu)選的解決方式。而產(chǎn)生死 鎖現(xiàn)象的原因是有多種的,例如,在一般情況下,客戶端10中數(shù)據(jù)項對應(yīng)的鎖的狀態(tài)是根 據(jù)這個客戶端10的請求進行更改的,然而在某些情況下,例如狀態(tài)更改請求由于網(wǎng)絡(luò)問題 丟失了或者在客戶端10尚未將鎖的狀態(tài)由鎖定更改為未鎖定之前離線了,則即使客戶端 10已經(jīng)沒有占用這個數(shù)據(jù)項了,在服務(wù)端12上保存的對應(yīng)的鎖的狀態(tài)仍然是鎖定狀態(tài),導(dǎo) 致了其他客戶端10無法再對這個數(shù)據(jù)項進行處理。在這種情況下,也會出現(xiàn)死鎖現(xiàn)象。在 上述優(yōu)選實施方式中,在服務(wù)端12中應(yīng)用了超時主動將鎖定的鎖的狀態(tài)更改為未鎖定的 方式,從而防止了死鎖現(xiàn)象的發(fā)生,提高了系統(tǒng)的穩(wěn)定性和可靠性。
[0047] 在本申請的一些優(yōu)選實施方式中,上述的預(yù)定時長是可以根據(jù)需要進行設(shè)置的, 例如可以根據(jù)對一個數(shù)據(jù)項處理的總時間進行確定。對于一個數(shù)據(jù)項而言,對其對應(yīng)的鎖 的狀態(tài)進行的處理以及對該數(shù)據(jù)項中的數(shù)據(jù)的處理所需要的時間往往是毫秒的級別上的, 在這種情況下,整個過程在秒的級別上是能夠完成的。在一些優(yōu)選實施方式中,預(yù)定時長 被設(shè)置為3秒鐘。優(yōu)選的,上述優(yōu)選實施方式采用Java開發(fā)工具包(Java Developed s Kit,簡稱為JDK)來實現(xiàn),例如狀態(tài)更改時間,鎖的位置信息等,具體實現(xiàn)本領(lǐng)域技術(shù)人員可 以根據(jù)上述實施例中的技術(shù)構(gòu)思來進行,在此不再贅述。
[0048] 方法實施例
[0049] 本實施例提供了一種數(shù)據(jù)處理方法,該方法可以應(yīng)用于上述數(shù)據(jù)處理系統(tǒng)中,圖3 是根據(jù)本申請實施例的數(shù)據(jù)處理方法的流程示意圖,如圖3所示,該方法包括如下步驟:
[0050] 步驟S302,確定客戶端待處理的數(shù)據(jù)項的鎖的狀態(tài)為未鎖定,其中,鎖的狀態(tài)保存 在服務(wù)端上;
[0051] 步驟S304,請求將該數(shù)據(jù)項對應(yīng)的鎖的狀態(tài)更改為鎖定;
[0052] 步驟S306,在該數(shù)據(jù)項對應(yīng)的鎖的狀態(tài)被更改為鎖定之后,對該數(shù)據(jù)項中的數(shù)據(jù) 進行處理;
[0053] 步驟S308,在處理該數(shù)據(jù)成功之后,請求將該數(shù)據(jù)項對應(yīng)的鎖的狀態(tài)更改為未鎖 定。
[0054] 需要說明的是,在附圖的流程示意圖示出的步驟可以在諸如一組計算機可執(zhí)行指 令的計算機系統(tǒng)中執(zhí)行,并且,雖然在流程示意圖中示出了邏輯順序,但是在某些情況下, 可以以不同于此處的順序執(zhí)行所示出或描述的步驟。
[0055] 通過上述步驟,通過上述系統(tǒng),采用了客戶端根據(jù)服務(wù)端中保存的鎖的狀態(tài)對確 定該客戶端是否能夠?qū)υ摂?shù)據(jù)項對應(yīng)的數(shù)據(jù)進行處理的方式。由于對于每一個數(shù)據(jù)項,在 每個客戶端對其進行處理時都需要獲得鎖之后才能進行處理,并且,該鎖的狀態(tài)均由服務(wù) 端提供,因此客戶端在要對這個數(shù)據(jù)項中的數(shù)據(jù)進行更改的情況下,只需要判斷客戶端對 于該數(shù)據(jù)項對應(yīng)的鎖的狀態(tài),就能確定能否對該數(shù)據(jù)項進行處理。對于多個客戶端,當存在 一項數(shù)據(jù)項中的數(shù)據(jù)可能被多個客戶端修改的時候,每個客戶端在對該數(shù)據(jù)項中的處理進 行處理之前,均可以讀取服務(wù)端上的該客戶端對應(yīng)的該數(shù)據(jù)項的鎖的狀態(tài),如果該鎖的狀 態(tài)為未鎖定,可以進行數(shù)據(jù)的處理。這相比于相關(guān)技術(shù)中的二階段提交協(xié)議而言,只需要通 過獲取鎖的狀態(tài)就可以對數(shù)據(jù)進行處理,提供了處理的效率。
[0056] 在該方法實施例中涉及的對應(yīng)的功能實現(xiàn)也能結(jié)合對上述系統(tǒng)中各個模塊和單 元的功能描述進行結(jié)合描述和說明,在此不再贅述。
[0057] 優(yōu)選地,鎖的狀態(tài)可以包括:多個客戶端分別對應(yīng)的數(shù)據(jù)項的鎖的狀態(tài);和/或, 多個數(shù)據(jù)項分別對應(yīng)的鎖的狀態(tài)。
[0058] 優(yōu)選地,鎖的狀態(tài)可以以位圖的方式保存在服務(wù)端,其中,位圖中的每一位用于表 示多個客戶端中每個客戶端對應(yīng)的數(shù)據(jù)項對應(yīng)的鎖的狀態(tài)。
[0059] 優(yōu)選地,在數(shù)據(jù)項的數(shù)量為多個的情況下,鎖的狀態(tài)以位圖的方式保存在服務(wù)端 包括:鎖的狀態(tài)以多個位圖的方式保存在服務(wù)端,其中,每個位圖用于表示多個客戶端的同 一個數(shù)據(jù)項對應(yīng)的鎖的狀態(tài),或用于表示多個客戶端中一個客戶端中的多個數(shù)據(jù)項對應(yīng)的 鎖的狀態(tài)。
[0060] 優(yōu)選地,在該多個客戶端請求將該鎖的狀態(tài)更改為鎖定的情況下,可以根據(jù)預(yù)先 確定的順序請求將該數(shù)據(jù)項對應(yīng)的鎖的狀態(tài)更改為鎖定;此時,可以根據(jù)與該順序相反的 順序請求將該數(shù)據(jù)項對應(yīng)的鎖的狀態(tài)更改為未鎖定。
[0061] 優(yōu)選地,鎖的狀態(tài)保存在服務(wù)端的內(nèi)存或共享內(nèi)存中。
[0062] 優(yōu)選地,該方法還包括:在將鎖的狀態(tài)更改為鎖定的情況下,服務(wù)端記錄鎖的位置 和鎖的狀態(tài)更改為鎖定的時間;服務(wù)端根據(jù)所的狀態(tài)更改為鎖定的時間和當前時間,判斷 鎖的鎖定狀態(tài)是否超過預(yù)定時長;在判斷結(jié)果為是的情況下,根據(jù)記錄的鎖的位置,將鎖的 狀態(tài)更改為未鎖定。
[0063] 優(yōu)選地,解鎖一般由客戶端向服務(wù)端發(fā)起,由服務(wù)端執(zhí)行。例如,每一個鎖對應(yīng)一 個存儲位置,在客戶端處理完數(shù)據(jù)項之后,將請求需要解鎖的鎖的位置信息發(fā)送給服務(wù)端, 服務(wù)端則根據(jù)該位置信息將對應(yīng)的鎖的狀態(tài)更改為未鎖定,從而完成了鎖的解鎖操作。 [0064] 優(yōu)選地,本申請還可以提供一個用于執(zhí)行上述實施例的計算機程序以及保存上述 計算機程序的載體,即本申請上述實施例可以通過一個合適的計算體系結(jié)構(gòu)來進行符合自 然規(guī)律的運行過程。另外,盡管在上述上下文中描述本申請,但上述用于實現(xiàn)執(zhí)行步驟的計 算機程序并不意味著是限制性的,所描述的動作和操作的各方面也可用硬件來實現(xiàn)。
[0065] 本申請的原理可以使用其它通用或?qū)S糜嬎慊蛲ㄐ怒h(huán)境或配置來操作。適用于本 申請的眾所周知的計算系統(tǒng)、環(huán)境和配置的示例包括但不限于,個人計算機、服務(wù)器,多處 理器系統(tǒng)、基于微處理的系統(tǒng)、小型機、大型計算機、智能設(shè)備、終端(包括移動終端)、以及 包括任一上述系統(tǒng)或設(shè)備的分布式計算環(huán)境。
[0066] 下面將結(jié)合優(yōu)選的實施例對其實現(xiàn)過程進行詳細描述。
[0067] 本優(yōu)選實施例應(yīng)用于分布式系統(tǒng)中,米用Java (-種由SUN公司推出的應(yīng)用程序 開發(fā)語言)、RPC (Remote Procedure Call,遠程過程調(diào)用,當一個程序向位于網(wǎng)絡(luò)中其他 計算機的程序請求服務(wù)時使用的協(xié)議,此時請求服務(wù)的程序不需要了解對方網(wǎng)絡(luò)的詳細內(nèi) 容)、BitMap (位圖,又稱為點陣圖,是一種按位表示狀態(tài)的數(shù)據(jù)結(jié)構(gòu))、Hash (哈希,一種快 速檢索的算法)等技術(shù)實現(xiàn)用戶操作的串行化,保證用戶關(guān)鍵數(shù)據(jù)的正確讀寫,并解決了相 關(guān)技術(shù)并行性差、處理效率低的問題。
[0068] 圖4是根據(jù)本申請優(yōu)選實施例的數(shù)據(jù)處理系統(tǒng)的系統(tǒng)框圖,如圖4所示,該系統(tǒng)包 括鎖服務(wù)端42、客戶端44 (相當于上述客戶端10)和數(shù)據(jù)存儲集群46。其中,鎖服務(wù)端42 相當于上述的服務(wù)端12,用于存儲各個客戶端對應(yīng)于各個關(guān)鍵數(shù)據(jù)(即上述待處理的相同 數(shù)據(jù)項)的鎖的狀態(tài),以提供鎖服務(wù);數(shù)據(jù)存儲集群46是分布式系統(tǒng)中存儲數(shù)據(jù)的存儲服 務(wù)器的集群。
[0069] 需要說明的是,圖4是圖1的一種簡單變形形式。其中,在圖4中還示出了用于存 儲數(shù)據(jù)項的數(shù)據(jù)存儲集群46。需要說明的是,客戶端44也可以是數(shù)據(jù)存儲集群46中的一 個存儲服務(wù)器。
[0070] 在圖4中還示出了本優(yōu)選實施例的數(shù)據(jù)處理系統(tǒng)的工作交互過程,這些過程均可 以采用RPC方式進行,包括如下步驟:
[0071] 步驟S402,請求鎖。每次對關(guān)鍵數(shù)據(jù)進行讀寫操作之前請求鎖操作,如果該鎖未被 上鎖,則返回客戶端44成功,可以進行后續(xù)操作,否則,返回客戶端44失敗。
[0072] 步驟S404,關(guān)鍵數(shù)據(jù)讀寫。在獲取鎖之后(此時鎖服務(wù)端42中相應(yīng)的鎖被上鎖), 即可對關(guān)鍵數(shù)據(jù)進行讀寫操作。因為存儲部分與本申請關(guān)系不大,因此在此不再贅述。
[0073] 步驟S406,解鎖??蛻舳?4在完成關(guān)鍵數(shù)據(jù)的讀寫操作之后,需要對之前請求的 鎖進行解鎖操作,以備下次關(guān)鍵數(shù)據(jù)讀寫操作時繼續(xù)使用。
[0074] 為了提高鎖服務(wù)的可用性,鎖服務(wù)采用BitMap實現(xiàn),按位表示每個用戶(即上述 客戶端44)的鎖服務(wù)狀態(tài),例如,在本優(yōu)選實施例中定義"0"表示未上鎖,"1"表示上鎖。圖 5是根據(jù)本申請優(yōu)選實施例的位圖的示意圖,如圖5所示,圖中一共有25個鎖位,可以表示 25個用戶對關(guān)鍵數(shù)據(jù)的上鎖狀態(tài),圖中索引為0 (即第一行左起第一個位置)和2 (即第一 行左起第三個位置)的鎖為上鎖狀態(tài),其余索引位均為未上鎖狀態(tài)。圖中每1個鎖位占用1 位,則25個用戶只需要占用25位;由于4個字節(jié)可以提供32位,因此,圖5中所示的位圖 僅需4個字節(jié)即可滿足需要。
[0075] 需要說明的是,如果要表示多個關(guān)鍵數(shù)據(jù)的鎖狀態(tài)的話,可以采用多個鎖位來表 示用戶對不同關(guān)鍵數(shù)據(jù)的上鎖狀態(tài)。并且,為了防止死鎖,上鎖可以由鎖位低位向高位進行 依次上鎖,解鎖需要由高位向低位進行解鎖。
[0076] 優(yōu)選地,上述位圖的位圖空間申請,采用共享內(nèi)存的方式實現(xiàn)。通過該方式實現(xiàn)多 個客戶端同時訪問和更改位圖中的鎖的狀態(tài)。
[0077] 優(yōu)選地,對位圖中的位的設(shè)置操作如下:
[0078] 步驟1,計算鎖位(即鎖在位圖中的位)對應(yīng)的字節(jié)索引,記為pos ;
[0079] 步驟2,計算鎖位對應(yīng)的字節(jié)內(nèi)索引,記為inpos ;
[0080] 步驟3,判斷是對該鎖進行上鎖還是解鎖操作,如果是上鎖,可以通過掩碼或1操 作將鎖位置為1,否則可以通過掩碼與0操作將鎖位置為0,置位后的字節(jié)記為newbyte ;
[0081] 步驟4,將newbyte替換pos位置的字節(jié)。
[0082] 優(yōu)選地,檢測位圖中的位是否上鎖的操作如下:
[0083] 步驟1,計算鎖位對應(yīng)的字節(jié)索引,記為pos ;
[0084] 步驟2,計算鎖位對應(yīng)的字節(jié)內(nèi)索引,記為inpos ;
[0085] 步驟3,通過掩碼與1操作獲取指定字節(jié)位是否為1,如果是則確定為上鎖狀態(tài),否 則確定為解鎖狀態(tài)。
[0086] 為了防止死鎖,鎖服務(wù)端42上本身采用了死鎖檢測機制,來釋放長時間占用卻 未解除的鎖。這里采用Java開發(fā)工具包(Java Developer' s Kit,簡稱為JDK)中的 ConcurrentHashMap〈int, int> (以下用Map來表示)來記錄用戶的鎖狀態(tài),該Map可以提供 并發(fā)的檢索和更新操作。
[0087] 優(yōu)選地,采用上述的Map進行上鎖、解鎖和進行死鎖檢測的方式如下:
[0088] 步驟S1,當用戶上鎖操作時,將用戶的上鎖位置(記為index)和上鎖時間(記為 locktime)計入Map中,調(diào)用在Map中保存信息的功能:Map. put (index, locktime),這樣 就完成了上鎖時間和上鎖位置的記錄。該過程由客戶端發(fā)起RPC,由服務(wù)端完成。
[0089] 步驟S2,當用戶解鎖操作時,將用戶的解鎖位置index傳入Map中,并從Map中將 上鎖信息移除,例如調(diào)用Map. remove (index)移除上鎖信息。該過程由客戶端發(fā)起RPC,由 服務(wù)端完成。
[0090] 步驟S3,為了防止死鎖,在本優(yōu)選實施例中規(guī)定了一個鎖超時時間,例如將鎖超時 時間設(shè)置為3秒,則鎖服務(wù)端42每隔3秒會檢測Map,將超時的鎖移除。該過程由服務(wù)端發(fā) 起,也由服務(wù)端完成。
[0091] 客戶端在進行關(guān)鍵數(shù)據(jù)更新操作(記為UpdateKeyData函數(shù))前,需要先做加鎖操 作(記為Lock),這里會有3種情況:
[0092] 情況11,加鎖成功,可繼續(xù)進行關(guān)鍵數(shù)據(jù)更新,并且無論數(shù)據(jù)是否更新成功,要完 成解鎖操作;
[0093] 情況12,加鎖失敗被占用,不能繼續(xù)關(guān)鍵數(shù)據(jù)更新,客戶端可以稍后重試;
[0094] 情況13,加鎖失敗調(diào)用異常(可能是網(wǎng)絡(luò)異常、硬件故障等導(dǎo)致),后續(xù)操作同情況 二,例如,稍后重試。
[0095] 當完成關(guān)鍵數(shù)據(jù)更新后,需要進行解鎖操作,這里可能會出現(xiàn)兩種情況:
[0096] 情況21,解鎖成功,程序即可繼續(xù)執(zhí)行;
[0097] 情況22,解鎖失敗,異常情形同加鎖操作情況13中的描述,這里將會采用服務(wù)端 實現(xiàn)的步驟S3操作來完成解鎖操作。
[0098] 優(yōu)選地,客戶端實現(xiàn)的操作如下:
[0099] 步驟1,預(yù)先設(shè)置用于表示是否成功上鎖的變量isSucLock,并設(shè)置為不成功;
[0100] 步驟2,與鎖服務(wù)通訊設(shè)置指定鎖為上鎖狀態(tài),并將結(jié)果設(shè)置到變量isSucLock 中;
[0101] 步驟3,如果上鎖成功,則更新關(guān)鍵數(shù)據(jù),否則返回不成功;
[0102] 步驟4,如果成功上鎖,與服務(wù)器通訊做一次解鎖操作。
[0103] 在本優(yōu)選實施例中還提供了一種將字符串轉(zhuǎn)換為int (即整型變量)的方法。由 于在某些系統(tǒng),用戶的身份標識號碼(IDentity,簡稱為ID)并非int類型,而可能是常見 的是字符串類型,這里將提供兩種將字符串轉(zhuǎn)換為int的優(yōu)選方法,包括:調(diào)用String. hashCodeO函數(shù)進行轉(zhuǎn)換;或者根據(jù)實際的ID情況,對hashCode進行重寫。
[0104] 上述實施例及優(yōu)選實施方式可以應(yīng)用到用戶積分處理中,以下對此進行說明。需 要說明的是,用戶積分處理僅僅是一個優(yōu)選的應(yīng)用場景,并不限于此。
[0105] 在某些網(wǎng)絡(luò)服務(wù)中,例如,在QQ中,對于不同的QQ用戶可以進行評級,這些評級可 以是對用戶的行為進行累計積分,并根據(jù)累計的積分劃分用戶等級,以給不同層次的用戶 提供差異化的服務(wù)。這些積分可以儲存在服務(wù)器上,根據(jù)用戶的行為以及一定的策略可以 計算和累計積分。由于在一些策略中,積分還可以對應(yīng)于"多個用戶",因此,需要一種可靠 的積分處理方法用于多個用戶對服務(wù)器上的積分進行處理。需要說明的是,上述的"多個用 戶"可以指多個用戶賬號,也可以指同一個用戶賬號可以使用的多個服務(wù)。
[0106] 例如,用戶積分的場景可以是這樣的,A用戶自身的行為可以增加 A的積分+1,B 用戶的自身行為除了可以增加 B的積分+1,也可以增加 A的積分+1。
[0107] 假設(shè)A用戶積分是1,在某個時間點A發(fā)出動作,B也發(fā)出動作,正常情況下A的積 分應(yīng)該變成3。但是如果沒有合理的加鎖機制,會導(dǎo)致A的積分錯誤,例如,客戶端A先獲取 積分1,然后+1,更新到數(shù)據(jù)存儲為2,在A未更新時,此時B獲取A的積分,然后+1,得到的 結(jié)果仍然為2,而不是3
[0108] 以騰訊公司的QQ (-款騰訊公司的即時通訊軟件)等級為例,其等級計算也是基 于一定的積分的策略,但其積分的單位是以"累計登錄天數(shù)"計的,簡稱"天"。QQ等級的默 認積分策略是每一個自然天中保持登陸2小時以上,則增加 QQ積分1天。此外,還設(shè)置了 積分累計的其他策略,如下表所示:
[0109] 表 1
[0110]
【權(quán)利要求】
1. 一種數(shù)據(jù)處理系統(tǒng),其特征在于,包括客戶端和服務(wù)端,其中: 所述服務(wù)端與所述客戶端相連,包括: 保存模塊,用于保存所述客戶端待處理的數(shù)據(jù)項對應(yīng)的鎖的狀態(tài); 更改模塊,用于更改所述鎖的狀態(tài)為鎖定或未鎖定; 所述客戶端包括: 確定模塊,用于確定所述待處理的數(shù)據(jù)項對應(yīng)的鎖的狀態(tài)為未鎖定; 第一請求模塊,用于請求將所述數(shù)據(jù)項對應(yīng)的鎖的狀態(tài)更改為鎖定; 處理模塊,用于在所述數(shù)據(jù)項對應(yīng)的鎖的狀態(tài)被更改為鎖定之后,對所述數(shù)據(jù)項中的 數(shù)據(jù)進行處理; 第二請求模塊,用于在處理所述數(shù)據(jù)成功之后,請求將所述數(shù)據(jù)項對應(yīng)的鎖的狀態(tài)更 改為未鎖定。
2. 根據(jù)權(quán)利要求1所述的系統(tǒng),其特征在于, 所述鎖的狀態(tài)包括:多個客戶端分別對應(yīng)的所述數(shù)據(jù)項的鎖的狀態(tài);和/或,多個數(shù)據(jù) 項分別對應(yīng)的鎖的狀態(tài)。
3. 根據(jù)權(quán)利要求2所述的系統(tǒng),其特征在于,所述鎖的狀態(tài)以位圖的方式保存在所述 服務(wù)端,其中,所述位圖中的每一位分別用于表示所述多個客戶端中每個客戶端對應(yīng)的所 述數(shù)據(jù)項的鎖的狀態(tài)。
4. 根據(jù)權(quán)利要求3所述的系統(tǒng),其特征在于,在所述相同數(shù)據(jù)項的數(shù)量為多個的情況 下,所述鎖的狀態(tài)以所述位圖的方式保存在所述服務(wù)端包括:所述鎖的狀態(tài)以多個所述位 圖的方式保存在所述服務(wù)端,其中,每個所述位圖用于表示所述多個客戶端的同一個數(shù)據(jù) 項對應(yīng)的鎖的狀態(tài),或用于表示所述多個客戶端中一個客戶端中的多個數(shù)據(jù)項對應(yīng)的鎖的 狀態(tài)。
5. 根據(jù)權(quán)利要求2至4中任一項所述的系統(tǒng),其特征在于,在所述多個客戶端請求將所 述鎖的狀態(tài)更改為鎖定的情況下, 所述第一請求模塊用于根據(jù)預(yù)先確定的順序請求將所述數(shù)據(jù)項對應(yīng)的鎖的狀態(tài)更改 為鎖定; 所述第二請求模塊用于根據(jù)與所述順序相反的順序請求將所述數(shù)據(jù)項對應(yīng)的鎖的狀 態(tài)更改為未鎖定。
6. 根據(jù)權(quán)利要求2至4中任一項所述的系統(tǒng),其特征在于,所述保存模塊還用于將所述 鎖的狀態(tài)保存在所述服務(wù)端的內(nèi)存或共享內(nèi)存中。
7. 根據(jù)權(quán)利要求2至4中任一項所述的系統(tǒng),其特征在于, 所述更改模塊還用于在將所述鎖的狀態(tài)更改為鎖定的情況下,記錄所述鎖的位置和所 述鎖的狀態(tài)更改為鎖定的時間; 所述服務(wù)端還包括:判斷模塊,用于根據(jù)所述鎖的狀態(tài)更改為鎖定的時間和當前時間, 判斷所述鎖的鎖定狀態(tài)是否超過預(yù)定時長;以及, 所述更改模塊還用于在判斷結(jié)果為是的情況下,根據(jù)記錄的所述鎖的位置,將所述鎖 的狀態(tài)更改為未鎖定。
8. -種數(shù)據(jù)處理方法,其特征在于包括: 確定客戶端待處理的數(shù)據(jù)項的鎖的狀態(tài)為未鎖定,其中,所述鎖的狀態(tài)保存在服務(wù)端 上; 請求將所述數(shù)據(jù)項對應(yīng)的鎖的狀態(tài)更改為鎖定; 在所述數(shù)據(jù)項對應(yīng)的鎖的狀態(tài)被更改為鎖定之后,對所述數(shù)據(jù)項中的數(shù)據(jù)進行處理; 在處理所述數(shù)據(jù)成功之后,請求將所述數(shù)據(jù)項對應(yīng)的鎖的狀態(tài)更改為未鎖定。
9. 根據(jù)權(quán)利要求8所述的方法,其特征在于, 所述鎖的狀態(tài)包括:多個客戶端分別對應(yīng)的所述數(shù)據(jù)項的鎖的狀態(tài);和/或,多個數(shù)據(jù) 項分別對應(yīng)的鎖的狀態(tài)。
10. 根據(jù)權(quán)利要求9所述的方法,其特征在于,所述鎖的狀態(tài)以位圖的方式保存在所述 服務(wù)端,其中,所述位圖中的每一位分別用于表示所述多個客戶端中每個客戶端對應(yīng)的所 述數(shù)據(jù)項的鎖的狀態(tài)。
11. 根據(jù)權(quán)利要求10所述的方法,其特征在于,在所述數(shù)據(jù)項的數(shù)量為多個的情況下, 所述鎖的狀態(tài)以所述位圖的方式保存在所述服務(wù)端包括:所述鎖的狀態(tài)以多個所述位圖 的方式保存在所述服務(wù)端,其中,每個所述位圖用于表示所述多個客戶端的同一個數(shù)據(jù)項 對應(yīng)的鎖的狀態(tài),或用于表示所述多個客戶端中一個客戶端中的多個數(shù)據(jù)項對應(yīng)的鎖的狀 態(tài)。
12. 根據(jù)權(quán)利要求8至11中任一項所述的方法,其特征在于,在所述多個客戶端請求將 所述鎖的狀態(tài)更改為鎖定的情況下, 請求將所述數(shù)據(jù)項對應(yīng)的鎖的狀態(tài)更改為鎖定包括:根據(jù)預(yù)先確定的順序請求將所述 數(shù)據(jù)項對應(yīng)的鎖的狀態(tài)更改為鎖定; 請求將所述數(shù)據(jù)項對應(yīng)的鎖的狀態(tài)更改為未鎖定包括:根據(jù)與所述順序相反的順序請 求將所述數(shù)據(jù)項對應(yīng)的鎖的狀態(tài)更改為未鎖定。
13. 根據(jù)權(quán)利要求8至11中任一項所述的方法,其特征在于,所述鎖的狀態(tài)保存在所述 服務(wù)端的內(nèi)存或共享內(nèi)存中。
14. 根據(jù)權(quán)利要求8至11中任一項所述的方法,其特征在于,所述方法還包括: 在將所述鎖的狀態(tài)更改為鎖定的情況下,所述服務(wù)端記錄所述鎖的位置和所述鎖的狀 態(tài)更改為鎖定的時間; 所述服務(wù)端根據(jù)所述鎖的狀態(tài)更改為鎖定的時間和當前時間,判斷所述鎖的鎖定狀態(tài) 是否超過預(yù)定時長; 在判斷結(jié)果為是的情況下,根據(jù)記錄的所述鎖的位置,將所述鎖的狀態(tài)更改為未鎖定。
【文檔編號】H04L29/06GK104065636SQ201310275181
【公開日】2014年9月24日 申請日期:2013年7月2日 優(yōu)先權(quán)日:2013年7月2日
【發(fā)明者】張春瑋 申請人:騰訊科技(深圳)有限公司