一種高并發(fā)下Memcache數(shù)據(jù)的獲取方法及系統(tǒng)的制作方法
【技術領域】
[0001]本發(fā)明涉及數(shù)據(jù)緩存領域,尤其涉及一種高并發(fā)下Memcache數(shù)據(jù)的獲取方法。
【背景技術】
[0002]Memcache是一套分布式的高速緩存系統(tǒng),由LiveJournal的Brad Fitzpatrick開發(fā),目前被許多網(wǎng)站使用以提升網(wǎng)站的訪問速度,尤其對于一些大型的、需要頻繁訪問數(shù)據(jù)庫的網(wǎng)站訪問速度提升效果十分顯著。
[0003]Memcache的工作原理如下:先檢查客戶端的請求數(shù)據(jù)是否在Memcache中,如有,直接把請求數(shù)據(jù)返回,不再對數(shù)據(jù)庫進行任何操作;如果請求的數(shù)據(jù)不在Memcache中,則查找數(shù)據(jù)庫,將從數(shù)據(jù)庫中獲取的數(shù)據(jù)返回給客戶端,同時將數(shù)據(jù)緩存一份到Memcache中;每次更新數(shù)據(jù)庫的同時需要更新Memcache中的數(shù)據(jù),以保證數(shù)據(jù)的一致性;當分配給Memcache內(nèi)存空間用完之后,會使用LRlXLeast Recently Used,最近最少使用)策略加上到期失效策略,失效數(shù)據(jù)首先被替換,然后再替換掉最近未使用的數(shù)據(jù)。
[0004]而在大并發(fā)的場合下,當大量并發(fā)請求同時獲取不到Memcache中的數(shù)據(jù)時,會同一時間去訪問數(shù)據(jù)庫并將數(shù)據(jù)同時緩存一份到Memcache中,這種大量并發(fā)請求同時訪問數(shù)據(jù)庫的情況會給系統(tǒng)帶來潛在的超負荷風險。
[0005]因此,現(xiàn)有技術還有待于改進和發(fā)展。
【發(fā)明內(nèi)容】
[0006]鑒于上述現(xiàn)有技術的不足,本發(fā)明的目的在于提供一種高并發(fā)下Memcache數(shù)據(jù)的獲取方法及系統(tǒng),旨在解決現(xiàn)有技術中高并發(fā)下容易造成系統(tǒng)超負荷的問題。
[0007]本發(fā)明的技術方案如下:
一種高并發(fā)下Memcache數(shù)據(jù)的獲取方法,其中,包括步驟:
A、拼裝第一關鍵字,并根據(jù)第一關鍵字獲取版本號;
B、將所述第一關鍵字和版本號組裝第二關鍵字,根據(jù)第二關鍵字從Memcache服務器獲取數(shù)據(jù);
C、判斷是否獲取到數(shù)據(jù),若未獲取到數(shù)據(jù),則根據(jù)所述第一關鍵字獲取鎖;
D、判斷是否獲取到鎖,若未獲取到鎖,則連續(xù)多次、每次間隔一段時間執(zhí)行步驟B以獲取數(shù)據(jù),若連續(xù)多次均未獲取到數(shù)據(jù),則將第一關鍵字對應的版本號減I,并根據(jù)第一關鍵字和減I后的版本號獲取上一版版本的數(shù)據(jù)。
[0008]所述的高并發(fā)下Memcache數(shù)據(jù)的獲取方法,其中,所述步驟D還包括:
若獲取到鎖,則返回步驟B重新獲取數(shù)據(jù),若獲取到數(shù)據(jù)則釋放鎖,若未獲取到數(shù)據(jù),則從數(shù)據(jù)庫中獲取數(shù)據(jù)并加載到Memcache服務器的緩存中。
[0009]所述的高并發(fā)下Memcache數(shù)據(jù)的獲取方法,其中,所述數(shù)據(jù)采用json格式的字符串進行存儲,當獲取到數(shù)據(jù)時,則將數(shù)據(jù)轉(zhuǎn)換成json對象。
[0010]所述的高并發(fā)下Memcache數(shù)據(jù)的獲取方法,其中,還包括步驟:對Memcache服務器下的緩存進行緩存失效操作:
將第一關鍵字對應的版本號加I,完成緩存失效操作。
[0011]所述的高并發(fā)下Memcache數(shù)據(jù)的獲取方法,其中,還包括緩存更新步驟:倉Il建三個事務項:第一事務項、第二事務項和第三事務項;第一事務項由添加操作和緩存失效操作組成,第二事務項由更新操作和緩存失效操作組成,第三事務項由刪除操作和緩存失效操作組成。
[0012]所述的高并發(fā)下Memcache數(shù)據(jù)的獲取方法,其中,各事物項的事務恢復策略如下: 如果添加操作和緩存失效操作都執(zhí)行成功,則提交第一事務項;
如果添加操作成功,緩存失效操作失敗,則刪除添加的數(shù)據(jù);
如果添加操作失敗,則緩存失效操作不執(zhí)行;
如果更新操作和緩存失效操作都執(zhí)行成功,則提交第二事務項;
如果更新操作成功,緩存失效操作失敗,則恢復更新的數(shù)據(jù);
如果更新操作失敗,則緩存失效操作不執(zhí)行;
如果刪除操作和緩存失效操作都執(zhí)行成功,則提交第三事務項;
如果刪除操作成功,緩存失效操作失敗,則恢復刪除的數(shù)據(jù);
如果刪除操作失敗,則緩存失效操作不執(zhí)行。
[0013]一種高并發(fā)下Memcache數(shù)據(jù)的獲取系統(tǒng),其中,包括:
版本號獲取模塊,用于拼裝第一關鍵字,并根據(jù)第一關鍵字獲取版本號;
第一獲取模塊,用于將所述第一關鍵字和版本號組裝第二關鍵字,根據(jù)第二關鍵字從Memcache服務器獲取數(shù)據(jù);
鎖獲取模塊,用于判斷是否獲取到數(shù)據(jù),若未獲取到數(shù)據(jù),則根據(jù)所述第一關鍵字獲取鎖;
第二獲取模塊,用于判斷是否獲取到鎖,若未獲取到鎖,則連續(xù)多次、每次間隔一段時間執(zhí)行第一獲取模塊以獲取數(shù)據(jù),若連續(xù)多次均未獲取到數(shù)據(jù),則將第一關鍵字對應的版本號減I,并根據(jù)第一關鍵字和減I后的版本號獲取上一版版本的數(shù)據(jù)。
[0014]所述的高并發(fā)下Memcache數(shù)據(jù)的獲取系統(tǒng),其中,所述第二獲取模塊還包括:
加載單元,用于若獲取到鎖,則返回第一獲取模塊重新獲取數(shù)據(jù),若獲取到數(shù)據(jù)則釋放鎖,若未獲取到數(shù)據(jù),則從數(shù)據(jù)庫中獲取數(shù)據(jù)并加載到Memcache服務器的緩存中。
[0015]所述的高并發(fā)下Memcache數(shù)據(jù)的獲取系統(tǒng),其中,還包括緩存失效模塊,用于對Memcache服務器下的緩存進行緩存失效操作:
將第一關鍵字對應的版本號加I,完成緩存失效操作。
[0016]所述的高并發(fā)下Memcache數(shù)據(jù)的獲取系統(tǒng),其中,還包括:
緩存更新模塊,用于創(chuàng)建三個事務項:第一事務項、第二事務項和第三事務項;第一事務項由添加操作和緩存失效操作組成,第二事務項由更新操作和緩存失效操作組成,第三事務項由刪除操作和緩存失效操作組成。
[0017]有益效果:通過本發(fā)明,當客戶端獲取不到高版本的數(shù)據(jù)時,根據(jù)情況獲得低版本的數(shù)據(jù),從而避免了獲取不到數(shù)據(jù)轉(zhuǎn)而從數(shù)據(jù)庫中獲取的大量操作,降低了訪問數(shù)據(jù)庫的壓力,避免了大量并發(fā)請求同時訪問數(shù)據(jù)庫的情況會給系統(tǒng)帶來潛在的超負荷風險。
【附圖說明】
[0018]圖1為本發(fā)明一種高并發(fā)下Memcache數(shù)據(jù)的獲取方法較佳實施例的流程圖。
[0019]圖2為本發(fā)明的原理架構框圖。
[0020]圖3為本發(fā)明一種高并發(fā)下Memcache數(shù)據(jù)的獲取系統(tǒng)較佳實施例的結(jié)構框圖。
【具體實施方式】
[0021]本發(fā)明提供一種高并發(fā)下Memcache數(shù)據(jù)的獲取方法及系統(tǒng),為使本發(fā)明的目的、技術方案及效果更加清楚、明確,以下對本發(fā)明進一步詳細說明。應當理解,此處所描述的具體實施例僅僅用以解釋本發(fā)明,并不用于限定本發(fā)明。
[0022]請參閱圖1,圖1為本發(fā)明一種高并發(fā)下Memcache數(shù)據(jù)的獲取方法,其特征在于,包括步驟:
51、拼裝第一關鍵字,并根據(jù)第一關鍵字獲取版本號;
52、將所述第一關鍵字和版本號組裝第二關鍵字,根據(jù)第二關鍵字從Memcache服務器獲取數(shù)據(jù);
53、判斷是否獲取到數(shù)據(jù),若未獲取到數(shù)據(jù),則根據(jù)所述第一關鍵字獲取鎖;
54、判斷是否獲取到鎖,若未獲取到鎖,則連續(xù)多次、每次間隔一段時間執(zhí)行步驟S2以獲取數(shù)據(jù),若連續(xù)多次均未獲取到數(shù)據(jù),則將第一關鍵字對應的版本號減I,并根據(jù)第一關鍵字和減I后的版本號獲取上一版版本的數(shù)據(jù)。
[0023]本發(fā)明中,給Memcache服務器緩存中的數(shù)據(jù)增加了版本的屬性,當客戶端獲取不到高版本的數(shù)據(jù)時,根據(jù)情況獲得低版本的數(shù)據(jù),從而避免了獲取不到數(shù)據(jù)轉(zhuǎn)而從數(shù)據(jù)庫中獲取的大量操作,降低了訪問數(shù)據(jù)庫的壓力。
[0024]本發(fā)明中,所述數(shù)據(jù)采用json格式的字符串進行存儲,當獲取到數(shù)據(jù)時,則將數(shù)據(jù)轉(zhuǎn)換成json對象。其優(yōu)點是數(shù)據(jù)格式一致,解析統(tǒng)一,存取速度快。
[0025]本發(fā)明的整體架構如圖2所示,其包括Memcache服務器、應用服務器與數(shù)據(jù)庫之間的交互,a:應用服務器會對數(shù)據(jù)庫進行添加、更新或刪除數(shù)據(jù)操作,并將數(shù)據(jù)保存到數(shù)據(jù)庫中。b:應用服務器還會對Memcache服務器緩存中的數(shù)據(jù)進行失效。c:客戶端可從Memcache服務器獲取數(shù)據(jù),具體是根據(jù)key(關鍵字,本發(fā)明也稱為第一關鍵字)獲取版本號(vers1n號),組裝新的關鍵字(neW_key,本發(fā)明也稱為第二關鍵字),獲取json格式數(shù)據(jù),若獲取不到則進行加載數(shù)據(jù)操作,d:加載數(shù)據(jù)時,Memcache服務器從數(shù)據(jù)庫中讀取數(shù)據(jù),轉(zhuǎn)換成json字符串,加載到緩存中。
[0026]key的拼裝規(guī)則是將多個屬性值以冒號隔開并別設置,例如key:屬性值1:屬性值2:屬性值3,上述各屬性值的組合需保證唯一性。根據(jù)key獲取版本號的方式是:調(diào)用Memcache服務器的get命令根據(jù)key獲取key的版本號,版本號為正整數(shù)。
[0027]new_key 的組裝規(guī)則為 key: vers1n示例:
key 1:biz_type:mac:1pvers1n 3
new—key = 1:biz_type:mac:1p:3 本發(fā)明中,當多個進程(即客戶端進程)同時訪問不到緩存中的數(shù)據(jù)時,只允許一個進程進行將數(shù)據(jù)庫中的數(shù)據(jù)放到緩存中的操作,從而避免了多個進程同時操作,緩存中的數(shù)據(jù)互相覆蓋。其具體是通過鎖機制來實現(xiàn)的,鎖機制是指根據(jù)key拼裝鎖,鎖key的規(guī)則為key: lock,其中的lock為標識,并且將key添加到緩存中。在某個key獲取到鎖后,將不再允許該key添加到緩存中,也即其他進程無法利用該key執(zhí)行將數(shù)據(jù)庫中的數(shù)據(jù)添加到緩存中的操作,因此執(zhí)行失敗。該鎖具有一定的失效時間,例如失效時間為5ms,即在該失效時間內(nèi),其他進程無法利用該key對數(shù)據(jù)庫進行操作。
[0028]具體來說,在所述步驟S3中,判斷是否獲取到數(shù)據(jù),若未獲取到數(shù)據(jù),則根據(jù)所述第一關鍵字獲取鎖;
如果本步驟獲取到數(shù)據(jù),那么直接將json格式的數(shù)據(jù)映射成java對象即可(下述步驟中,當獲取到數(shù)據(jù)后都將其映射成java對象,不再贅述),如果未獲取到數(shù)據(jù),則獲取鎖,由于所述第一關鍵字可能在之前已經(jīng)獲取到鎖,也有可能沒有獲取到過鎖,所以針對有無獲取到鎖分別進行處理
在所述步驟S4中,判斷是否獲取到鎖,若獲取到鎖,則返回步驟S2重新獲取數(shù)據(jù),若獲取到數(shù)據(jù)則釋放鎖,否則從數(shù)據(jù)庫中獲取數(shù)據(jù)并加載到Memcache服務器的緩存中;
如果獲