欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

基于緩沖區(qū)的異步更新的方法

文檔序號(hào):6635595閱讀:252來源:國知局
基于緩沖區(qū)的異步更新的方法
【專利摘要】本發(fā)明公開了一種基于緩沖區(qū)的異步更新的方法,包括:提交更新請求;判斷隊(duì)列是否為空;如果所述隊(duì)列不為空,則取出隊(duì)列元素,以準(zhǔn)備處理所述更新請求;計(jì)算出最新的更新閾值;將所述更新請求更新到本地;檢查所述更新是否觸發(fā)了更新策略;以及如果觸發(fā)了所述更新策略,則更新分布式緩存或者數(shù)據(jù)庫。
【專利說明】基于緩沖區(qū)的異步更新的方法

【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及數(shù)據(jù)的更新,更具體地,本發(fā)明涉及基于緩沖區(qū)的異步更新的方法。

【背景技術(shù)】
[0002]如果想將某個(gè)值更新到分布式緩存服務(wù)器或者數(shù)據(jù)庫中,只能直接更新數(shù)據(jù)庫或者分布式緩存。然而,因?yàn)榇a通常被部署在多臺(tái)服務(wù)器上,每臺(tái)服務(wù)器上又有多個(gè)程序?qū)嵗\(yùn)行,所以同一時(shí)間很有可能會(huì)有兩個(gè)或者兩個(gè)以上的更新請求到達(dá)分布式緩存或者數(shù)據(jù)庫。
[0003]特別對于更新某個(gè)數(shù)值的情況。圖1示出了現(xiàn)有技術(shù)中更新某個(gè)數(shù)值的示意圖。如圖1所示,例如:分布式緩存中有數(shù)據(jù)A,值為1,有兩個(gè)(或者兩個(gè)以上)程序?qū)嵗M麑的值+1 (每個(gè)實(shí)例更新一次,理想的更新結(jié)果應(yīng)該為3),程序?qū)嵗粫r(shí)刻從分布式緩存中獲取A的值為1,并且在程序?qū)嵗镜馗聻?,同一時(shí)刻將請求發(fā)送到分布式緩存中,執(zhí)行更新操作(將1更新為2)。這時(shí),雖然有兩個(gè)程序?qū)嵗l(fā)出了更新請求,但更新的結(jié)果卻是2,而不是3,從而很容易產(chǎn)生臟寫。其根本原因是兩個(gè)程序?qū)嵗家詾橹挥凶约涸诟逻@個(gè)值,因?yàn)槎际窃?的基礎(chǔ)上+1,等到期待更新結(jié)果為2,并在同一時(shí)刻更新。
[0004]可以看出,更新越頻繁的場景,產(chǎn)生臟寫的頻率越高(因?yàn)橥粫r(shí)刻發(fā)出更新請求的幾率越高)。而且,整個(gè)獲取、更新操作是同步執(zhí)行的,這意味著每次更新都要至少和分布式緩存交互三次才能更新值。另外,在交互過程中,執(zhí)行的線程只能等待,降低了線程的處理效率。
[0005]因此,需要一種能夠克服以上問題的基于緩沖區(qū)的異步更新的方法。


【發(fā)明內(nèi)容】

