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