一種鍵值緩存的實(shí)現(xiàn)方法及裝置的制造方法【專利摘要】本發(fā)明公開(kāi)了一種鍵值緩存的實(shí)現(xiàn)方法及裝置,包括:獲取鍵值表名以及鍵key,并根據(jù)所述鍵值表名確定與所述鍵值表名對(duì)應(yīng)的鍵值表共享內(nèi)存段;根據(jù)所述key確定位于所述鍵值表共享內(nèi)存段中的內(nèi)存地址,并在確定所述內(nèi)存地址指向的訪問(wèn)目標(biāo)中包括所述key時(shí),確定需要對(duì)所述內(nèi)存地址進(jìn)行操作的業(yè)務(wù)進(jìn)程的進(jìn)程號(hào);通過(guò)CAS原子操作將所述內(nèi)存地址的狀態(tài)標(biāo)識(shí)修改為所述進(jìn)程號(hào);若修改成功,則根據(jù)所述業(yè)務(wù)進(jìn)程對(duì)所述訪問(wèn)目標(biāo)進(jìn)行業(yè)務(wù)處理,若修改失敗,則判斷修改次數(shù)是否達(dá)到閾值,若修改次數(shù)達(dá)到閾值,則確定訪問(wèn)失敗,若修改次數(shù)未達(dá)到閾值,則返回所述通過(guò)CAS原子操作將所述內(nèi)存地址的狀態(tài)標(biāo)識(shí)修改為所述進(jìn)程號(hào)的步驟?!緦@f(shuō)明】一種鍵值緩存的實(shí)現(xiàn)方法及裝置
技術(shù)領(lǐng)域:
[0001]本發(fā)明涉及數(shù)據(jù)庫(kù)
技術(shù)領(lǐng)域:
,尤其涉及一種鍵值緩存的實(shí)現(xiàn)方法及其裝置?!?br>背景技術(shù):
】[0002]數(shù)據(jù)的存儲(chǔ)于訪問(wèn)是計(jì)算機(jī)應(yīng)用中最普遍的需求,特別是在銀行等行業(yè)中,對(duì)數(shù)據(jù)存儲(chǔ)的實(shí)時(shí)性和健壯性要求越來(lái)越高。[0003]現(xiàn)有的技術(shù)中,在對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作時(shí),通常采用悲觀鎖。當(dāng)沖突發(fā)生時(shí),需要等待內(nèi)核的時(shí)間片管理、調(diào)度機(jī)制對(duì)進(jìn)程的選擇、進(jìn)程對(duì)喚醒的響應(yīng)等步驟,這些都比較耗時(shí),在讀寫(xiě)都特別頻繁的業(yè)務(wù)中,沖突處理耗時(shí)特別多,從而降低了訪問(wèn)數(shù)據(jù)庫(kù)的速度?!?br/>發(fā)明內(nèi)容】[0004]本發(fā)明實(shí)施例提供一種鍵值緩存的實(shí)現(xiàn)方法及其裝置,用以提供一種實(shí)現(xiàn)高效并發(fā)訪問(wèn)數(shù)據(jù)庫(kù)的同時(shí),保證對(duì)數(shù)據(jù)讀寫(xiě)的一致性。[0005]本發(fā)明實(shí)施例提供一種鍵值緩存的實(shí)現(xiàn)方法,包括:[0006]獲取鍵值表名以及鍵key,并根據(jù)所述鍵值表名確定與所述鍵值表名對(duì)應(yīng)的鍵值表共享內(nèi)存段;[0007]根據(jù)所述key確定位于所述鍵值表共享內(nèi)存段中的內(nèi)存地址,并在確定所述內(nèi)存地址指向的訪問(wèn)目標(biāo)中包括所述key時(shí),確定需要對(duì)所述內(nèi)存地址進(jìn)行操作的業(yè)務(wù)進(jìn)程的進(jìn)程號(hào);[0008]通過(guò)CAS原子操作將所述內(nèi)存地址的狀態(tài)標(biāo)識(shí)修改為所述進(jìn)程號(hào);[0009]若修改成功,則根據(jù)所述業(yè)務(wù)進(jìn)程對(duì)所述訪問(wèn)目標(biāo)進(jìn)行業(yè)務(wù)處理,若修改失敗,則判斷修改次數(shù)是否達(dá)到閾值,若修改次數(shù)達(dá)到閾值,則確定訪問(wèn)失敗,若修改次數(shù)未達(dá)到閾值,則返回所述通過(guò)CAS原子操作將所述內(nèi)存地址的狀態(tài)標(biāo)識(shí)修改為所述進(jìn)程號(hào)的步驟。[0010]優(yōu)選的,所述根據(jù)所述鍵值表名確定與所述鍵值表名對(duì)應(yīng)的鍵值表共享內(nèi)存段,包括:[0011]通過(guò)第一哈希函數(shù)對(duì)所述鍵值表名進(jìn)行哈希運(yùn)算獲得第一鍵值表哈希值;[0012]通過(guò)第二哈希函數(shù)對(duì)所述鍵值表名進(jìn)行哈希運(yùn)算獲得第二鍵值表哈希值;[0013]將所述第一鍵值表哈希值作為所述鍵值表名對(duì)應(yīng)的鍵值表共享內(nèi)存段的待驗(yàn)證入口地址,并確定所述待驗(yàn)證入口地址指向的數(shù)據(jù)中的第三鍵值表哈希值與所述第二鍵值表哈希值是否相等,若相等則將所述待驗(yàn)證入口地址作為所述鍵值表共享內(nèi)存段的入口地址,并根據(jù)所述鍵值表共享內(nèi)存段的入口地址確定所述鍵值表共享內(nèi)存段。[0014]優(yōu)選的,所述根據(jù)所述key確定位于所述鍵值表共享內(nèi)存中的內(nèi)存地址,包括:[0015]對(duì)所述key進(jìn)行哈希運(yùn)算獲得值value,并將所述value作為所述內(nèi)存地址。[0016]優(yōu)選的,若確定所述內(nèi)存地址指向的訪問(wèn)目標(biāo)中不包括所述key,則執(zhí)行以下步驟:[0017]步驟一、確定所述內(nèi)存地址是否存在下一跳內(nèi)存地址,若存在,則轉(zhuǎn)至步驟二,否則,確定所述鍵值表共享內(nèi)存段中不存在所述key對(duì)應(yīng)的內(nèi)存地址;[0018]步驟二、確定所述下一跳內(nèi)存地址中是否包括所述key,若不包括所述key,則返回步驟一,若包括所述key,則將所述下一跳內(nèi)存地址作為所述key對(duì)應(yīng)的內(nèi)存地址。[0019]優(yōu)選的,所述根據(jù)所述業(yè)務(wù)進(jìn)程對(duì)所述訪問(wèn)目標(biāo)進(jìn)行處理之后,還包括:[0020]確定所述內(nèi)存地址的狀態(tài)標(biāo)識(shí)是否等于所述進(jìn)程號(hào),若是,則通過(guò)所述CAS原子操作將所述內(nèi)存地址的狀態(tài)標(biāo)識(shí)修改為原值,以完成對(duì)所述內(nèi)存地址的解鎖。[0021]本發(fā)明實(shí)施例提供一種鍵值緩存的實(shí)現(xiàn)裝置,包括:[0022]獲取單元,用于獲取鍵值表名以及鍵key,并根據(jù)所述鍵值表名確定與所述鍵值表名對(duì)應(yīng)的鍵值表共享內(nèi)存段;[0023]確定單元,用于根據(jù)所述key確定位于所述鍵值表共享內(nèi)存段中的內(nèi)存地址,并在確定所述內(nèi)存地址指向的訪問(wèn)目標(biāo)中包括所述key時(shí),確定需要對(duì)所述內(nèi)存地址進(jìn)行操作的業(yè)務(wù)進(jìn)程的進(jìn)程號(hào);[0024]加鎖單元,用于通過(guò)CAS原子操作將所述內(nèi)存地址的狀態(tài)標(biāo)識(shí)修改為所述進(jìn)程號(hào);若修改成功,則根據(jù)所述業(yè)務(wù)進(jìn)程對(duì)所述訪問(wèn)目標(biāo)進(jìn)行業(yè)務(wù)處理,若修改失敗,則判斷修改次數(shù)是否達(dá)到閾值,若修改次數(shù)達(dá)到閾值,則確定訪問(wèn)失敗,若修改次數(shù)未達(dá)到閾值,則返回所述通過(guò)CAS原子操作將所述內(nèi)存地址的狀態(tài)標(biāo)識(shí)修改為所述進(jìn)程號(hào)的步驟。[0025]優(yōu)選的,所述獲取單元具體用于:[0026]通過(guò)第一哈希函數(shù)對(duì)所述鍵值表名進(jìn)行哈希運(yùn)算獲得第一鍵值表哈希值;[0027]通過(guò)第二哈希函數(shù)對(duì)所述鍵值表名進(jìn)行哈希運(yùn)算獲得第二鍵值表哈希值;[0028]將所述第一鍵值表哈希值作為所述鍵值表名對(duì)應(yīng)的鍵值表共享內(nèi)存段的待驗(yàn)證入口地址,并確定所述待驗(yàn)證入口地址指向的數(shù)據(jù)中的第三鍵值表哈希值與所述第二鍵值表哈希值是否相等,若相等則將所述待驗(yàn)證入口地址作為所述鍵值表共享內(nèi)存段的入口地址,并根據(jù)所述鍵值表共享內(nèi)存段的入口地址確定所述鍵值表共享內(nèi)存段。[0029]優(yōu)選的,所述確定單元具體用于:[0030]對(duì)所述key進(jìn)行哈希運(yùn)算獲得值value,并將所述value作為所述內(nèi)存地址。[0031]優(yōu)選的,所述確定單元還用于:[0032]若確定所述內(nèi)存地址指向的訪問(wèn)目標(biāo)中不包括所述key,則執(zhí)行以下步驟:[0033]步驟一、確定所述內(nèi)存地址是否存在下一跳內(nèi)存地址,若存在,則轉(zhuǎn)至步驟二,否則,確定所述鍵值表共享內(nèi)存段中不存在所述key對(duì)應(yīng)的內(nèi)存地址;[0034]步驟二、確定所述下一跳內(nèi)存地址中是否包括所述key,若不包括所述key,則返回步驟一,若包括所述key,則將所述下一跳內(nèi)存地址作為所述key對(duì)應(yīng)的內(nèi)存地址。[0035]優(yōu)選的,所述加鎖單元還用于:[0036]確定所述內(nèi)存地址的狀態(tài)標(biāo)識(shí)是否等于所述進(jìn)程號(hào),若是,則通過(guò)所述CAS原子操作將所述內(nèi)存地址的狀態(tài)標(biāo)識(shí)修改為原值,以完成對(duì)所述內(nèi)存地址的解鎖。[0037]本發(fā)明有益效果如下:[0038]本發(fā)明實(shí)施例實(shí)現(xiàn)了將鍵值數(shù)據(jù)存放在共享內(nèi)存中,作為靜態(tài)庫(kù)提供給其他業(yè)務(wù)進(jìn)程使用,使得共享內(nèi)存中的鍵值數(shù)據(jù)的生命周期不依賴進(jìn)程的生命周期,提供系統(tǒng)的效率。同時(shí),本發(fā)明實(shí)施例中,互斥操作采用CAS原子操作實(shí)現(xiàn),有效的解決了并發(fā)沖突的問(wèn)題。【附圖說(shuō)明】[0039]為了更清楚地說(shuō)明本發(fā)明實(shí)施例中的技術(shù)方案,下面將對(duì)實(shí)施例描述中所需要使用的附圖作簡(jiǎn)要介紹,顯而易見(jiàn)地,下面描述中的附圖僅僅是本發(fā)明的一些實(shí)施例,對(duì)于本領(lǐng)域的普通技術(shù)人員來(lái)講,在不付出創(chuàng)造性勞動(dòng)性的前提下,還可以根據(jù)這些附圖獲得其他的附圖。[0040]圖1為本發(fā)明實(shí)施例提供的一種鍵值緩存的實(shí)現(xiàn)方法流程示意圖;[0041]圖2為本發(fā)明實(shí)施例提供的一種表控制結(jié)構(gòu)的結(jié)構(gòu)示意圖;[0042]圖3為本發(fā)明實(shí)施例提供的一種內(nèi)存池的結(jié)構(gòu)示意圖;[0043]圖4為本發(fā)明實(shí)施例提供的一種內(nèi)存池的結(jié)構(gòu)示意圖;[0044]圖5為本發(fā)明實(shí)施例提供的一種鍵值緩存的實(shí)現(xiàn)裝置結(jié)構(gòu)示意圖?!揪唧w實(shí)施方式】[0045]為了使本發(fā)明的目的、技術(shù)方案和優(yōu)點(diǎn)更加清楚,下面將結(jié)合附圖對(duì)本發(fā)明作進(jìn)一步地詳細(xì)描述,顯然,所描述的實(shí)施例僅僅是本發(fā)明一部份實(shí)施例,而不是全部的實(shí)施例?;诒景l(fā)明中的實(shí)施例,本領(lǐng)域普通技術(shù)人員在沒(méi)有做出創(chuàng)造性勞動(dòng)前提下所獲得的所有其它實(shí)施例,都屬于本發(fā)明保護(hù)的范圍。[0046]本發(fā)明實(shí)施例中,通過(guò)鍵值(Key-Value)數(shù)據(jù)庫(kù)存儲(chǔ)數(shù)據(jù)。鍵值數(shù)據(jù)庫(kù)中,每個(gè)key對(duì)應(yīng)一個(gè)value,value可以作為內(nèi)存地址,可以指向key對(duì)應(yīng)的訪問(wèn)目標(biāo),從而可以實(shí)現(xiàn)快速訪問(wèn)數(shù)據(jù)。[0047]本發(fā)明實(shí)施例中,key是所述key對(duì)應(yīng)的訪問(wèn)目標(biāo)中的一部分。舉例來(lái)說(shuō),訪問(wèn)目標(biāo)為由手機(jī)號(hào)、銀行卡號(hào)、地址、郵編組成的一段數(shù)據(jù),那么訪問(wèn)目標(biāo)中的手機(jī)號(hào)、銀行卡號(hào)、地址、郵編均可以作為key,可以將該訪問(wèn)目標(biāo)存儲(chǔ)于經(jīng)過(guò)key哈希運(yùn)算后獲得的value的值指向的內(nèi)存中。[0048]本發(fā)明實(shí)施例中,在訪問(wèn)鍵值數(shù)據(jù)庫(kù)之前,先在配置文件中規(guī)劃鍵值數(shù)據(jù)庫(kù)使用共享內(nèi)存的起始key值和大小。隨后,管理進(jìn)程根據(jù)確定需要使用的共享內(nèi)存的大小向操作系統(tǒng)申請(qǐng)相應(yīng)大小的共享內(nèi)存段,作為鍵值數(shù)據(jù)庫(kù)實(shí)例共享內(nèi)存段,此鍵值數(shù)據(jù)庫(kù)實(shí)例共享內(nèi)存段存儲(chǔ)全局控制信息、鍵值表的名稱和鍵值數(shù)據(jù)庫(kù)中的key信息。[0049]管理進(jìn)程可以根據(jù)業(yè)務(wù)需要?jiǎng)?chuàng)建鍵值表共享內(nèi)存段,鍵值表共享內(nèi)存段中存儲(chǔ)鍵值表控制信息,包括哈希索引,數(shù)據(jù)區(qū)共享內(nèi)存中key的范圍。[0050]業(yè)務(wù)進(jìn)程根據(jù)配置文件掛載鍵值數(shù)據(jù)庫(kù)實(shí)例的共享內(nèi)存段,根據(jù)鍵值數(shù)據(jù)庫(kù)實(shí)例共享內(nèi)存段中存儲(chǔ)全局控制信息掛載所有鍵值表對(duì)應(yīng)的鍵值表共享內(nèi)存,根據(jù)各鍵值表共享內(nèi)存中存儲(chǔ)的鍵值表控制信息掛載所有鍵值表的數(shù)據(jù)共享內(nèi)存段。[0051]基于上述描述,如圖1所述,為本發(fā)明實(shí)施例提供的一種鍵值緩存的實(shí)現(xiàn)方法流程示意圖。[°°52]參見(jiàn)圖1,該方法包括:[0053]步驟101:獲取鍵值表名以及鍵key,并根據(jù)所述鍵值表名確定與所述鍵值表名對(duì)應(yīng)的鍵值表共享內(nèi)存段;[0054]步驟102:根據(jù)所述key確定位于所述鍵值表共享內(nèi)存段中的內(nèi)存地址,并在確定所述內(nèi)存地址指向的訪問(wèn)目標(biāo)中包括所述key時(shí),確定需要對(duì)所述內(nèi)存地址進(jìn)行操作的業(yè)務(wù)進(jìn)程的進(jìn)程號(hào);[0055]步驟103:通過(guò)CAS原子操作將所述內(nèi)存地址的狀態(tài)標(biāo)識(shí)修改為所述進(jìn)程號(hào);若修改成功,則根據(jù)所述業(yè)務(wù)進(jìn)程對(duì)所述訪問(wèn)目標(biāo)進(jìn)行處理,若修改失敗,則判斷修改次數(shù)是否達(dá)到閾值,若修改次數(shù)達(dá)到閾值,則確定訪問(wèn)失敗,若修改次數(shù)未達(dá)到閾值,則返回所述通過(guò)CAS原子操作將所述內(nèi)存地址的狀態(tài)標(biāo)識(shí)修改為所述進(jìn)程號(hào)的步驟。[0056]步驟101中,鍵值數(shù)據(jù)庫(kù)實(shí)例共享內(nèi)存段中可能存在多個(gè)鍵值表共享內(nèi)存段,本發(fā)明實(shí)施例中通過(guò)對(duì)鍵值表名進(jìn)行哈希運(yùn)算,獲得與鍵值表名對(duì)應(yīng)的鍵值表哈希值,從而確定出與所述鍵值表名對(duì)應(yīng)的鍵值表共享內(nèi)存段。[0057]為了避免哈希沖突,本發(fā)明實(shí)施例中通過(guò)對(duì)一個(gè)鍵值表名進(jìn)行多次哈希運(yùn)算,獲得多個(gè)哈希值,并根據(jù)獲得的哈希值進(jìn)行驗(yàn)證,從而避免哈希沖突。[0058]具體的,通過(guò)第一哈希函數(shù)對(duì)所述鍵值表名進(jìn)行哈希運(yùn)算獲得第一鍵值表哈希值;通過(guò)第二哈希函數(shù)對(duì)所述鍵值表名進(jìn)行哈希運(yùn)算獲得第二鍵值表哈希值;將所述第一鍵值表哈希值作為所述鍵值表名對(duì)應(yīng)的鍵值表共享內(nèi)存段的待驗(yàn)證入口地址,并確定所述待驗(yàn)證入口地址指向的數(shù)據(jù)中的第三鍵值表哈希值與所述第二鍵值表哈希值是否相等,若相等則將所述待驗(yàn)證入口地址作為所述鍵值表共享內(nèi)存段的入口地址。若確定所述待驗(yàn)證入口地址指向的數(shù)據(jù)中的第三鍵值表哈希值與所述第二鍵值表哈希值不相等,則執(zhí)行下述步驟:步驟一、確定所述待驗(yàn)證入口地址是否存在下一跳內(nèi)存地址,若存在,則將所述待驗(yàn)證入口地址的值加I,獲得下一跳待驗(yàn)證入口地址,否則,確定不存在與所述鍵值表名對(duì)應(yīng)的鍵值表共享內(nèi)存段;步驟二、確定所述下一跳待驗(yàn)證入口地址指向的數(shù)據(jù)中的第四鍵值表哈希值與所述第二鍵值表哈希值是否相等,若相等,則將所述下一跳待驗(yàn)證入口地址作為所述鍵值表共享內(nèi)存段的入口地址,否則,返回步驟一。[0059]最后根據(jù)鍵值表共享內(nèi)存段的入口地址可以確定所述鍵值表共享內(nèi)存段。本發(fā)明實(shí)施例中,鍵值表共享內(nèi)存段的入口地址可以指向存儲(chǔ)該鍵值表名的表控制結(jié)構(gòu)。表控制結(jié)構(gòu)中除了鍵值表名之外,還可能包括hash信息,如hash的最大個(gè)數(shù),當(dāng)前使用的hash個(gè)數(shù),hash的起始地址偏移等信息;pool(內(nèi)存池)信息,如pool的最大個(gè)數(shù),當(dāng)前使用pool的個(gè)數(shù),pooI的起始地址偏移等信息;hashmap(哈希圖)信息,hashmap中可以包括由鍵值表名中的key計(jì)算出的value,以及value對(duì)應(yīng)的狀態(tài)標(biāo)識(shí),value對(duì)應(yīng)的狀態(tài)標(biāo)識(shí)為默認(rèn)值時(shí),表示該value對(duì)應(yīng)的地址指向的數(shù)據(jù)處于解鎖狀態(tài)。[0060]具體的,如圖2所示,為本發(fā)明實(shí)施例提供的一種表控制結(jié)構(gòu)的結(jié)構(gòu)示意圖。圖2中,表控制結(jié)構(gòu)中可以包括鍵值表名(Table_name),為對(duì)鍵值表操作的定位參數(shù);鍵值表信息(table_info),可以包括鍵值表的起始偏移地址等信息;鍵值表狀態(tài)(table_status);鍵值表狀統(tǒng)計(jì)信息(table_statics);內(nèi)存池信息(Pool_info),其中可以包括pool的最大個(gè)數(shù),當(dāng)前使用的pool的個(gè)數(shù),pool的起始地址偏移等;還可以包括每個(gè)內(nèi)存池的內(nèi)存池鏈表頭(pool_list),并通過(guò)pool_list對(duì)應(yīng)的頭指針(head)指向內(nèi)存池的池頭(pool_head)。同時(shí),表控制結(jié)構(gòu)中還可以包括哈希信息(Hash_info),其中可以包括hash最大個(gè)數(shù),當(dāng)前使用的個(gè)數(shù),hash起始地址偏移等信息,Hash_infο中可以通過(guò)hashjist的對(duì)應(yīng)的頭指針(head)指向內(nèi)存池中一個(gè)記錄(page_data)的page_next,從而指示出一個(gè)page_data位于內(nèi)存池中的位置。[0061]如圖3所示,為本發(fā)明實(shí)施例提供的一種內(nèi)存池的結(jié)構(gòu)示意圖。圖3中,內(nèi)存池包括一個(gè)池頭(pool_head)以及多個(gè)記錄(page_data),每個(gè)page_data包括兩個(gè)指針:rec_next和page_next。存儲(chǔ)在內(nèi)存池中的一個(gè)內(nèi)存池?cái)?shù)據(jù)可以包括多個(gè)page_data,因此,可以用rec_next指向內(nèi)存池中下一個(gè)內(nèi)存池?cái)?shù)據(jù)所包括的第一個(gè)page_data,用page_next指向與該記錄屬于同一個(gè)內(nèi)存池?cái)?shù)據(jù)的下一個(gè)記錄。[0062]舉例來(lái)說(shuō),結(jié)合圖2及圖3,如圖4所示,為本發(fā)明實(shí)施例提供的一種內(nèi)存池的結(jié)構(gòu)示意圖。圖4中,內(nèi)存池中包括12個(gè)page_data,內(nèi)存池?cái)?shù)據(jù)Rl包括兩個(gè)page_data,分別為第I個(gè)page_data和第4個(gè)page_data;內(nèi)存池?cái)?shù)據(jù)R2包括兩個(gè)page_data,分別為第5個(gè)page_data和第8個(gè)page_data。通過(guò)表控制結(jié)構(gòu)中pool_list對(duì)應(yīng)的頭指針(head)可以確定內(nèi)存池的pool_head,然后通過(guò)指向第I個(gè)page_data的hash_list的對(duì)應(yīng)的head指示出組成Rl的第I個(gè)page_data,然后根據(jù)第I個(gè)page_data的page_next指示出組成Rl的第2個(gè)page_data,即內(nèi)存池中第4個(gè)page_data。還可以根據(jù)組成Rl的第I個(gè)page_data(即內(nèi)存池中第I個(gè)page_data)的rec_next指示出組成R2的第I個(gè)page_data(即內(nèi)存池中第5個(gè)page_data),然后根據(jù)組成R2的第I個(gè)page_data(即內(nèi)存池中第5個(gè)page_data)的page_next指示出組成R2的第2個(gè)page_data,即內(nèi)存池中第8個(gè)page_data。[0063]—張鍵值表中可以只存儲(chǔ)一種類型的key-value值,S卩key和value都是固定長(zhǎng)度的。[0064]進(jìn)一步的,還可以通過(guò)鍵值表名進(jìn)行三次哈希運(yùn)算,獲得三個(gè)鍵值表哈希值,從而進(jìn)一步減少哈希沖突。具體過(guò)程,可以參考上面的描述,在此不再贅述。[0065]步驟102中,在確定出的鍵值表共享內(nèi)存段中,確定與所述key對(duì)應(yīng)的訪問(wèn)目標(biāo)對(duì)應(yīng)的內(nèi)存地址。[0066]可以直接對(duì)所述key進(jìn)行哈希運(yùn)算獲得值value,并將所述value作為所述內(nèi)存地址。由于在本發(fā)明實(shí)施例中,key是所述key對(duì)應(yīng)的訪問(wèn)目標(biāo)中的一部分,如果所述內(nèi)存地址指向的訪問(wèn)目標(biāo)中包括所述key,則可以確定已經(jīng)找到正確的訪問(wèn)目標(biāo)。[0067]若確定所述內(nèi)存地址指向的訪問(wèn)目標(biāo)中不包括所述key,則說(shuō)明存在多個(gè)不同的key通過(guò)哈希運(yùn)算獲得相同的value,使得key對(duì)應(yīng)的內(nèi)存地址發(fā)生沖突,導(dǎo)致所述key對(duì)應(yīng)的訪問(wèn)目標(biāo)并沒(méi)有存儲(chǔ)在所述key對(duì)應(yīng)的value指向的內(nèi)存中。[0068]本發(fā)明實(shí)施例中,在進(jìn)行數(shù)據(jù)存儲(chǔ)時(shí),若發(fā)現(xiàn)根據(jù)key進(jìn)行哈希運(yùn)算確定出的內(nèi)存地址被使用,則確定該key進(jìn)行哈希運(yùn)算出的內(nèi)存地址的下一跳內(nèi)存地址是否被使用,如果未被使用,則將該key對(duì)應(yīng)的訪問(wèn)目的存儲(chǔ)在該下一跳內(nèi)存地址所指向的內(nèi)存中,否則,繼續(xù)循環(huán)該過(guò)程,直至找到一個(gè)未被使用的內(nèi)存地址。[0069]根據(jù)上面的描述,本發(fā)明實(shí)施例中,若確定所述內(nèi)存地址指向的訪問(wèn)目標(biāo)中不包括所述key,則可以執(zhí)行以下步驟:[0070]步驟一、確定所述內(nèi)存地址是否存在下一跳內(nèi)存地址,若存在,則轉(zhuǎn)至步驟二,否則,確定所述鍵值表共享內(nèi)存段中不存在所述key對(duì)應(yīng)的內(nèi)存地址;[0071]步驟二、確定所述下一跳內(nèi)存地址中是否包括所述key,若不包括所述key,則返回步驟一,若包括所述key,則將所述下一跳內(nèi)存地址作為所述key對(duì)應(yīng)的內(nèi)存地址。[0072]步驟103中,為了避免多個(gè)線程并發(fā)時(shí)對(duì)同一個(gè)訪問(wèn)目標(biāo)進(jìn)行操作,而發(fā)生沖突,從而使得其他進(jìn)程需要等待內(nèi)核的時(shí)間片管理、調(diào)度機(jī)制對(duì)進(jìn)程的選擇、進(jìn)程對(duì)喚醒的響應(yīng)等步驟,導(dǎo)致沖突處理耗時(shí)時(shí)間較長(zhǎng),使得系統(tǒng)性能無(wú)法滿足要求,本發(fā)明實(shí)施例中,采用CAS(Compare&Set,比較&設(shè)置)原子操作解決沖突。[0073]采用CAS原子操作時(shí),當(dāng)多個(gè)進(jìn)程嘗試更新同一個(gè)訪問(wèn)目標(biāo)時(shí),只有其中一個(gè)進(jìn)程能更新訪問(wèn)目標(biāo),而其它進(jìn)程都失敗,失敗的進(jìn)程并不會(huì)被掛起,而是被告知這次競(jìng)爭(zhēng)中失敗,并可以再次嘗試,從而提高了系統(tǒng)的性能。[0074]通過(guò)CAS原子操作將所述內(nèi)存地址的狀態(tài)標(biāo)識(shí)修改為所述進(jìn)程號(hào);若修改成功,則根據(jù)所述業(yè)務(wù)進(jìn)程對(duì)所述訪問(wèn)目標(biāo)進(jìn)行處理,若修改失敗,則判斷修改次數(shù)是否達(dá)到閾值,若修改次數(shù)達(dá)到閾值,則確定訪問(wèn)失敗,若修改次數(shù)未達(dá)到閾值,則返回所述通過(guò)CAS原子操作將所述內(nèi)存地址的狀態(tài)標(biāo)識(shí)修改為所述進(jìn)程號(hào)的步驟。[0075]本發(fā)明實(shí)施例中,所述閾值可以為5次,也可以根據(jù)實(shí)際情況設(shè)置,在此不再贅述。[0076]根據(jù)所述業(yè)務(wù)進(jìn)程對(duì)所述訪問(wèn)目標(biāo)進(jìn)行處理可以包括多種操作,例如,可以對(duì)訪問(wèn)目標(biāo)進(jìn)行查詢、刪除、增加、更改等操作。[0077]舉例來(lái)說(shuō),根據(jù)所述業(yè)務(wù)進(jìn)程對(duì)所述訪問(wèn)目標(biāo)進(jìn)行查詢操作,此時(shí),在根據(jù)所述key確定出訪問(wèn)目標(biāo)之后,將訪問(wèn)目標(biāo)復(fù)制,并傳遞至查詢界面,從而完成查詢操作。[0078]舉例來(lái)說(shuō),根據(jù)所述業(yè)務(wù)進(jìn)程對(duì)所述訪問(wèn)目標(biāo)進(jìn)行更改操作,則在根據(jù)所述key確定出訪問(wèn)目標(biāo)之后,按照需求對(duì)訪問(wèn)目標(biāo)進(jìn)行更改,從而完成更改操作。[0079]根據(jù)所述業(yè)務(wù)進(jìn)程對(duì)所述訪問(wèn)目標(biāo)進(jìn)行處理之后,還需要對(duì)內(nèi)存地址進(jìn)行解鎖,使得其他業(yè)務(wù)進(jìn)程能夠訪問(wèn)所述訪問(wèn)目標(biāo)。[0080]解鎖過(guò)程中,先確定所述內(nèi)存地址的狀態(tài)標(biāo)識(shí)是否等于所述進(jìn)程號(hào),若是,則通過(guò)所述CAS原子操作將所述內(nèi)存地址的狀態(tài)標(biāo)識(shí)修改為原值,以完成對(duì)所述內(nèi)存地址的解鎖。若確定所述內(nèi)存地址的狀態(tài)標(biāo)識(shí)不等于所述進(jìn)程號(hào),則確定解鎖失敗。[0081]基于相同的技術(shù)構(gòu)思,本發(fā)明實(shí)施例還提供一種鍵值緩存的實(shí)現(xiàn)裝置,該裝置可執(zhí)行上述方法實(shí)施例。[0082]如圖5所示,本發(fā)明實(shí)施例提供一種鍵值緩存的實(shí)現(xiàn)裝置結(jié)構(gòu)示意圖,包括:[0083]獲取單元201,用于獲取鍵值表名以及鍵key,并根據(jù)所述鍵值表名確定與所述鍵值表名對(duì)應(yīng)的鍵值表共享內(nèi)存段;[0084]確定單元202,用于根據(jù)所述key確定位于所述鍵值表共享內(nèi)存段中的內(nèi)存地址,并在確定所述內(nèi)存地址指向的訪問(wèn)目標(biāo)中包括所述key時(shí),確定需要對(duì)所述內(nèi)存地址進(jìn)行操作的業(yè)務(wù)進(jìn)程的進(jìn)程號(hào);[0085]加鎖單元203,用于通過(guò)CAS原子操作將所述內(nèi)存地址的狀態(tài)標(biāo)識(shí)修改為所述進(jìn)程號(hào);若修改成功,則根據(jù)所述業(yè)務(wù)進(jìn)程對(duì)所述訪問(wèn)目標(biāo)進(jìn)行業(yè)務(wù)處理,若修改失敗,則判斷修改次數(shù)是否達(dá)到閾值,若修改次數(shù)達(dá)到閾值,則確定訪問(wèn)失敗,若修改次數(shù)未達(dá)到閾值,則返回所述通過(guò)CAS原子操作將所述內(nèi)存地址的狀態(tài)標(biāo)識(shí)修改為所述進(jìn)程號(hào)的步驟。[0086]優(yōu)選的,所述獲取單元201具體用于:[0087]通過(guò)第一哈希函數(shù)對(duì)所述鍵值表名進(jìn)行哈希運(yùn)算獲得第一鍵值表哈希值;[0088]通過(guò)第二哈希函數(shù)對(duì)所述鍵值表名進(jìn)行哈希運(yùn)算獲得第二鍵值表哈希值;[0089]將所述第一鍵值表哈希值作為所述鍵值表名對(duì)應(yīng)的鍵值表共享內(nèi)存段的待驗(yàn)證入口地址,并確定所述待驗(yàn)證入口地址指向的數(shù)據(jù)中的第三鍵值表哈希值與所述第二鍵值表哈希值是否相等,若相等則將所述待驗(yàn)證入口地址作為所述鍵值表共享內(nèi)存段的入口地址,并根據(jù)所述鍵值表共享內(nèi)存段的入口地址確定所述鍵值表共享內(nèi)存段。[0090]優(yōu)選的,所述確定單元202具體用于:[0091]對(duì)所述key進(jìn)行哈希運(yùn)算獲得值value,并將所述value作為所述內(nèi)存地址。[0092]優(yōu)選的,所述確定單元202還用于:[0093]若確定所述內(nèi)存地址指向的訪問(wèn)目標(biāo)中不包括所述key,則執(zhí)行以下步驟:[0094]步驟一、確定所述內(nèi)存地址是否存在下一跳內(nèi)存地址,若存在,則轉(zhuǎn)至步驟二,否則,確定所述鍵值表共享內(nèi)存段中不存在所述key對(duì)應(yīng)的內(nèi)存地址;[0095]步驟二、確定所述下一跳內(nèi)存地址中是否包括所述key,若不包括所述key,則返回步驟一,若包括所述key,則將所述下一跳內(nèi)存地址作為所述key對(duì)應(yīng)的內(nèi)存地址。[0096]優(yōu)選的,所述加鎖單元203還用于:[0097]確定所述內(nèi)存地址的狀態(tài)標(biāo)識(shí)是否等于所述進(jìn)程號(hào),若是,則通過(guò)所述CAS原子操作將所述內(nèi)存地址的狀態(tài)標(biāo)識(shí)修改為原值,以完成對(duì)所述內(nèi)存地址的解鎖。[0098]本發(fā)明是參照根據(jù)本發(fā)明實(shí)施例的方法、設(shè)備(系統(tǒng))、和計(jì)算機(jī)程序產(chǎn)品的流程圖和/或方框圖來(lái)描述的。應(yīng)理解可由計(jì)算機(jī)程序指令實(shí)現(xiàn)流程圖和/或方框圖中的每一流程和/或方框、以及流程圖和/或方框圖中的流程和/或方框的結(jié)合??商峁┻@些計(jì)算機(jī)程序指令到通用計(jì)算機(jī)、專用計(jì)算機(jī)、嵌入式處理機(jī)或其他可編程數(shù)據(jù)處理設(shè)備的處理器以產(chǎn)生一個(gè)機(jī)器,使得通過(guò)計(jì)算機(jī)或其他可編程數(shù)據(jù)處理設(shè)備的處理器執(zhí)行的指令產(chǎn)生用于實(shí)現(xiàn)在流程圖一個(gè)流程或多個(gè)流程和/或方框圖一個(gè)方框或多個(gè)方框中指定的功能的裝置。[0099]這些計(jì)算機(jī)程序指令也可存儲(chǔ)在能引導(dǎo)計(jì)算機(jī)或其他可編程數(shù)據(jù)處理設(shè)備以特定方式工作的計(jì)算機(jī)可讀存儲(chǔ)器中,使得存儲(chǔ)在該計(jì)算機(jī)可讀存儲(chǔ)器中的指令產(chǎn)生包括指令裝置的制造品,該指令裝置實(shí)現(xiàn)在流程圖一個(gè)流程或多個(gè)流程和/或方框圖一個(gè)方框或多個(gè)方框中指定的功能。[0100]這些計(jì)算機(jī)程序指令也可裝載到計(jì)算機(jī)或其他可編程數(shù)據(jù)處理設(shè)備上,使得在計(jì)算機(jī)或其他可編程設(shè)備上執(zhí)行一系列操作步驟以產(chǎn)生計(jì)算機(jī)實(shí)現(xiàn)的處理,從而在計(jì)算機(jī)或其他可編程設(shè)備上執(zhí)行的指令提供用于實(shí)現(xiàn)在流程圖一個(gè)流程或多個(gè)流程和/或方框圖一個(gè)方框或多個(gè)方框中指定的功能的步驟。[0101]盡管已描述了本發(fā)明的優(yōu)選實(shí)施例,但本領(lǐng)域內(nèi)的技術(shù)人員一旦得知了基本創(chuàng)造性概念,則可對(duì)這些實(shí)施例作出另外的變更和修改。所以,所附權(quán)利要求意欲解釋為包括優(yōu)選實(shí)施例以及落入本發(fā)明范圍的所有變更和修改。[0102]顯然,本領(lǐng)域的技術(shù)人員可以對(duì)本發(fā)明進(jìn)行各種改動(dòng)和變型而不脫離本發(fā)明的范圍。這樣,倘若本發(fā)明的這些修改和變型屬于本發(fā)明權(quán)利要求的范圍之內(nèi),則本發(fā)明也意圖包含這些改動(dòng)和變型在內(nèi)?!局鳈?quán)項(xiàng)】1.一種鍵值緩存的實(shí)現(xiàn)方法,其特征在于,該方法包括:獲取鍵值表名以及鍵key,并根據(jù)所述鍵值表名確定與所述鍵值表名對(duì)應(yīng)的鍵值表共享內(nèi)存段;根據(jù)所述key確定位于所述鍵值表共享內(nèi)存段中的內(nèi)存地址,并在確定所述內(nèi)存地址指向的訪問(wèn)目標(biāo)中包括所述key時(shí),確定需要對(duì)所述內(nèi)存地址進(jìn)行操作的業(yè)務(wù)進(jìn)程的進(jìn)程號(hào);通過(guò)CAS原子操作將所述內(nèi)存地址的狀態(tài)標(biāo)識(shí)修改為所述進(jìn)程號(hào);若修改成功,則根據(jù)所述業(yè)務(wù)進(jìn)程對(duì)所述訪問(wèn)目標(biāo)進(jìn)行業(yè)務(wù)處理,若修改失敗,則判斷修改次數(shù)是否達(dá)到閾值,若修改次數(shù)達(dá)到閾值,則確定訪問(wèn)失敗,若修改次數(shù)未達(dá)到閾值,則返回所述通過(guò)CAS原子操作將所述內(nèi)存地址的狀態(tài)標(biāo)識(shí)修改為所述進(jìn)程號(hào)的步驟。2.如權(quán)利要求1所述的方法,其特征在于,所述根據(jù)所述鍵值表名確定與所述鍵值表名對(duì)應(yīng)的鍵值表共享內(nèi)存段,包括:通過(guò)第一哈希函數(shù)對(duì)所述鍵值表名進(jìn)行哈希運(yùn)算獲得第一鍵值表哈希值;通過(guò)第二哈希函數(shù)對(duì)所述鍵值表名進(jìn)行哈希運(yùn)算獲得第二鍵值表哈希值;將所述第一鍵值表哈希值作為所述鍵值表名對(duì)應(yīng)的鍵值表共享內(nèi)存段的待驗(yàn)證入口地址,并確定所述待驗(yàn)證入口地址指向的數(shù)據(jù)中的第三鍵值表哈希值與所述第二鍵值表哈希值是否相等,若相等則將所述待驗(yàn)證入口地址作為所述鍵值表共享內(nèi)存段的入口地址,并根據(jù)所述鍵值表共享內(nèi)存段的入口地址確定所述鍵值表共享內(nèi)存段。3.如權(quán)利要求1所述的方法,其特征在于,所述根據(jù)所述key確定位于所述鍵值表共享內(nèi)存段中的內(nèi)存地址,包括:對(duì)所述key進(jìn)行哈希運(yùn)算獲得值value,并將所述value作為所述內(nèi)存地址。4.如權(quán)利要求1所述的方法,其特征在于,若確定所述內(nèi)存地址指向的訪問(wèn)目標(biāo)中不包括所述key,則執(zhí)行以下步驟:步驟一、確定所述內(nèi)存地址是否存在下一跳內(nèi)存地址,若存在,則轉(zhuǎn)至步驟二,否則,確定所述鍵值表共享內(nèi)存段中不存在所述key對(duì)應(yīng)的內(nèi)存地址;步驟二、確定所述下一跳內(nèi)存地址中是否包括所述key,若不包括所述key,則返回步驟一,若包括所述key,則將所述下一跳內(nèi)存地址作為所述key對(duì)應(yīng)的內(nèi)存地址。5.如權(quán)利要求1所述的方法,其特征在于,所述根據(jù)所述業(yè)務(wù)進(jìn)程對(duì)所述訪問(wèn)目標(biāo)進(jìn)行處理之后,還包括:確定所述內(nèi)存地址的狀態(tài)標(biāo)識(shí)是否等于所述進(jìn)程號(hào),若是,則通過(guò)所述CAS原子操作將所述內(nèi)存地址的狀態(tài)標(biāo)識(shí)修改為原值,以完成對(duì)所述內(nèi)存地址的解鎖。6.一種鍵值緩存的實(shí)現(xiàn)裝置,其特征在于,該裝置包括:獲取單元,用于獲取鍵值表名以及鍵key,并根據(jù)所述鍵值表名確定與所述鍵值表名對(duì)應(yīng)的鍵值表共享內(nèi)存段;確定單元,用于根據(jù)所述key確定位于所述鍵值表共享內(nèi)存段中的內(nèi)存地址,并在確定所述內(nèi)存地址指向的訪問(wèn)目標(biāo)中包括所述key時(shí),確定需要對(duì)所述內(nèi)存地址進(jìn)行操作的業(yè)務(wù)進(jìn)程的進(jìn)程號(hào);加鎖單元,用于通過(guò)CAS原子操作將所述內(nèi)存地址的狀態(tài)標(biāo)識(shí)修改為所述進(jìn)程號(hào);若修改成功,則根據(jù)所述業(yè)務(wù)進(jìn)程對(duì)所述訪問(wèn)目標(biāo)進(jìn)行業(yè)務(wù)處理,若修改失敗,則判斷修改次數(shù)是否達(dá)到閾值,若修改次數(shù)達(dá)到閾值,則確定訪問(wèn)失敗,若修改次數(shù)未達(dá)到閾值,則返回所述通過(guò)CAS原子操作將所述內(nèi)存地址的狀態(tài)標(biāo)識(shí)修改為所述進(jìn)程號(hào)的步驟。7.如權(quán)利要求6所述的裝置,其特征在于,所述確定單元具體用于:通過(guò)第一哈希函數(shù)對(duì)所述鍵值表名進(jìn)行哈希運(yùn)算獲得第一鍵值表哈希值;通過(guò)第二哈希函數(shù)對(duì)所述鍵值表名進(jìn)行哈希運(yùn)算獲得第二鍵值表哈希值;將所述第一鍵值表哈希值作為所述鍵值表名對(duì)應(yīng)的鍵值表共享內(nèi)存段的待驗(yàn)證入口地址,并確定所述待驗(yàn)證入口地址指向的數(shù)據(jù)中的第三鍵值表哈希值與所述第二鍵值表哈希值是否相等,若相等則將所述待驗(yàn)證入口地址作為所述鍵值表共享內(nèi)存段的入口地址,并根據(jù)所述鍵值表共享內(nèi)存段的入口地址確定所述鍵值表共享內(nèi)存段。8.如權(quán)利要求6所述的裝置,其特征在于,所述確定單元具體用于:對(duì)所述key進(jìn)行哈希運(yùn)算獲得值value,并將所述value作為所述內(nèi)存地址。9.如權(quán)利要求6所述的裝置,其特征在于,所述確定單元還用于:若確定所述內(nèi)存地址指向的訪問(wèn)目標(biāo)中不包括所述key,則執(zhí)行以下步驟:步驟一、確定所述內(nèi)存地址是否存在下一跳內(nèi)存地址,若存在,則轉(zhuǎn)至步驟二,否則,確定所述鍵值表共享內(nèi)存段中不存在所述key對(duì)應(yīng)的內(nèi)存地址;步驟二、確定所述下一跳內(nèi)存地址中是否包括所述key,若不包括所述key,則返回步驟一,若包括所述key,則將所述下一跳內(nèi)存地址作為所述key對(duì)應(yīng)的內(nèi)存地址。10.如權(quán)利要求6所述的裝置,其特征在于,所述加鎖單元還用于:確定所述內(nèi)存地址的狀態(tài)標(biāo)識(shí)是否等于所述進(jìn)程號(hào),若是,則通過(guò)所述CAS原子操作將所述內(nèi)存地址的狀態(tài)標(biāo)識(shí)修改為原值,以完成對(duì)所述內(nèi)存地址的解鎖?!疚臋n編號(hào)】G06F17/30GK105955971SQ201510861869【公開(kāi)日】2016年9月21日【申請(qǐng)日】2015年11月30日【發(fā)明人】魏天華,周斌,祝軍偉【申請(qǐng)人】中國(guó)銀聯(lián)股份有限公司