[0006]針對現(xiàn)有處理方法的以下問題:每次更新都要等待更新結(jié)果,線程才能繼續(xù)執(zhí)行;針對更新頻繁的場景,不僅對分布式緩存或者數(shù)據(jù)庫產(chǎn)生很大的壓力,并且產(chǎn)生臟寫的幾率越高,本發(fā)明提出了一種異步的、對使用者透明的更新分布式緩存或數(shù)據(jù)庫的方法,以便提高發(fā)出更新請求線程的執(zhí)行效率以及在高并發(fā)場景下對數(shù)據(jù)庫可用性的提升。
[0007]根據(jù)本發(fā)明的一個(gè)實(shí)施例,提供了一種基于緩沖區(qū)的異步更新的方法,包括:提交更新請求;判斷隊(duì)列是否為空;如果所述隊(duì)列不為空,則取出隊(duì)列元素,以準(zhǔn)備處理所述更新請求;計(jì)算出最新的更新閾值;將所述更新請求更新到本地;檢查所述更新是否觸發(fā)了更新策略;以及如果觸發(fā)了所述更新策略,則更新分布式緩存或者數(shù)據(jù)庫。
[0008]優(yōu)選地,所述提交更新請求的步驟進(jìn)一步包括:通過所述更新請求中的密鑰計(jì)算出散列碼的值;通過用所述散列碼與處理線程的個(gè)數(shù)取模,計(jì)算出偏移量,以找到相應(yīng)的處理線程;以及將所述更新請求封裝后放入所述相應(yīng)的處理線程的處理隊(duì)列中,以供線程獲取。
[0009]優(yōu)選地,將所述更新請求封裝后放入所述相應(yīng)的處理線程的處理隊(duì)列中的步驟進(jìn)一步包括:將同一類型的所述更新請求指向同一個(gè)處理線程,并放入同一個(gè)處理隊(duì)列。
[0010]優(yōu)選地,如果所述隊(duì)列為空,則當(dāng)前線程沉睡,等待提交更新請求的線程放入更新請求后恢復(fù)執(zhí)行。
[0011]優(yōu)選地,所述計(jì)算出最新的更新閾值的步驟進(jìn)一步包括:每次更新請求計(jì)算前設(shè)定保護(hù)閥值,獲取當(dāng)前線程處理隊(duì)列的大小,a)如果當(dāng)前線程處理隊(duì)列的大小小于保護(hù)閥值,則將當(dāng)前更新請求的更新閥值設(shè)置為所述保護(hù)閥值山)如果當(dāng)前線程處理隊(duì)列的大小大于保護(hù)閥值,則直接采用當(dāng)前隊(duì)列的大小作為當(dāng)前的更新閥值。
[0012]優(yōu)選地,觸發(fā)更新策略包括更新次數(shù)達(dá)到所述最新的更新閥值、或者本次更新在更新周期內(nèi)。
[0013]本發(fā)明判斷請求由哪個(gè)線程計(jì)算的方式,實(shí)現(xiàn)了每個(gè)更新請求被固定線程處理,從而線程處理更新時(shí),不需要任何加鎖,有很好的執(zhí)行效率。而且本發(fā)明對更新請求提出了一種異步更新的方式,提高更新效率的同時(shí),起到了緩沖區(qū)的作用,在突然大量請求達(dá)到時(shí)對分布式緩存或者數(shù)據(jù)庫有保護(hù)作用。
[0014]根據(jù)本公開和附圖的下面的詳細(xì)描述,對本領(lǐng)域的普通技術(shù)人員來說其它的目的、特征、以及優(yōu)點(diǎn)將是顯而易見的。

【專利附圖】

【附圖說明】
[0015]附圖圖示了本發(fā)明的實(shí)施例,并與說明書一起用于解釋本發(fā)明的原理。在附圖中:
[0016]圖1示出了現(xiàn)有技術(shù)中更新某個(gè)數(shù)值的示意圖。
[0017]圖2是根據(jù)本發(fā)明的實(shí)施例的用于提交更新請求的線程的示意圖。
[0018]圖3是根據(jù)本發(fā)明的實(shí)施例的更新緩沖區(qū)的內(nèi)存結(jié)構(gòu)示意圖。
[0019]圖4是根據(jù)本發(fā)明的實(shí)施例的基于緩沖區(qū)的異步更新的方法的流程圖。

