一種Redis通用中間件的實(shí)現(xiàn)方法及裝置的制造方法
【專利摘要】本發(fā)明公開一種Redis通用中間件的實(shí)現(xiàn)方法及裝置,該方法包括:中間件接收應(yīng)用發(fā)送的讀寫請求;所述中間件從與所述中間件連接的處理實(shí)體中確定所述讀寫請求對應(yīng)的處理實(shí)體;所述中間件從所述讀寫請求對應(yīng)的處理實(shí)體的連接池中獲取可用的連接鏈路,并通過所述連接鏈路發(fā)送所述讀寫請求,用以解決現(xiàn)有技術(shù)訪問Redis數(shù)據(jù)庫的技術(shù)不通用的問題。
【專利說明】
一種Red i s通用中間件的實(shí)現(xiàn)方法及裝置
技術(shù)領(lǐng)域
[0001]本發(fā)明涉及通信技術(shù)領(lǐng)域,尤其涉及一種Redis通用中間件的實(shí)現(xiàn)方法及裝置。
【背景技術(shù)】
[0002]目前web應(yīng)用系統(tǒng)為了解決高并發(fā)帶來的性能問題,都會在web應(yīng)用系統(tǒng)與數(shù)據(jù)庫之間采取緩存層,使用最為廣泛的就是RediS(RediS本質(zhì)上是一個鍵-值類型的內(nèi)存數(shù)據(jù)庫KRedis作為軟件和傳統(tǒng)數(shù)據(jù)庫之間的緩沖層,操作命令簡單,在保證了數(shù)據(jù)有效性的情況下,同時也保證了高性能。
[0003]Redis是一個開源、支持網(wǎng)絡(luò)、基于內(nèi)存的key-value(鍵-值對)數(shù)據(jù)庫。Redis支持存儲的數(shù)據(jù)類型包括:string(字符串)、list(鏈表)、set(集合)、zset(有序集合)和hash(哈希類型)等。對Redis數(shù)據(jù)庫進(jìn)行訪問的過程,大致可以分為讀請求和寫請求兩種。
[0004]現(xiàn)有的應(yīng)用對Redis數(shù)據(jù)庫進(jìn)行訪問的過程如圖1所示,以讀請求為例,應(yīng)用的m個讀請求存放于請求隊(duì)列12中,m2 I。為了應(yīng)對大規(guī)模的業(yè)務(wù)訪問,為應(yīng)用部署多個Redis實(shí)例14,每個Redis實(shí)例14占用一個Redis端口。應(yīng)用的請求隊(duì)列12中的讀請求由該請求隊(duì)列12對應(yīng)的連接池中的η個線程進(jìn)行處理,η 2 I。對于任一讀請求,應(yīng)用隨機(jī)分配一個線程進(jìn)行處理。假設(shè)線程I對讀請求m進(jìn)行處理,則線程I讀取讀請求m的key,并通過哈希算法將key映射到多個Redis端口中的一個,進(jìn)而通過該Redis端口將讀請求下發(fā)至與其對應(yīng)的Redis實(shí)例14,并通過該Redi s實(shí)例14對該讀請求m進(jìn)行處理。
[0005]在實(shí)際應(yīng)用時,發(fā)現(xiàn)上述技術(shù)至少存在以下問題:對Redis數(shù)據(jù)庫訪問的前序工作都由應(yīng)用來完成,而現(xiàn)有的應(yīng)用對應(yīng)的開發(fā)語言不同,因此對于不同開發(fā)語言的應(yīng)用均需要對應(yīng)地開發(fā)上述訪問Redis數(shù)據(jù)庫的處理模塊,所以不具有通用性。
【發(fā)明內(nèi)容】
[0006]本發(fā)明實(shí)施例提供一種Redis通用中間件的實(shí)現(xiàn)方法及裝置,用以解決現(xiàn)有技術(shù)訪問Redis數(shù)據(jù)庫的技術(shù)不通用的問題。
[0007]本發(fā)明方法包括一種Redis通用中間件的實(shí)現(xiàn)方法,該方法包括:中間件接收應(yīng)用發(fā)送的讀寫請求;所述中間件從與所述中間件連接的處理實(shí)體中確定所述讀寫請求對應(yīng)的處理實(shí)體;所述中間件從所述讀寫請求對應(yīng)的處理實(shí)體的連接池中獲取可用的連接鏈路,并通過所述連接鏈路發(fā)送所述讀寫請求。
[0008]基于同樣的發(fā)明構(gòu)思,本發(fā)明實(shí)施例還提供一種Redis通用中間件,包括:接收單元,用于接收應(yīng)用發(fā)送的讀寫請求;確定單元,用于從與所述中間件連接的處理實(shí)體中確定所述讀寫請求對應(yīng)的處理實(shí)體;處理單元,用于從所述讀寫請求對應(yīng)的處理實(shí)體的連接池中獲取可用的連接鏈路,并通過所述連接鏈路發(fā)送所述讀寫請求。
[0009]本發(fā)明實(shí)施例通過一個通用的中間件實(shí)現(xiàn)現(xiàn)有應(yīng)用訪問Redis數(shù)據(jù)庫的過程,SP該中間件接收應(yīng)用發(fā)送的讀寫請求,并從從與所述中間件連接的處理實(shí)體中確定所述讀寫請求對應(yīng)的處理實(shí)體,然后從所述讀寫請求對應(yīng)的處理實(shí)體的連接池中獲取可用的連接鏈路,并通過所述連接鏈路發(fā)送所述讀寫請求,因?yàn)橹虚g件實(shí)現(xiàn)了現(xiàn)有應(yīng)用訪問Redis數(shù)據(jù)庫的過程,其它應(yīng)用通過調(diào)用中間件的接口既可以訪問Redis數(shù)據(jù)庫,而不需要進(jìn)行額外的開發(fā),使得這一訪問Redis數(shù)據(jù)庫的技術(shù)具有通用性。
【附圖說明】
[0010]為了更清楚地說明本發(fā)明實(shí)施例中的技術(shù)方案,下面將對實(shí)施例描述中所需要使用的附圖作簡要介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明的一些實(shí)施例,對于本領(lǐng)域的普通技術(shù)人員來講,在不付出創(chuàng)造性勞動的前提下,還可以根據(jù)這些附圖獲得其他的附圖。
[0011]圖1為現(xiàn)有技術(shù)中應(yīng)用對Redis數(shù)據(jù)庫進(jìn)行訪問的過程;
[0012]圖2為本發(fā)明實(shí)施例提供一種Redis通用中間件的實(shí)現(xiàn)方法流程示意圖;
[0013]圖3為本發(fā)明實(shí)施例提供一種包含Redis通用中間件的Redis集群架構(gòu);
[OOM]圖4為本發(fā)明實(shí)施例提供一種包含Redis通用中間件、代理節(jié)點(diǎn)的Redis集群架構(gòu);
[0015]圖5為本發(fā)明實(shí)施例還提供一種Redis通用中間件。
【具體實(shí)施方式】
[0016]為了使本發(fā)明的目的、技術(shù)方案和優(yōu)點(diǎn)更加清楚,下面將結(jié)合附圖對本發(fā)明作進(jìn)一步地詳細(xì)描述,顯然,所描述的實(shí)施例僅僅是本發(fā)明一部份實(shí)施例,而不是全部的實(shí)施例?;诒景l(fā)明中的實(shí)施例,本領(lǐng)域普通技術(shù)人員在沒有做出創(chuàng)造性勞動前提下所獲得的所有其它實(shí)施例,都屬于本發(fā)明保護(hù)的范圍。
[0017]參見圖2所示,本發(fā)明實(shí)施例提供一種Redis通用中間件的實(shí)現(xiàn)方法流程示意圖,具體地實(shí)現(xiàn)方法包括:
[0018]步驟SlOl,中間件接收應(yīng)用發(fā)送的讀寫請求。
[0019]步驟S102,所述中間件從與所述中間件連接的處理實(shí)體中確定所述讀寫請求對應(yīng)的處理實(shí)體。
[0020]步驟S103,所述中間件從所述讀寫請求對應(yīng)的處理實(shí)體的連接池中獲取可用的連接鏈路,并通過所述連接鏈路發(fā)送所述讀寫請求。
[0021]因?yàn)樵趯?shí)際應(yīng)用中傳統(tǒng)的Redis的部署方式有多種結(jié)構(gòu),其中有兩種比較典型的部署方式,第一種部署方式是Redis集群中有若干實(shí)例組,應(yīng)用程序與多個實(shí)例組直連,SP應(yīng)用程序連接有多組主從配合的服務(wù)器,每個主服務(wù)器中運(yùn)行若干負(fù)責(zé)數(shù)據(jù)備份的實(shí)例;另一種部署方式則是較第一種部署方式多個代理節(jié)點(diǎn),由代理節(jié)點(diǎn)管控若干個實(shí)例組,由代理節(jié)點(diǎn)實(shí)現(xiàn)數(shù)據(jù)分片的功能,即應(yīng)用程序發(fā)送的讀寫請求通過代理節(jié)點(diǎn)分配至相應(yīng)的實(shí)例組處理。
[0022]考慮到本發(fā)明實(shí)施例中的通用的中間件需要滿足上述兩種部署結(jié)構(gòu),所以在步驟S102中,與所述中間件連接的處理實(shí)體指的是每組主從配合的服務(wù)器或者是代理節(jié)點(diǎn)。
[0023]一種實(shí)施方式是:假設(shè)與所述中間件連接的處理實(shí)體為Redis服務(wù)器;所述中間件從與所述中間件連接的處理實(shí)體中確定所述讀寫請求對應(yīng)的處理實(shí)體,包括:
[0024]根據(jù)所述讀寫請求中的數(shù)據(jù)主鍵值,確定對應(yīng)的Redis服務(wù)器;
[0025]根據(jù)所述數(shù)據(jù)主鍵值進(jìn)行哈希運(yùn)算生成的哈希值,確定對應(yīng)的所述Redis服務(wù)器的端口 ;根據(jù)確定的端口確定所述讀寫請求對應(yīng)的Redis實(shí)例。
[0026]也就是說,對于第一種部署結(jié)構(gòu),本發(fā)明實(shí)施例通過增加一種通用的中間件來代替每個應(yīng)用程序訪問Redis數(shù)據(jù)庫的功能,即通用的中間件通過接口連接應(yīng)用程序,接收來自應(yīng)用程序的讀寫請求,然后根據(jù)讀寫請求中的數(shù)據(jù)主鍵值,也就是key找到對應(yīng)的主服務(wù)器,因?yàn)槊總€主服務(wù)器中運(yùn)行著多個實(shí)例,所以在根據(jù)key進(jìn)行hash(哈希)運(yùn)算找到對應(yīng)的端口,進(jìn)而根據(jù)確定的端口找到該條讀寫請求對應(yīng)的Redis實(shí)例。
[0027]例如,圖3所示,應(yīng)用連接通用的中間件,中間件下面又連接兩個主從配合的Redis服務(wù)器,每個Redis服務(wù)器中運(yùn)行兩個Redis實(shí)例,針對中間件來講,可以包含四個功能部分,分別是數(shù)據(jù)分片、負(fù)載均衡、連接池和連接鏈路四個部分。
[0028]其中,數(shù)據(jù)分片指的是將數(shù)據(jù)主鍵按照一定的分組規(guī)則投放到相應(yīng)的Redis服務(wù)器。本申請是采用通用的hash分片算法,即根據(jù)數(shù)據(jù)主鍵值,確定對應(yīng)的Redis服務(wù)器;再根據(jù)所述數(shù)據(jù)主鍵值進(jìn)行哈希運(yùn)算生成的哈希值,確定對應(yīng)的所述Redis服務(wù)器的端口;根據(jù)確定的端口確定所述讀寫請求對應(yīng)的Redis實(shí)例,當(dāng)然也可以根據(jù)實(shí)際需要使用其它的分片算法。負(fù)載均衡功能指的是采用RoundRobin (輪詢調(diào)度)和WeightedRoundRobin(權(quán)重輪詢調(diào)度)兩種負(fù)載策略對每個Redis服務(wù)器內(nèi)的實(shí)例進(jìn)行調(diào)度。連接池是是由中間件與Redis服務(wù)器之間進(jìn)行通信的連接鏈路組成的,即連接池用于緩存中間件與Redis實(shí)例之間的長連接。同時還具有其他一些基本功能,如維持最小連接數(shù)、限制最大連接數(shù)和空閑連接數(shù)等;同時它還支持一些高級功能,如請求隊(duì)列、獲取連接超時限制、獲取連接時檢測、歸還連接時檢測等。中間件可以根據(jù)需要使用這些功能,以使提高程序性能。
[0029]在這種部署結(jié)構(gòu)中,對于中間件來說,中間件收到應(yīng)用程序發(fā)來的讀寫請求,首先實(shí)現(xiàn)數(shù)據(jù)分片功能,即將根據(jù)讀寫請求中的數(shù)據(jù)主鍵值確定本條讀寫請求對應(yīng)的哪個Redis服務(wù)器,再根據(jù)數(shù)據(jù)主鍵值進(jìn)行哈希運(yùn)算生成的哈希值,確定對應(yīng)的所述Redis服務(wù)器的端口 ;根據(jù)確定的端口確定所述讀寫請求對應(yīng)的Redis實(shí)例。當(dāng)確定好Redis實(shí)例之后,中間件從該Redis實(shí)例對應(yīng)的連接池中獲取一個長連接,這樣就可以通過長連接發(fā)送該條讀寫請求了。
[°03°]進(jìn)一步地,為了避免Redis實(shí)例發(fā)生故障,造成讀寫失敗,中間件定期向所述讀寫請求對應(yīng)的Redis實(shí)例發(fā)送心跳檢測;若心跳檢測成功,則從心跳檢測成功的Redis實(shí)例對應(yīng)的連接池中獲取可用的連接鏈路。也就是說,啟動單獨(dú)的線程定期地向每個Redis實(shí)例發(fā)送檢測報(bào)文,根據(jù)其響應(yīng)來判斷其健康狀態(tài)。另外,也向外部調(diào)用者開放了反饋接口,當(dāng)調(diào)用者讀寫Redis遇到異常時,可以調(diào)用反饋接口,以便及時對Redis實(shí)例的健康狀態(tài)進(jìn)行更新。
[0031]另一種實(shí)施方式是:假設(shè)與所述中間件連接的處理實(shí)體為代理節(jié)點(diǎn);
[0032]所述中間件從與所述中間件連接的處理實(shí)體中確定所述讀寫請求對應(yīng)的處理實(shí)體,包括:所述中間件根據(jù)各代理節(jié)點(diǎn)的工作狀態(tài),確定所述讀寫請求對應(yīng)的代理節(jié)點(diǎn);
[0033]所述通過所述連接鏈路發(fā)送所述讀寫請求,包括:
[0034]所述讀寫請求對應(yīng)的代理節(jié)點(diǎn)根據(jù)所述讀寫請求中的數(shù)據(jù)主鍵值,確定對應(yīng)的Redis實(shí)例;所述讀寫請求對應(yīng)的代理節(jié)點(diǎn)與所述Redis實(shí)例建立鏈路并將所述讀寫請求發(fā)送給所述對應(yīng)的Red i s實(shí)例。
[0035]也就是說,對于第二種部署結(jié)構(gòu),本發(fā)明實(shí)施例中的通用的中間件通過接口連接應(yīng)用程序,接收來自應(yīng)用程序的讀寫請求,然后根據(jù)各代理節(jié)點(diǎn)的工作狀態(tài),確定所述讀寫請求對應(yīng)的代理節(jié)點(diǎn)。其中,確定代理節(jié)點(diǎn)的方法可以按照如下方式確定,即所述中間件利用輪詢調(diào)度從與所述中間件連接的代理節(jié)點(diǎn)中選擇所述讀寫請求對應(yīng)的代理節(jié)點(diǎn);或者,所述中間件根據(jù)與所述中間件連接的代理節(jié)點(diǎn)運(yùn)行狀態(tài),確定每個代理節(jié)點(diǎn)的權(quán)重,并根據(jù)所述權(quán)重確定所述讀寫請求對應(yīng)的代理節(jié)點(diǎn)。
[0036]所謂輪詢調(diào)度指的是假設(shè)中間件連接兩個代理節(jié)點(diǎn),那么中間件發(fā)來的第一個讀寫請求發(fā)送給第一個代理節(jié)點(diǎn),第二個讀寫請求發(fā)送給第二個代理節(jié)點(diǎn),然后第三個讀寫請求再發(fā)送給第一個代理節(jié)點(diǎn),依次類推,這樣就可以做到兩個代理節(jié)點(diǎn)之間的負(fù)載均衡;當(dāng)然,也可以預(yù)先根據(jù)每個代理節(jié)點(diǎn)運(yùn)行的忙閑狀態(tài)設(shè)定權(quán)重,權(quán)重小的證明代理節(jié)點(diǎn)較忙,權(quán)重大的證明代理節(jié)點(diǎn)處于空閑狀態(tài),這樣,中間件就可以選擇權(quán)重大的代理節(jié)點(diǎn)處理讀寫請求,因此也使得代理節(jié)點(diǎn)之間的負(fù)載做到均衡。
[0037]當(dāng)代理節(jié)點(diǎn)確定之后,對應(yīng)的代理節(jié)點(diǎn)根據(jù)讀寫請求中的數(shù)據(jù)主鍵值,也就是key找到對應(yīng)的主服務(wù)器,因?yàn)槊總€主服務(wù)器中運(yùn)行著多個實(shí)例,所以在根據(jù)key進(jìn)行hash(哈希)運(yùn)算找到對應(yīng)的端口,進(jìn)而根據(jù)確定的端口找到該條讀寫請求對應(yīng)的Redis實(shí)例。
[0038]例如,圖4所示,應(yīng)用連接通用的中間件,中間件下面又連接兩個代理節(jié)點(diǎn),代理節(jié)點(diǎn)配合使用腳本監(jiān)聽Sentinal管控每個Redis服務(wù)器服務(wù)器,針對中間件來講,可以包含四個功能部分,分別是負(fù)載均衡、連接池和連接鏈路四個部分。
[0039]其中,負(fù)載均衡功能指的是采用RoundRobin(輪詢調(diào)度)和WeightedRoundRobin(權(quán)重輪詢調(diào)度)兩種負(fù)載策略對每個代理節(jié)點(diǎn)進(jìn)行調(diào)度。連接池是是由中間件與代理節(jié)點(diǎn)之間進(jìn)行通信的連接鏈路組成的,即連接池用于緩存中間件與代理節(jié)點(diǎn)之間的長連接。另外數(shù)據(jù)分片的功能則是由代理節(jié)點(diǎn)實(shí)現(xiàn)。
[0040]在這種部署結(jié)構(gòu)中,對于中間件來說,中間件收到應(yīng)用程序發(fā)來的讀寫請求,首先確定本條讀寫請求對應(yīng)的哪個代理節(jié)點(diǎn),當(dāng)確定好代理節(jié)點(diǎn)之后,中間件從對應(yīng)的連接池中選擇一條連接鏈路,將讀寫請求傳送給代理節(jié)點(diǎn),代理節(jié)點(diǎn)再根據(jù)讀寫請求中的數(shù)據(jù)主鍵值確定本條讀寫請求對應(yīng)的哪個Redis服務(wù)器,再根據(jù)數(shù)據(jù)主鍵值進(jìn)行哈希運(yùn)算生成的哈希值,確定對應(yīng)的所述Red i s服務(wù)器的端口,并根據(jù)確定的端口確定所述讀寫請求對應(yīng)的Redis實(shí)例。當(dāng)確定好Redis實(shí)例之后,中間件從該Redis實(shí)例對應(yīng)的連接池中獲取一個長連接,這樣就可以通過長連接發(fā)送該條讀寫請求了。
[0041]因?yàn)樗鲋虚g件為各代理節(jié)點(diǎn)設(shè)置有連接池,每個連接池中包括多個連接鏈路;進(jìn)一步地,所述中間件向所述讀寫請求對應(yīng)的代理節(jié)點(diǎn)的連接池中每條連接鏈路發(fā)送心跳檢測;若心跳檢測成功,則從所述代理節(jié)點(diǎn)對應(yīng)的連接池中中獲取可用的連接鏈路。也就是說,啟動單獨(dú)的線程定期地向代理節(jié)點(diǎn)對應(yīng)的連接池中每條連接鏈路發(fā)送檢測報(bào)文,根據(jù)其響應(yīng)來判斷其健康狀態(tài)。若心跳檢測成功,則證明對應(yīng)的連接鏈路可用,因此可以從可用的連接鏈路中任意選擇一條。
[0042]進(jìn)一步地,所述中間件確定代理節(jié)點(diǎn)不可用時,停止向所述不可用的代理節(jié)點(diǎn)發(fā)送讀寫請求;檢測所述不可用的代理節(jié)點(diǎn)對應(yīng)的讀寫請求的執(zhí)行狀態(tài),若執(zhí)行完畢,則將所述不可用的代理節(jié)點(diǎn)刪除。
[0043]可以理解的是,當(dāng)代理節(jié)點(diǎn)不再可用時,與該代理節(jié)點(diǎn)連接的Redis服務(wù)器中的實(shí)例可能還在運(yùn)行,此時,就需要監(jiān)測該部分實(shí)例的運(yùn)行狀態(tài),判斷該部分實(shí)例中的讀寫請求處理完成時,再將該代理節(jié)點(diǎn)刪除,就可以避免對正常的任務(wù)處理造成影響。
[0044]基于相同的技術(shù)構(gòu)思,本發(fā)明實(shí)施例還提供一種Redis通用中間件的實(shí)現(xiàn)裝置,該裝置可執(zhí)行上述方法實(shí)施例。本發(fā)明實(shí)施例提供的裝置如圖5所示,包括:接收單元401、確定單元402、處理單元403,其中:
[0045]接收單元401,用于接收應(yīng)用發(fā)送的讀寫請求;
[0046]確定單元402,用于從與所述中間件連接的處理實(shí)體中確定所述讀寫請求對應(yīng)的處理實(shí)體;
[0047]處理單元403,用于從所述讀寫請求對應(yīng)的處理實(shí)體的連接池中獲取可用的連接鏈路,并通過所述連接鏈路發(fā)送所述讀寫請求。
[0048]進(jìn)一步地,若與所述中間件連接的處理實(shí)體為Redis服務(wù)器;所述確定單元402具體用于:根據(jù)所述讀寫請求中的數(shù)據(jù)主鍵值,確定對應(yīng)的Redi s服務(wù)器;根據(jù)所述數(shù)據(jù)主鍵值進(jìn)行哈希運(yùn)算生成的哈希值,確定對應(yīng)的所述Redis服務(wù)器的端口 ;根據(jù)確定的端口確定所述讀寫請求對應(yīng)的Red i s實(shí)例。
[0049]進(jìn)一步地,所述處理單元403具體用于:向所述讀寫請求對應(yīng)的Redis實(shí)例發(fā)送心跳檢測;
[0050]若心跳檢測成功,則從心跳檢測成功的Redis實(shí)例對應(yīng)的連接池中獲取空閑的連接鏈路。
[0051 ]進(jìn)一步地,若與所述中間件連接的處理實(shí)體為代理節(jié)點(diǎn);
[0052]所述確定單元402具體用于:所述中間件根據(jù)各代理節(jié)點(diǎn)的工作狀態(tài),確定所述讀寫請求對應(yīng)的代理節(jié)點(diǎn);
[0053]所述處理單元403具體用于:所述讀寫請求對應(yīng)的代理節(jié)點(diǎn)根據(jù)所述讀寫請求中的數(shù)據(jù)主鍵值,確定對應(yīng)的Redis實(shí)例;所述讀寫請求對應(yīng)的代理節(jié)點(diǎn)與所述Redis實(shí)例建立鏈路并將所述讀寫請求發(fā)送給所述對應(yīng)的Redis實(shí)例。
[0054]進(jìn)一步地,所述處理單元403具體用于:為各代理節(jié)點(diǎn)設(shè)置有連接池,每個連接池中包括多個連接鏈路;
[0055]向所述讀寫請求對應(yīng)的代理節(jié)點(diǎn)的連接池中每條連接鏈路發(fā)送心跳檢測;
[0056]若心跳檢測成功,則從所述代理節(jié)點(diǎn)對應(yīng)的連接池中中獲取可用的連接鏈路。
[0057]進(jìn)一步地,所述處理單元403還用于:確定代理節(jié)點(diǎn)不可用時,停止向不可用的代理節(jié)點(diǎn)發(fā)送讀寫請求;
[0058]檢測所述不可用的代理節(jié)點(diǎn)對應(yīng)的讀寫請求的執(zhí)行狀態(tài),若執(zhí)行完畢,則將所述不可用的代理節(jié)點(diǎn)刪除。
[0059]進(jìn)一步地,所述確定單元402具體用于:利用輪詢調(diào)度從與所述中間件連接的代理節(jié)點(diǎn)中選擇所述讀寫請求對應(yīng)的代理節(jié)點(diǎn);
[0060]或者,根據(jù)與所述中間件連接的代理節(jié)點(diǎn)運(yùn)行狀態(tài),確定每個處理實(shí)體的權(quán)重,并根據(jù)所述權(quán)重確定所述讀寫請求對應(yīng)的代理節(jié)點(diǎn)。
[0061]綜上所述,本發(fā)明實(shí)施例通過一個通用的中間件實(shí)現(xiàn)現(xiàn)有應(yīng)用訪問Redis數(shù)據(jù)庫的過程,即該中間件接收應(yīng)用發(fā)送的讀寫請求,并從從與所述中間件連接的處理實(shí)體中確定所述讀寫請求對應(yīng)的處理實(shí)體,然后從所述讀寫請求對應(yīng)的處理實(shí)體的連接池中獲取可用的連接鏈路,并通過所述連接鏈路發(fā)送所述讀寫請求,因?yàn)橹虚g件實(shí)現(xiàn)了現(xiàn)有應(yīng)用訪問Redis數(shù)據(jù)庫的過程,其它應(yīng)用通過調(diào)用中間件的接口既可以訪問Redis數(shù)據(jù)庫,而不需要進(jìn)行額外的開發(fā),使得這一訪問Redis數(shù)據(jù)庫的技術(shù)具有通用性,另外,通過心跳檢測,獲取可用的連接鏈路,也可以進(jìn)一步地避免因代理節(jié)點(diǎn)或者Redis服務(wù)器發(fā)生故障造成的讀寫失敗的問題。
[0062]本發(fā)明是參照根據(jù)本發(fā)明實(shí)施例的方法、設(shè)備(系統(tǒng))、和計(jì)算機(jī)程序產(chǎn)品的流程圖和/或方框圖來描述的。應(yīng)理解可由計(jì)算機(jī)程序指令實(shí)現(xiàn)流程圖和/或方框圖中的每一流程和/或方框、以及流程圖和/或方框圖中的流程和/或方框的結(jié)合??商峁┻@些計(jì)算機(jī)程序指令到通用計(jì)算機(jī)、專用計(jì)算機(jī)、嵌入式處理機(jī)或其他可編程數(shù)據(jù)處理設(shè)備的處理器以產(chǎn)生一個機(jī)器,使得通過計(jì)算機(jī)或其他可編程數(shù)據(jù)處理設(shè)備的處理器執(zhí)行的指令產(chǎn)生用于實(shí)現(xiàn)在流程圖一個流程或多個流程和/或方框圖一個方框或多個方框中指定的功能的裝置。
[0063]這些計(jì)算機(jī)程序指令也可存儲在能引導(dǎo)計(jì)算機(jī)或其他可編程數(shù)據(jù)處理設(shè)備以特定方式工作的計(jì)算機(jī)可讀存儲器中,使得存儲在該計(jì)算機(jī)可讀存儲器中的指令產(chǎn)生包括指令裝置的制造品,該指令裝置實(shí)現(xiàn)在流程圖一個流程或多個流程和/或方框圖一個方框或多個方框中指定的功能。
[0064]這些計(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)在流程圖一個流程或多個流程和/或方框圖一個方框或多個方框中指定的功能的步驟。
[0065]盡管已描述了本發(fā)明的優(yōu)選實(shí)施例,但本領(lǐng)域內(nèi)的技術(shù)人員一旦得知了基本創(chuàng)造性概念,則可對這些實(shí)施例作出另外的變更和修改。所以,所附權(quán)利要求意欲解釋為包括優(yōu)選實(shí)施例以及落入本發(fā)明范圍的所有變更和修改。
[0066]顯然,本領(lǐng)域的技術(shù)人員可以對本發(fā)明進(jìn)行各種改動和變型而不脫離本發(fā)明的精神和范圍。這樣,倘若本發(fā)明的這些修改和變型屬于本發(fā)明權(quán)利要求及其等同技術(shù)的范圍之內(nèi),則本發(fā)明也意圖包含這些改動和變型在內(nèi)。
【主權(quán)項(xiàng)】
1.一種Redis通用中間件的實(shí)現(xiàn)方法,其特征在于,該方法包括: 中間件接收應(yīng)用發(fā)送的讀寫請求; 所述中間件從與所述中間件連接的處理實(shí)體中確定所述讀寫請求對應(yīng)的處理實(shí)體;所述中間件從所述讀寫請求對應(yīng)的處理實(shí)體的連接池中獲取可用的連接鏈路,并通過所述連接鏈路發(fā)送所述讀寫請求。2.如權(quán)利要求1所述的方法,其特征在于,與所述中間件連接的處理實(shí)體為Redis服務(wù)器; 所述中間件從與所述中間件連接的處理實(shí)體中確定所述讀寫請求對應(yīng)的處理實(shí)體,包括: 根據(jù)所述讀寫請求中的數(shù)據(jù)主鍵值,確定對應(yīng)的Redi s服務(wù)器; 根據(jù)所述數(shù)據(jù)主鍵值進(jìn)行哈希運(yùn)算生成的哈希值,確定對應(yīng)的所述Redis服務(wù)器的端P; 根據(jù)確定的端口確定所述讀寫請求對應(yīng)的Redis實(shí)例。3.如權(quán)利要求2所述的方法,其特征在于,所述中間件從所述讀寫請求對應(yīng)的處理實(shí)體的連接池中獲取可用的連接鏈路,包括: 向所述讀寫請求對應(yīng)的Redis實(shí)例發(fā)送心跳檢測; 若心跳檢測成功,則從心跳檢測成功的Redis實(shí)例對應(yīng)的連接池中獲取可用的連接鏈路。4.如權(quán)利要求1所述的方法,其特征在于,與所述中間件連接的處理實(shí)體為代理節(jié)點(diǎn); 所述中間件從與所述中間件連接的處理實(shí)體中確定所述讀寫請求對應(yīng)的處理實(shí)體,包括: 所述中間件根據(jù)各代理節(jié)點(diǎn)的工作狀態(tài),確定所述讀寫請求對應(yīng)的代理節(jié)點(diǎn); 所述通過所述連接鏈路發(fā)送所述讀寫請求,包括: 所述讀寫請求對應(yīng)的代理節(jié)點(diǎn)根據(jù)所述讀寫請求中的數(shù)據(jù)主鍵值,確定對應(yīng)的Red i s實(shí)例; 所述讀寫請求對應(yīng)的代理節(jié)點(diǎn)與所述Redi s實(shí)例建立鏈路并將所述讀寫請求發(fā)送給所述對應(yīng)的Redis實(shí)例。5.如權(quán)利要求4所述的方法,其特征在于,所述中間件從所述讀寫請求對應(yīng)的處理實(shí)體的連接池中獲取可用的連接鏈路,包括: 所述中間件為各代理節(jié)點(diǎn)設(shè)置有連接池,每個連接池中包括多個連接鏈路; 所述中間件向所述讀寫請求對應(yīng)的代理節(jié)點(diǎn)的連接池中每條連接鏈路發(fā)送心跳檢測; 若心跳檢測成功,則從所述代理節(jié)點(diǎn)對應(yīng)的連接池中中獲取可用的連接鏈路。6.如權(quán)利要求4所述的方法,其特征在于,還包括: 所述中間件確定代理節(jié)點(diǎn)不可用時,停止向不可用的代理節(jié)點(diǎn)發(fā)送讀寫請求; 檢測所述不可用的代理節(jié)點(diǎn)對應(yīng)的讀寫請求的執(zhí)行狀態(tài),若執(zhí)行完畢,則將所述不可用的代理節(jié)點(diǎn)刪除。7.如權(quán)利要求4?6任一所述的方法,其特征在于,所述中間件從與所述中間件連接的處理實(shí)體中確定所述讀寫請求對應(yīng)的處理實(shí)體,包括: 所述中間件利用輪詢調(diào)度從與所述中間件連接的代理節(jié)點(diǎn)中選擇所述讀寫請求對應(yīng)的代理節(jié)點(diǎn); 或者,所述中間件根據(jù)與所述中間件連接的代理節(jié)點(diǎn)運(yùn)行狀態(tài),確定每個代理節(jié)點(diǎn)的權(quán)重,并根據(jù)所述權(quán)重確定所述讀寫請求對應(yīng)的代理節(jié)點(diǎn)。8.一種Redis通用中間件,其特征在于,包括: 接收單元,用于接收應(yīng)用發(fā)送的讀寫請求; 確定單元,用于從與所述中間件連接的處理實(shí)體中確定所述讀寫請求對應(yīng)的處理實(shí)體; 處理單元,用于從所述讀寫請求對應(yīng)的處理實(shí)體的連接池中獲取可用的連接鏈路,并通過所述連接鏈路發(fā)送所述讀寫請求。9.如權(quán)利要求8所述的中間件,其特征在于,與所述中間件連接的處理實(shí)體為Redis月艮務(wù)器; 所述確定單元具體用于:根據(jù)所述讀寫請求中的數(shù)據(jù)主鍵值,確定對應(yīng)的Redis服務(wù)器; 根據(jù)所述數(shù)據(jù)主鍵值進(jìn)行哈希運(yùn)算生成的哈希值,確定對應(yīng)的所述Redis服務(wù)器的端P; 根據(jù)確定的端口確定所述讀寫請求對應(yīng)的Redis實(shí)例。10.如權(quán)利要求9所述的中間件,其特征在于,所述處理單元具體用于: 向所述讀寫請求對應(yīng)的Redis實(shí)例發(fā)送心跳檢測; 若心跳檢測成功,則從心跳檢測成功的Redis實(shí)例對應(yīng)的連接池中獲取空閑的連接鏈路。11.如權(quán)利要求8所述的中間件,其特征在于,與所述中間件連接的處理實(shí)體為代理節(jié)占.V , 所述確定單元具體用于:所述中間件根據(jù)各代理節(jié)點(diǎn)的工作狀態(tài),確定所述讀寫請求對應(yīng)的代理節(jié)點(diǎn); 所述讀寫請求對應(yīng)的代理節(jié)點(diǎn)根據(jù)所述讀寫請求中的數(shù)據(jù)主鍵值,確定對應(yīng)的Red i s實(shí)例;所述讀寫請求對應(yīng)的代理節(jié)點(diǎn)與所述Redi s實(shí)例建立鏈路并將所述讀寫請求發(fā)送給所述對應(yīng)的Redis實(shí)例。12.如權(quán)利要求11所述的中間件,其特征在于,所述處理單元具體用于: 為各代理節(jié)點(diǎn)設(shè)置有連接池,每個連接池中包括多個連接鏈路; 向所述讀寫請求對應(yīng)的代理節(jié)點(diǎn)的連接池中每條連接鏈路發(fā)送心跳檢測; 若心跳檢測成功,則從所述代理節(jié)點(diǎn)對應(yīng)的連接池中中獲取可用的連接鏈路。13.如權(quán)利要求11所述的中間件,其特征在于,所述處理單元還用于: 確定代理節(jié)點(diǎn)不可用時,停止向不可用的代理節(jié)點(diǎn)發(fā)送讀寫請求; 檢測所述不可用的代理節(jié)點(diǎn)對應(yīng)的讀寫請求的執(zhí)行狀態(tài),若執(zhí)行完畢,則將所述不可用的代理節(jié)點(diǎn)刪除。14.如權(quán)利要求11?13任一項(xiàng)所述的中間件,其特征在于,所述確定單元具體用于: 利用輪詢調(diào)度從與所述中間件連接的代理節(jié)點(diǎn)中選擇所述讀寫請求對應(yīng)的代理節(jié)點(diǎn);或者,根據(jù)與所述中間件連接的代理節(jié)點(diǎn)運(yùn)行狀態(tài),確定每個代理節(jié)點(diǎn)的權(quán)重,并根據(jù)所述權(quán)重確定所述讀寫請求對應(yīng)的代理節(jié)點(diǎn)。
【文檔編號】H04L29/08GK105933408SQ201610248474
【公開日】2016年9月7日
【申請日】2016年4月20日
【發(fā)明人】孫黎明
【申請人】中國銀聯(lián)股份有限公司