【具體實(shí)施方式】
[0020]根據(jù)本發(fā)明的實(shí)施例公開了一種基于緩沖區(qū)的異步更新的方法。在以下描述中,為了說明的目的,闡述了多個(gè)具體細(xì)節(jié)以提供對本發(fā)明的實(shí)施例的全面理解。然而,對于本領(lǐng)域人員顯而易見的是,本發(fā)明的實(shí)施例可以在沒有這些具體細(xì)節(jié)的情況下實(shí)現(xiàn)。
[0021]如在此所使用的“線程池”是一種多線程處理形式,處理過程中將任務(wù)添加到隊(duì)列,然后在創(chuàng)建線程后自動(dòng)啟動(dòng)這些任務(wù)。線程池線程都是后臺(tái)線程。每個(gè)線程都使用默認(rèn)的堆棧大小,以默認(rèn)的優(yōu)先級(jí)運(yùn)行,并處于多線程單元中。在Java中常使用線程池在多線程環(huán)境下執(zhí)行任務(wù),用于處理多個(gè)文件的讀寫,分析等功能。
[0022]如在此所使用的“鎖”是在多線程環(huán)境下一個(gè)常用的工具類,用于在代碼塊間做同步操作,保證在鎖覆蓋的范圍內(nèi),代碼的串行執(zhí)行,常用于解決并發(fā)問題。
[0023]如在此所使用的“線程”指的是Java中的線程,它是執(zhí)行代碼的最小單元。通常在線程池的統(tǒng)一管理下,執(zhí)行各類代碼。
[0024]如在此使用的“分布式存儲(chǔ)系統(tǒng)”是指將數(shù)據(jù)分散存儲(chǔ)在多臺(tái)獨(dú)立的設(shè)備上。傳統(tǒng)的網(wǎng)絡(luò)存儲(chǔ)系統(tǒng)采用集中的存儲(chǔ)服務(wù)器存放所有數(shù)據(jù),存儲(chǔ)服務(wù)器成為系統(tǒng)性能的瓶頸,也是可靠性和安全性的焦點(diǎn),不能滿足大規(guī)模存儲(chǔ)應(yīng)用的需要。分布式網(wǎng)絡(luò)存儲(chǔ)系統(tǒng)采用可擴(kuò)展的系統(tǒng)結(jié)構(gòu),利用多臺(tái)存儲(chǔ)服務(wù)器分擔(dān)存儲(chǔ)負(fù)荷,利用位置服務(wù)器定位存儲(chǔ)信息,它不但提高了系統(tǒng)的可靠性、可用性和存取效率,還易于擴(kuò)展。
[0025]根據(jù)本發(fā)明解決其技術(shù)問題所采用的技術(shù)方案,在接受更新請求時(shí)僅將更新結(jié)果緩存在程序本地,當(dāng)更新次數(shù)達(dá)到用戶設(shè)定的閥值或者周期性的間隔某個(gè)時(shí)間段后再向分布式緩存或者數(shù)據(jù)庫中發(fā)出更新請求,以便實(shí)現(xiàn)更新請求在程序本地的緩沖,減少分布式緩存或者數(shù)據(jù)庫的服務(wù)壓力,同時(shí)減少向分布式緩存或者數(shù)據(jù)庫發(fā)送的請求量。同時(shí),在使用更新閥值這種更新策略時(shí),根據(jù)更新的頻繁程度,動(dòng)態(tài)的調(diào)整更新閥值,以實(shí)現(xiàn)在應(yīng)對突然到來的大量更新請求時(shí),起到請求在程序本地緩沖的作用,以減少對分布式緩存或者數(shù)據(jù)庫的壓力。
[0026]值得注意的是,本發(fā)明提供了一種非常好的解決方案并提供了一些默認(rèn)實(shí)現(xiàn)方式,并且有很好的擴(kuò)展性,除了默認(rèn)的執(zhí)行方式,還提供了觸發(fā)策略和持久化策略的接口供使用者自行實(shí)現(xiàn)“什么時(shí)候觸發(fā)更新”,“更新到分布式緩存中還是數(shù)據(jù)庫中”,有很強(qiáng)的靈活性。
[0027]圖2是根據(jù)本發(fā)明的實(shí)施例的用于提交更新請求的線程的示意圖。如圖2所示,對于提交更新請求的線程,具體實(shí)現(xiàn)步驟如下:
[0028]1.當(dāng)有更新請求產(chǎn)生時(shí),調(diào)用本發(fā)明的更新接口,提交更新請求;
[0029]2.本發(fā)明通過更新請求中的密鑰(key),計(jì)算出散列碼(hashcode)的值,并用hashcode與處理線程的個(gè)數(shù)取摸,計(jì)算出偏移量,從而找到相應(yīng)的處理線程;
[0030]3.將更新請求封裝后放到處理線程的處理隊(duì)列中,供線程獲取。
[0031]hashcode是jdk根據(jù)對象的地址或者字符串或者數(shù)字算出來的int類型的數(shù)值。取模(Mod)運(yùn)算的含義為求余。例如llMod 2,值為1,并且任何數(shù)與2取模,結(jié)果只可能為0或者1,即求余數(shù)的結(jié)果只能為小于被余數(shù)到大于等于0之間的整數(shù)。
[0032]根據(jù)本發(fā)明的實(shí)施例,通過hashcode與處理線程數(shù)取模的計(jì)算使得某個(gè)線程只處理一定數(shù)量的更新請求,并且因?yàn)槊看胃抡埱蟮膋ey值不變,hashcode就不會(huì)變,余數(shù)也不會(huì)變,從而每次該key的更新請求都有固定的線程處理,這樣的好處是更新次數(shù)統(tǒng)計(jì),本次緩存初始化時(shí)都不需要加鎖同步執(zhí)行,在高并發(fā)下,合理利用多線程分散處理更新請求,并且因?yàn)椴恍枰渔i的關(guān)系,提高了處理效率。
[0033]圖3是根據(jù)本發(fā)明的實(shí)施例的更新緩沖區(qū)的內(nèi)存結(jié)構(gòu)示意圖。如圖3所示,線程與請求隊(duì)列一一對應(yīng)。圖3內(nèi)容結(jié)構(gòu)的特點(diǎn)在于將更新請求通過本發(fā)明的Hash算法分配到了不同的請求隊(duì)列上,借用隊(duì)列做到了請求的異步更新(更新請求只要將請求提交到請求隊(duì)列就完成了更新操作)。而現(xiàn)有的技術(shù)通常是直接將更新請求發(fā)送給數(shù)據(jù)庫或者分布式緩存,等待數(shù)據(jù)庫或者分布式緩存更新成功后,才算完成了更新操作?,F(xiàn)有做法最明顯的缺點(diǎn)在于:1.更新請求要等待數(shù)據(jù)庫或者分布式緩存更新成功才算完畢,更新較耗時(shí);2.每次更新請求到來都需要更新到數(shù)據(jù)庫或者分布式緩存,對數(shù)據(jù)庫或者分布式緩存有較大的請求壓力,而本發(fā)明因?yàn)槭钱惒胶喜⒏抡埱蠛蟾?,所以上述兩個(gè)缺點(diǎn)均不存在。
[0034]圖4是根據(jù)本發(fā)明的實(shí)施例的基于緩沖區(qū)的異步更新的方法的流程圖。具體地,對于處理線程:具體實(shí)現(xiàn)步驟如下:
[0035]1.判斷隊(duì)列是否為空,若為空,則當(dāng)前線程沉睡,等待提交更新請求的線程放入更新請求后恢復(fù)執(zhí)行。若不為空,則進(jìn)行第二步;
[0036]2.取出隊(duì)列元素,準(zhǔn)備處理更新請求;
[0037]3.計(jì)算出最新的更新閥值;
[0038]4.將更新請求更新到本地;
[0039]5.檢查本次更新是否觸發(fā)了更新策略;如果滿足更新條件,則執(zhí)行第六步,否則,返回到第一步,繼續(xù)獲取更新請求處理;
[0040]6.將本地最新的更新結(jié)果更新到分布式緩存或者數(shù)據(jù)庫中。
[0041]觸發(fā)更新策略的情形包括但不限于,更新次數(shù)達(dá)到步驟三設(shè)定的最新的更新閥值,或者是本次更新在更新周期內(nèi),具體根據(jù)使用時(shí)指定的策略而定。本發(fā)明不僅提供了更新次數(shù)或者更新周期作為觸發(fā)分布式緩存或者數(shù)據(jù)庫更新的更新條件,而且提供了觸發(fā)條件和更新方式的接口,使得使用者更靈活的定制觸發(fā)條件和更新方式。然而,本領(lǐng)域技術(shù)人員將理解,雖然本發(fā)明提供了更新次數(shù)或者更新周期作為觸發(fā)條件,但是本發(fā)明包括但不限于這兩種判斷方式,原則上,任何可以判斷是否需要更新的方法都應(yīng)該在本發(fā)明的保護(hù)范圍內(nèi)。
[0042]本發(fā)明通過動(dòng)態(tài)計(jì)算閥值的算法:每次處理更新請求時(shí),將處理隊(duì)列的長度和人為設(shè)定的保護(hù)閥值相比較,取較大者作為請求的更新閥值,實(shí)現(xiàn)了更新頻率與更新請求數(shù)的關(guān)聯(lián),使得本發(fā)明在應(yīng)對大量更新請求時(shí),請求的更新閥值會(huì)隨著請求量增大,減小更新頻率,使得對分布式緩存或者數(shù)據(jù)庫有更好的保護(hù)作用。并在請求量減少后,閥值逐漸減小,更新頻率逐漸增加。提高可行性的同時(shí)保證了更新結(jié)果盡可能快的更新到分布式緩存或者數(shù)據(jù)庫中。實(shí)現(xiàn)了可用性和及時(shí)性的平衡。
[0043]例如,根據(jù)一個(gè)實(shí)施例,如果使用的更新策略是按更新次數(shù)更新的策略,則使用以下算法來計(jì)算最新的更新閥值,以便動(dòng)態(tài)調(diào)整更新閥值,本算法假設(shè)更新分布式緩存或者數(shù)據(jù)庫的耗時(shí)遠(yuǎn)遠(yuǎn)高于更新本地耗時(shí),算法描述如下:獲取當(dāng)前線程處理隊(duì)列的大小,a)如果當(dāng)前線程處理隊(duì)列的大小小于系統(tǒng)默認(rèn)的最小閥值,則將當(dāng)前更新請求的閥值設(shè)置為該最小閥值山)如果當(dāng)前線程處理隊(duì)列的大小大于最小閥值,則直接采用當(dāng)前隊(duì)列的大小作為當(dāng)前更新請求的閥值。
[0044]這是因?yàn)?當(dāng)大量請求到來,或者更新分布式緩存或者數(shù)據(jù)庫緩慢,導(dǎo)致線程的處理隊(duì)列不斷增長時(shí),閥值相應(yīng)升高,從而減少更新分布式緩存或者數(shù)據(jù)庫的頻率,加快本地處理速度,從而降低處理隊(duì)列的大小。當(dāng)隊(duì)列變短時(shí),說明更新請求的提交不是非常頻繁,因此,更新閥值與隊(duì)列長度一起變短,更新分布式緩存或者數(shù)據(jù)庫的頻率升高,保證更新請求能盡可能快的更新到分布式緩存或者數(shù)據(jù)庫中。
[0045]通過本發(fā)明的技術(shù)方案,可以實(shí)現(xiàn)更新的異步化,更新線程不必等待更新結(jié)果可以繼續(xù)執(zhí)行;通過更新閥值或者更新周期的合理設(shè)定,可以避免臟寫情況的產(chǎn)生。
[0046]而且,通過本發(fā)明,可以大大降低對分布式緩存或者數(shù)據(jù)庫等持久化服務(wù)的更新壓力,特別是在突然大量的更新請求時(shí),因?yàn)橛袆?dòng)態(tài)更新閥值的設(shè)定,從而最大程度上避免對分布式緩存或者數(shù)據(jù)庫照成相應(yīng)的請求壓力,提高分布式緩存或者數(shù)據(jù)庫的可用性。
[0047]上述實(shí)施例僅是本發(fā)明的優(yōu)選實(shí)施例,并不用于限制本發(fā)明。對本領(lǐng)域技術(shù)人員顯而易見的是,在不脫離本發(fā)明精神和范圍的情況下,可以對本發(fā)明的實(shí)施例進(jìn)行各種修改和改變。因此,本發(fā)明意在涵蓋落入如權(quán)利要求所限定的本發(fā)明的范圍之內(nèi)的所有的修改或變型。
【權(quán)利要求】
1.一種基于緩沖區(qū)的異步更新的方法,包括: 提交更新請求; 判斷隊(duì)列是否為空; 如果所述隊(duì)列不為空,則取出隊(duì)列元素,以準(zhǔn)備處理所述更新請求; 計(jì)算出最新的更新閾值; 將所述更新請求更新到本地; 檢查所述更新是否觸發(fā)了更新策略;以及 如果觸發(fā)了所述更新策略,則更新分布式緩存或者數(shù)據(jù)庫。
2.根據(jù)權(quán)利要求1所述的方法,其中,所述提交更新請求的步驟進(jìn)一步包括: 通過所述更新請求中的密鑰計(jì)算出散列碼的值; 通過用所述散列碼與處理線程的個(gè)數(shù)取模,計(jì)算出偏移量,以找到相應(yīng)的處理線程;以及 將所述更新請求封裝后放入所述相應(yīng)的處理線程的處理隊(duì)列中,以供線程獲取。
3.根據(jù)權(quán)利要求2所述的方法,其中將所述更新請求封裝后放入所述相應(yīng)的處理線程的處理隊(duì)列中的步驟進(jìn)一步包括:將同一類型的所述更新請求指向同一個(gè)處理線程,并放入同一個(gè)處理隊(duì)列。
4.根據(jù)權(quán)利要求1所述的方法,進(jìn)一步包括:如果所述隊(duì)列為空,則當(dāng)前線程沉睡,等待提交更新請求的線程放入更新請求后恢復(fù)執(zhí)行。
5.根據(jù)權(quán)利要求1或2所述的方法,其中,所述計(jì)算出最新的更新閾值的步驟進(jìn)一步包括: 每次更新請求計(jì)算前設(shè)定保護(hù)閥值, 獲取當(dāng)前線程處理隊(duì)列的大小, a)如果當(dāng)前線程處理隊(duì)列的大小小于保護(hù)閥值,則將當(dāng)前更新請求的更新閥值設(shè)置為所述保護(hù)閥值; b)如果當(dāng)前線程處理隊(duì)列的大小大于保護(hù)閥值,則直接采用當(dāng)前隊(duì)列的大小作為當(dāng)前的更新閥值。
6.根據(jù)權(quán)利要求1所述的方法,其中,觸發(fā)更新策略包括更新次數(shù)達(dá)到所述最新的更新閥值、或者本次更新在更新周期內(nèi)。
【文檔編號(hào)】G06F17/30GK104376096SQ201410682991
【公開日】2015年2月25日 申請日期:2014年11月24日 優(yōu)先權(quán)日:2014年11月24日
【發(fā)明者】劉錕洋 申請人:北京京東尚科信息技術(shù)有限公司, 北京京東世紀(jì)貿(mào)易有限公司
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會(huì)獲得點(diǎn)贊!
1
黄梅县| 张家港市| 玉环县| 中西区| 诸暨市| 揭阳市| 新邵县| 庄浪县| 通榆县| 宁乡县| 蕉岭县| 盐边县| 台江县| 邮箱| 大姚县| 冀州市| 水城县| 五大连池市| 犍为县| 唐山市| 娄烦县| 金华市| 蒙自县| 临夏市| 梧州市| 潼南县| 衡山县| 榆林市| 吴川市| 仁寿县| 瓮安县| 河南省| 泸西县| 台北县| 文登市| 新化县| 阜康市| 益阳市| 和静县| 榆社县| 遵化市|