本發(fā)明涉及數(shù)據(jù)讀取技術(shù)領(lǐng)域,尤其涉及一種基于內(nèi)存對(duì)象緩存系統(tǒng)的數(shù)據(jù)預(yù)讀方法。
背景技術(shù):
基于內(nèi)存對(duì)象緩存系統(tǒng),它們可以在傳統(tǒng)數(shù)據(jù)庫(kù)的垂直方向上,加入一特制的緩存結(jié)構(gòu),不僅可以改進(jìn)底層數(shù)據(jù)庫(kù)的用戶請(qǐng)求和事務(wù)執(zhí)行的響應(yīng)時(shí)間,還能夠簡(jiǎn)化其底層的數(shù)據(jù)庫(kù)操作,例如:基于鍵值的數(shù)據(jù)訪問方式。如此一來,可以在付出較小的系統(tǒng)代價(jià)下,使得底層數(shù)據(jù)庫(kù)在應(yīng)付海量數(shù)據(jù)涌入的同時(shí),擴(kuò)展性得以大幅度提高,具體表現(xiàn)在:緩解了傳統(tǒng)外存設(shè)備所帶來的性能瓶頸,還能夠同時(shí)在CPU和存儲(chǔ)兩個(gè)方面帶來得天獨(dú)厚的擴(kuò)展性優(yōu)勢(shì),使其能夠適應(yīng)大數(shù)據(jù)的動(dòng)態(tài)性變化,較大的減少了不必要的系統(tǒng)I/O。
目前,基于內(nèi)存對(duì)象緩存系統(tǒng)在國(guó)內(nèi)外大中型企業(yè)的數(shù)據(jù)中心內(nèi)部得到了較大規(guī)模的部署和應(yīng)用,例如:國(guó)內(nèi)淘寶、京東的搶購(gòu)系統(tǒng)、滴滴的實(shí)時(shí)叫車系統(tǒng)、國(guó)外的Facebook的圖片緩存系統(tǒng)以及Twitter數(shù)百TB級(jí)的緩存系統(tǒng)等等。它們具體用到的內(nèi)存對(duì)象緩存系統(tǒng)主要是開源的Memcached和Redis兩種。
Memcached 是一個(gè)高性能的分布式的內(nèi)存對(duì)象的緩存系統(tǒng) ,通過在內(nèi)存里維護(hù)一個(gè)統(tǒng)一的巨大的hash 表,能夠存儲(chǔ)各種格式的數(shù)據(jù)。一般使用場(chǎng)景是將其部署在一前端結(jié)點(diǎn)之上,通過網(wǎng)絡(luò)與后端的數(shù)據(jù)庫(kù)連接。當(dāng)系統(tǒng)正常運(yùn)轉(zhuǎn)之后,每次接收到的用戶查詢(讀方向),都會(huì)在該位于前端的內(nèi)存對(duì)象緩存系統(tǒng)里尋找其想要的數(shù)據(jù),以盡量減少后端數(shù)據(jù)庫(kù)的訪問次數(shù),以提高外部的動(dòng)態(tài) Web 等應(yīng)用之速度和其用戶體驗(yàn)。
Redis 同 Memcached 一樣,也是一個(gè) C/S 結(jié)構(gòu)的內(nèi)存對(duì)象緩存系統(tǒng)實(shí)現(xiàn),Redis 在很多方面與 Memcached 具有相同的特征,不同的是 Redis 增加了持久化的功能,并支持更多的數(shù)據(jù)類型,和事務(wù)控制。在緩存方面的應(yīng)用,Redis和Memcached基本類似。
以上兩個(gè)系統(tǒng)中都是以被動(dòng)的方式來填充其內(nèi)存中的數(shù)據(jù),也即根據(jù)計(jì)算機(jī)程序的空間局部性原理,當(dāng)滿足了某個(gè)用戶請(qǐng)求的數(shù)據(jù)A之后,系統(tǒng)才將該數(shù)據(jù)保留至該緩存系統(tǒng)中,以便用于下一次訪問的命中,從而避免之后的數(shù)據(jù)庫(kù)自身的操作,達(dá)到節(jié)省開銷和提升性能的效果。但是,為之付出的代價(jià)是第一次訪問數(shù)據(jù)A的性能為次優(yōu),而且接下來大量的訪問都是在重復(fù)這一過程:大量的數(shù)據(jù)訪問請(qǐng)求需要穿透緩存到達(dá)數(shù)據(jù)庫(kù)(緩存穿透),之后才將滿足用戶請(qǐng)求的數(shù)據(jù)保留到緩存中。在大數(shù)據(jù)高并發(fā)這樣的系統(tǒng)中,這種次優(yōu)的解決方案無疑被放大化,致使資源利用率不夠充分,后端數(shù)據(jù)庫(kù)的I/O過于頻繁。同時(shí),大量的網(wǎng)絡(luò)I/O會(huì)產(chǎn)生許多的次網(wǎng)絡(luò)I/O,極有可能引發(fā)緩存無底洞的問題(當(dāng)緩存系統(tǒng)性能不佳時(shí),通過增加節(jié)點(diǎn),但是依然沒有好轉(zhuǎn)的現(xiàn)象),這會(huì)導(dǎo)致一次批量操作會(huì)涉及多次網(wǎng)絡(luò)操作,也就意味著批量操作會(huì)隨著實(shí)例的增多,耗時(shí)會(huì)不斷增大。而且如果在某一時(shí)刻同時(shí)有大量的請(qǐng)求穿透了緩存,所有請(qǐng)求都去查數(shù)據(jù)庫(kù),在這一瞬間會(huì)導(dǎo)致數(shù)據(jù)庫(kù)CPU和內(nèi)存負(fù)載過高,甚至宕機(jī)(緩存雪崩現(xiàn)象)。
技術(shù)實(shí)現(xiàn)要素:
有鑒于此,針對(duì)減少甚至避免緩存穿透以及緩存無底洞現(xiàn)象的發(fā)生,減少次優(yōu)請(qǐng)求的發(fā)生等問題,提供一種基于主動(dòng)工作方式的內(nèi)存對(duì)象緩存系統(tǒng)數(shù)據(jù)預(yù)讀方法,該方法可以提高內(nèi)存對(duì)象緩存系統(tǒng)的性能,會(huì)根據(jù)用戶的請(qǐng)求動(dòng)態(tài)的篩選出用戶下次最有可能訪問的數(shù)據(jù)并返回到內(nèi)存對(duì)象緩存系統(tǒng)中,并且根據(jù)系統(tǒng)資源的使用情況以及當(dāng)前緩存的命中率來確定返回?cái)?shù)據(jù)量的大小,從而達(dá)到極大化的利用系統(tǒng)資源。
一種基于內(nèi)存對(duì)象緩存系統(tǒng)的數(shù)據(jù)預(yù)讀方法,所述的預(yù)讀方法為當(dāng)后端數(shù)據(jù)庫(kù)第一次返回用戶所需數(shù)據(jù)發(fā)出的訪問請(qǐng)求時(shí),提取本次數(shù)據(jù)訪問的數(shù)據(jù)特性,并根據(jù)所述數(shù)據(jù)特性提取相關(guān)聯(lián)的關(guān)聯(lián)性數(shù)據(jù),所述的關(guān)聯(lián)性數(shù)據(jù)隨用戶所需數(shù)據(jù)一次性地返回至前端內(nèi)存對(duì)象緩存系統(tǒng)。
作為優(yōu)選,為了節(jié)省空間,并對(duì)本發(fā)明提出的數(shù)據(jù)預(yù)測(cè)算法的部分預(yù)測(cè)錯(cuò)誤預(yù)測(cè)進(jìn)行彌補(bǔ),所述的關(guān)聯(lián)性數(shù)據(jù)添加到緩存系統(tǒng)的有效時(shí)間為6個(gè)小時(shí),如果在6個(gè)小時(shí)之內(nèi)該數(shù)據(jù)未被訪問,內(nèi)存對(duì)象緩存系統(tǒng)自動(dòng)銷毀該數(shù)據(jù)占用的內(nèi)存并釋放相應(yīng)的空間。
所述的預(yù)讀方法實(shí)現(xiàn)包括以下步驟:
S1,當(dāng)用戶發(fā)出數(shù)據(jù)請(qǐng)求后,系統(tǒng)首先判斷用戶請(qǐng)求的數(shù)據(jù)是否在內(nèi)存對(duì)象緩存系統(tǒng)中,如果在內(nèi)存對(duì)象緩存系統(tǒng)中命中,系統(tǒng)直接從內(nèi)存對(duì)象緩存系統(tǒng)中將數(shù)據(jù)返回給用戶并結(jié)束此次訪問;
S2,如果請(qǐng)求的數(shù)據(jù)未在內(nèi)存對(duì)象緩存系統(tǒng)中命中,監(jiān)控系統(tǒng)會(huì)根據(jù)當(dāng)前系統(tǒng)性能判斷是否開啟預(yù)讀功能,如果當(dāng)前系統(tǒng)性能不佳,監(jiān)控系統(tǒng)關(guān)閉預(yù)讀功能,并直接訪問后臺(tái)數(shù)據(jù)庫(kù),將用戶請(qǐng)求的數(shù)據(jù)添加到內(nèi)存對(duì)象緩存系統(tǒng)后返回用戶請(qǐng)求的數(shù)據(jù)提供給用戶;
S3,如果當(dāng)前系統(tǒng)性能好,開啟預(yù)讀功能,此時(shí),系統(tǒng)根據(jù)當(dāng)前系統(tǒng)運(yùn)行的狀態(tài)、緩存命中率以及用戶請(qǐng)求的數(shù)據(jù)量的大小來確定預(yù)讀窗口的大小,隨后系統(tǒng)從數(shù)據(jù)庫(kù)中獲取用戶請(qǐng)求的數(shù)據(jù)并將其添加到待緩存隊(duì)列中,接下來,系統(tǒng)會(huì)判斷加入到隊(duì)列中的數(shù)據(jù)量是否小于預(yù)讀窗口的大??;
S31,如果隊(duì)列中的數(shù)據(jù)小于當(dāng)前系統(tǒng)的預(yù)讀窗口大小,系統(tǒng)會(huì)判斷當(dāng)前待緩存隊(duì)列中的最新數(shù)據(jù)是否在數(shù)據(jù)庫(kù)中與其他表中數(shù)據(jù)存在關(guān)聯(lián),如果存在關(guān)聯(lián)關(guān)系,那么系統(tǒng)將會(huì)把相關(guān)聯(lián)的數(shù)據(jù)加入到待緩存隊(duì)列中,直至隊(duì)列中的數(shù)據(jù)大于預(yù)讀窗口的大小或者隊(duì)列中的數(shù)據(jù)已經(jīng)再無相關(guān)聯(lián)的數(shù)據(jù),一旦隊(duì)列中的數(shù)據(jù)大于預(yù)讀窗口的大小,則跳轉(zhuǎn)到S32,如果隊(duì)列中的數(shù)據(jù)已經(jīng)不存在關(guān)聯(lián)關(guān)系,但是依然小于預(yù)讀窗口的大小,那么系統(tǒng)就會(huì)從隊(duì)列中獲取最新數(shù)據(jù)所在表中的最新N條記錄并添加到待緩存隊(duì)列中,如果最新的N條數(shù)據(jù)在待緩存隊(duì)列中已經(jīng)存在,則繼續(xù)獲取次新的記錄添加到待緩存隊(duì)列中;
S32如果待緩存隊(duì)列中數(shù)據(jù)已經(jīng)大于預(yù)讀窗口的大小,那么系統(tǒng)直接將待緩存隊(duì)列中的數(shù)據(jù)添加到緩存中并返回用戶請(qǐng)求的數(shù)據(jù)。
其中,所述當(dāng)前系統(tǒng)性能判斷包括對(duì)系統(tǒng)進(jìn)行分級(jí),可分為不繁忙狀態(tài)L1、一般繁忙狀態(tài)L2及繁忙狀態(tài)L3三級(jí)。
所述的不繁忙狀態(tài)L1可定義為CPU處于用戶模式下的時(shí)間百分比和系統(tǒng)模式下的時(shí)間百分比之和小于百分之七十,內(nèi)存使用處于空閑內(nèi)存占系統(tǒng)總內(nèi)存的百分比小于等于百分之六十,I/O使用處于每秒進(jìn)行讀寫操作的次數(shù)相對(duì)最大讀寫次數(shù)的百分比小于等于百分之六十,當(dāng)前網(wǎng)絡(luò)的使用處于使用的帶寬占總帶寬的百分比小于等于百分之六十,寬帶延遲小于50ms。
所述的繁忙狀態(tài)L3定義為CPU處于用戶模式下的時(shí)間百分比和系統(tǒng)模式下的時(shí)間百分比之和不小于百分之八十五,內(nèi)存使用處于空閑內(nèi)存占系統(tǒng)總內(nèi)存的百分比不小于百分之八十,I/O使用處于每秒進(jìn)行讀寫操作的次數(shù)相對(duì)最大讀寫次數(shù)的百分比大于等于百分之八十,當(dāng)前網(wǎng)絡(luò)的使用處于使用的帶寬占總帶寬的百分比不小于百分之八十,寬帶延遲大于100ms。
處于不繁忙狀態(tài)L1和繁忙狀態(tài)L3之間的定義為一般繁忙狀態(tài)L2。
其中,所述的預(yù)讀窗口大小由以下條件判斷:
系統(tǒng)在不繁忙狀態(tài)下L1: 緩存命中率較低時(shí):R1=R0*4*2;緩存命中率較高時(shí):R1=R0*4;
系統(tǒng)在一般繁忙狀態(tài)下L2:緩存命中率較低時(shí):R1=R0*2*2;緩存命中率較高時(shí):R1=R0*2;
系統(tǒng)在繁忙狀態(tài)下L3:關(guān)閉數(shù)據(jù)預(yù)讀功能,清理不必要的進(jìn)程,釋放內(nèi)存空間;
其中定義預(yù)讀窗口的基本單位為數(shù)據(jù)表中的一條記錄,記為R,記路用戶請(qǐng)求的數(shù)據(jù)對(duì)應(yīng)的數(shù)據(jù)量為R0。
有益效果:通過在內(nèi)存對(duì)象緩存系統(tǒng)中引入預(yù)讀和監(jiān)控系統(tǒng),有效的提高了緩存的命中率以及系統(tǒng)的穩(wěn)定性,充分的利用了系統(tǒng)的資源,減少了許多不必要的系統(tǒng)I/O以及其他系統(tǒng)資源的浪費(fèi),同時(shí)使得內(nèi)存對(duì)象緩存系統(tǒng)體現(xiàn)的更加智能和實(shí)時(shí),緩存的更新變得更加的主動(dòng)。
附圖說明
圖1 基于內(nèi)存對(duì)象緩存系統(tǒng)的數(shù)據(jù)預(yù)讀方法技術(shù)路線流程圖;
圖2基于內(nèi)存對(duì)象緩存系統(tǒng)的數(shù)據(jù)預(yù)讀方法中預(yù)讀功能的實(shí)現(xiàn)。
具體實(shí)施方式
下面結(jié)合附圖,對(duì)本發(fā)明的一種基于內(nèi)存對(duì)象緩存系統(tǒng)的數(shù)據(jù)預(yù)讀方法做詳細(xì)說明。
一種基于內(nèi)存對(duì)象緩存系統(tǒng)的數(shù)據(jù)預(yù)讀方法,所述的預(yù)讀方法為當(dāng)后端數(shù)據(jù)庫(kù)第一次返回用戶所需數(shù)據(jù)發(fā)出的訪問請(qǐng)求時(shí),提取本次數(shù)據(jù)訪問的數(shù)據(jù)特性,并根據(jù)所述數(shù)據(jù)特性提取相關(guān)聯(lián)的關(guān)聯(lián)性數(shù)據(jù),所述的關(guān)聯(lián)性數(shù)據(jù)隨用戶所需數(shù)據(jù)一次性地返回至前端內(nèi)存對(duì)象緩存系統(tǒng)。更具體的來說,當(dāng)后端數(shù)據(jù)庫(kù)返回用戶第一次對(duì)A數(shù)據(jù)發(fā)出的訪問請(qǐng)求時(shí),通過洞悉本次數(shù)據(jù)訪問的數(shù)據(jù)特性,將此次未被訪問的其他數(shù)據(jù)關(guān)聯(lián)起來(此處標(biāo)記為B),B并隨著A一次性地返回至前端內(nèi)存對(duì)象緩存系統(tǒng)。之后,當(dāng)用戶第一次提出訪問B數(shù)據(jù)時(shí),可以直接在內(nèi)存對(duì)象緩存系統(tǒng)中找到數(shù)據(jù)B,而無需經(jīng)歷在后端尋找數(shù)據(jù)的過程,以提高該數(shù)據(jù)庫(kù)系統(tǒng)的性能。換句話說,在系統(tǒng)開銷可以接受的情況下,為基于內(nèi)存對(duì)象的緩存系統(tǒng)量身定做一種預(yù)讀(Read-ahead)算法,并且將其應(yīng)用至現(xiàn)在的緩存系統(tǒng)運(yùn)行環(huán)境中,以提升整個(gè)數(shù)據(jù)庫(kù)系統(tǒng)(“整個(gè)”指的是前端加后端)的吞吐能力。
如圖1所示,當(dāng)用戶首次訪問數(shù)據(jù)庫(kù)中某一數(shù)據(jù)時(shí),通過預(yù)讀算法,將此次未被訪問的其他數(shù)據(jù)關(guān)聯(lián)起來,并隨著被訪問的數(shù)據(jù)一次性地返回至數(shù)據(jù)庫(kù)。之后,當(dāng)用戶第一次訪問到預(yù)讀到數(shù)據(jù)庫(kù)中的數(shù)據(jù)時(shí),可以直接在緩存中命中,無需經(jīng)歷在后臺(tái)尋找數(shù)據(jù)的過程。以此提高緩存的性能并減少非必要I/O;另一方面,需要對(duì)數(shù)據(jù)庫(kù)進(jìn)行動(dòng)態(tài)的預(yù)讀,通過這種策略來決定將哪些數(shù)據(jù),多大的數(shù)據(jù)量加入到緩存中可以使得內(nèi)存對(duì)象緩存系統(tǒng)達(dá)到較好的狀態(tài)。
當(dāng)user1訪問系統(tǒng),發(fā)出請(qǐng)求A時(shí),由于請(qǐng)求的數(shù)據(jù)不在內(nèi)存對(duì)象緩存系統(tǒng)中,所以該請(qǐng)求會(huì)穿過內(nèi)存對(duì)象緩存系統(tǒng)。此時(shí),性能監(jiān)控系統(tǒng)檢測(cè)到系統(tǒng)的性能極佳,所以該請(qǐng)求從數(shù)據(jù)庫(kù)中獲取了請(qǐng)求A所需要的數(shù)據(jù)A后,系統(tǒng)將對(duì)該數(shù)據(jù)進(jìn)行分析,隨后該請(qǐng)求將攜帶數(shù)據(jù)A與數(shù)據(jù)A相關(guān)聯(lián)的B,C,D一起返回到內(nèi)存對(duì)象緩存系統(tǒng)中,并將user1請(qǐng)求的數(shù)據(jù)A發(fā)送給用戶。
當(dāng)user2訪問系統(tǒng),發(fā)出請(qǐng)求B時(shí),由于請(qǐng)求的數(shù)據(jù)B已經(jīng)在內(nèi)存對(duì)象緩存系統(tǒng)中,所以系統(tǒng)會(huì)直接從緩存中將數(shù)據(jù)返回給user2。當(dāng)user3訪問系統(tǒng),發(fā)出請(qǐng)求E時(shí),由于請(qǐng)求的數(shù)據(jù)不在緩存中,所以該請(qǐng)求會(huì)穿透內(nèi)存對(duì)象緩存系統(tǒng),想后臺(tái)數(shù)據(jù)庫(kù)索取數(shù)據(jù)。但是由于當(dāng)前系統(tǒng)性能不佳,所以系統(tǒng)關(guān)閉了預(yù)讀功能,只是將用戶請(qǐng)求的數(shù)據(jù)E添加到緩存中并返回給user3;同時(shí),監(jiān)控系統(tǒng)會(huì)清理不必要的進(jìn)程,釋放內(nèi)存空間,并去掉不必要的I/O操作來對(duì)系統(tǒng)進(jìn)行優(yōu)化。
當(dāng)user4訪問系統(tǒng)時(shí),此時(shí)系統(tǒng)的性能依然很差,所以依然僅從數(shù)據(jù)庫(kù)系統(tǒng)中獲取請(qǐng)求的數(shù)據(jù)后,更新緩存并相應(yīng)user4的請(qǐng)求。
從這些請(qǐng)求過程中可以看出,內(nèi)存對(duì)象緩存系統(tǒng)因?yàn)橛辛祟A(yù)讀和監(jiān)控,變得更加智能,更加主動(dòng)。預(yù)讀和監(jiān)控的加入,使得整個(gè)系統(tǒng)更加的穩(wěn)定和靈活。
其中預(yù)讀方法的實(shí)現(xiàn):如圖2所示,首先,當(dāng)一個(gè)用戶發(fā)出數(shù)據(jù)請(qǐng)求后,系統(tǒng)首先會(huì)判斷用戶請(qǐng)求的數(shù)據(jù)是否在緩存中,如果在緩存中命中,那么系統(tǒng)直接從內(nèi)存對(duì)象緩存系統(tǒng)中將數(shù)據(jù)返回給用戶并結(jié)束此次訪問操作;
如果未在內(nèi)存對(duì)象緩存系統(tǒng)中命中,那么此時(shí)監(jiān)控系統(tǒng)會(huì)根據(jù)當(dāng)前系統(tǒng)的CPU,內(nèi)存的使用情況,以及當(dāng)前發(fā)生的I/O情況來判斷是否開啟預(yù)讀功能,如果當(dāng)前系統(tǒng)性能不佳,則監(jiān)控系統(tǒng)會(huì)關(guān)閉系統(tǒng)的預(yù)讀功能,并直接訪問后臺(tái)數(shù)據(jù)庫(kù),將用戶請(qǐng)求的數(shù)據(jù)添加到內(nèi)存對(duì)象緩存系統(tǒng)后返回用戶請(qǐng)求的數(shù)據(jù)給用戶;
如果當(dāng)前系統(tǒng)開啟了預(yù)讀功能,此時(shí),系統(tǒng)會(huì)首先根據(jù)當(dāng)前系統(tǒng)運(yùn)行的狀態(tài),緩存命中率以及用戶請(qǐng)求的數(shù)據(jù)量的大小來確定預(yù)讀窗口的大小,然后,系統(tǒng)從數(shù)據(jù)庫(kù)中獲取用戶請(qǐng)求的數(shù)據(jù)并將其添加到待緩存隊(duì)列中,接下來,系統(tǒng)會(huì)判斷加入到隊(duì)列中的數(shù)據(jù)數(shù)據(jù)量是否小于預(yù)讀窗口的大小,如果待緩存隊(duì)列中數(shù)據(jù)已經(jīng)大于預(yù)讀窗口的大小,那么系統(tǒng)直接將待緩存隊(duì)列中的數(shù)據(jù)添加到緩存中并返回用戶請(qǐng)求的數(shù)據(jù)。
如果隊(duì)列中的數(shù)據(jù)小于當(dāng)前系統(tǒng)的預(yù)讀窗口大小,則系統(tǒng)會(huì)判斷當(dāng)前待緩存隊(duì)列中的最新數(shù)據(jù)是否在數(shù)據(jù)庫(kù)中與其他表中數(shù)據(jù)存在關(guān)聯(lián),如果存在關(guān)聯(lián)關(guān)系,那么系統(tǒng)將會(huì)把相關(guān)聯(lián)的數(shù)據(jù)加入到待緩存隊(duì)列中。接下來如果加入關(guān)聯(lián)數(shù)據(jù)后的隊(duì)列依然小于預(yù)讀窗口的大小,系統(tǒng)會(huì)繼續(xù)尋找相關(guān)聯(lián)的數(shù)據(jù),直至隊(duì)列中的數(shù)據(jù)大于預(yù)讀窗口的大小或者隊(duì)列中的數(shù)據(jù)已經(jīng)再無相關(guān)聯(lián)的數(shù)據(jù),一旦隊(duì)列中的數(shù)據(jù)大于預(yù)讀窗口的大小,系統(tǒng)就會(huì)將待緩存隊(duì)列中的數(shù)據(jù)添加到內(nèi)存對(duì)象緩存系統(tǒng)中,并返回用戶需要的數(shù)據(jù)。如果隊(duì)列中的數(shù)據(jù)已經(jīng)不存在關(guān)聯(lián)關(guān)系,但是依然小于預(yù)讀窗口的大小,那么系統(tǒng)就會(huì)從隊(duì)列中獲取最新數(shù)據(jù)所在表中的最新N條記錄并添加到待緩存隊(duì)列中,如果最新的N條數(shù)據(jù)在待緩存隊(duì)列中已經(jīng)存在,則繼續(xù)獲取次新的記錄添加到待緩存隊(duì)列中。接下來,如此循環(huán),直至待緩存隊(duì)列中的數(shù)據(jù)大于預(yù)讀窗口的大小。
在這里,充分地利用了數(shù)據(jù)之間的關(guān)聯(lián)關(guān)系,盡可能的將和當(dāng)前數(shù)據(jù)相關(guān)聯(lián)的數(shù)據(jù)放入到緩存中。因?yàn)橄嚓P(guān)聯(lián)的數(shù)據(jù)在下次被訪問到的概率最大。
類似于微博和微信朋友圈,用戶最新發(fā)布的消息,近期被查看或者修改的可能性最大,而且當(dāng)前用戶進(jìn)行的某些操作,在接下來其他用戶進(jìn)行相同操作的可能性也極大,所以在本發(fā)明提出的數(shù)據(jù)預(yù)讀算法中,充分利用了數(shù)據(jù)和用戶操作的時(shí)間局部性原理(時(shí)間局部性:如果一個(gè)信息項(xiàng)正在被訪問,那么在近期它很可能還會(huì)被再次訪問),主動(dòng)的獲取用戶請(qǐng)求的數(shù)據(jù)所對(duì)應(yīng)的表中的最新數(shù)據(jù)添加到緩存中。
同時(shí),新添加入到緩存的數(shù)據(jù)默認(rèn)有效時(shí)間是6個(gè)小時(shí),如果在6個(gè)小時(shí)之內(nèi)該數(shù)據(jù)未被訪問,內(nèi)存對(duì)象緩存系統(tǒng)會(huì)自動(dòng)銷毀該數(shù)據(jù)占用的內(nèi)存并釋放相應(yīng)的空間。這樣做的目的是為了節(jié)省空間,并對(duì)數(shù)據(jù)預(yù)測(cè)算法的部分預(yù)測(cè)錯(cuò)誤預(yù)測(cè)進(jìn)行彌補(bǔ)。
在運(yùn)行預(yù)讀算法時(shí),需要考慮前端結(jié)點(diǎn)和后端結(jié)點(diǎn)的網(wǎng)絡(luò)負(fù)載情況。
在這里優(yōu)先考慮內(nèi)存對(duì)象緩存系統(tǒng)的緩存命中率和系統(tǒng)的運(yùn)行狀況,監(jiān)控的目的是在當(dāng)前系統(tǒng)運(yùn)行狀態(tài)下達(dá)到較大的緩存命中率,所以當(dāng)用戶請(qǐng)求穿透緩存時(shí),需要馬上確定系統(tǒng)CPU,內(nèi)存,I/O,當(dāng)前網(wǎng)絡(luò)的使用情況,以及緩存命中率的大小,并根據(jù)這些數(shù)據(jù)以及用戶發(fā)來的請(qǐng)求所對(duì)應(yīng)的數(shù)據(jù)特征來確定當(dāng)前預(yù)讀窗口的大??;所以每次用戶請(qǐng)求對(duì)應(yīng)的預(yù)讀窗口大小都是不同的。
經(jīng)過多次的實(shí)驗(yàn)測(cè)試,本發(fā)明根據(jù)系統(tǒng)的使用情況定義了系統(tǒng)的三個(gè)性能級(jí)別:L1,L2,L3 如下所示:
其中
user%:表示CPU處在用戶模式下的時(shí)間百分比。
sys%:表示CPU處在系統(tǒng)模式下的時(shí)間百分比。
free%:表示空閑內(nèi)存占系統(tǒng)總內(nèi)存的百分比。
IOPS: 每秒進(jìn)行讀寫(I/O)操作的次數(shù),每個(gè)硬盤設(shè)備都有一個(gè)最大值。
IO%:當(dāng)前每秒進(jìn)行讀寫(I/O)操作的次數(shù)相對(duì)最大IOPS的百分比。
bandwidth%:指當(dāng)前系統(tǒng)中使用的帶寬占總帶寬的百分比。
T :表示網(wǎng)絡(luò)延遲程度。
定義預(yù)讀窗口的基本單位為數(shù)據(jù)表中的一條記錄,記為R。比如用戶此次請(qǐng)求一共涉及到數(shù)據(jù)表中的10條記錄,那么,用戶此次請(qǐng)求的數(shù)據(jù)量為10R。并記用戶請(qǐng)求的數(shù)據(jù)對(duì)應(yīng)的數(shù)據(jù)量為R0。
在這里,本專利定義數(shù)據(jù)預(yù)讀窗口大小如下:
當(dāng)系統(tǒng)處于L1時(shí),預(yù)讀窗口大小為用戶請(qǐng)求數(shù)據(jù)量的4倍;如果命中率較低(低于70%),預(yù)讀窗口再擴(kuò)大2倍,即此時(shí)的預(yù)讀窗口大小為 R1 = R0 * 4 * 2;如果命中率較高(高于70%),那么此時(shí)預(yù)讀窗口的大小為R1=R0*4;
當(dāng)系統(tǒng)性能適中時(shí),即系統(tǒng)處于L2狀態(tài)下,預(yù)讀窗口大小為用戶請(qǐng)求數(shù)據(jù)量的2倍;如果命中率較低(低于70%),預(yù)讀窗口再擴(kuò)大2倍,即此時(shí)的預(yù)讀窗口大小為 R1 = R0 * 2* 2;如果命中率較高(高于70%),那么此時(shí)預(yù)讀窗口的大小為R1=R0*2;
當(dāng)系統(tǒng)性能極差時(shí),即系統(tǒng)處于L3狀態(tài)下,那么系統(tǒng)將關(guān)閉預(yù)讀功能,直接返回用戶請(qǐng)求的數(shù)據(jù)。
所以,預(yù)讀窗口大小計(jì)算公式如下:
L1狀態(tài)下:
緩存命中率較低時(shí):R1=R0*4*2;
緩存命中率較高時(shí):R1=R0*4;
L2狀態(tài)下:
緩存命中率較低時(shí):R1=R0*2*2;
緩存命中率較高時(shí):R1=R0*2;
L3狀態(tài)下:關(guān)閉數(shù)據(jù)預(yù)讀功能。在L3狀態(tài)下,監(jiān)控系統(tǒng)會(huì)主動(dòng)清理不必要的進(jìn)程,釋放內(nèi)存空間,并去掉不必要的I/O操作來對(duì)系統(tǒng)進(jìn)行優(yōu)化,以及釋放一些網(wǎng)絡(luò)資源,從而達(dá)到可以再次開啟預(yù)讀功能的條件。
由此可見,被用來填充內(nèi)存對(duì)象緩存系統(tǒng)的數(shù)據(jù),與系統(tǒng)當(dāng)前的運(yùn)行狀態(tài),緩存命中率以及用戶發(fā)出請(qǐng)求所對(duì)應(yīng)的數(shù)據(jù)量的大小有著極大的關(guān)系,用來填充內(nèi)存對(duì)象緩存系統(tǒng)的數(shù)據(jù)具有極大的動(dòng)態(tài)特性。
基于內(nèi)存對(duì)象的緩存系統(tǒng)的數(shù)據(jù)預(yù)讀方法,適用于傳統(tǒng)數(shù)據(jù)庫(kù)和內(nèi)存數(shù)據(jù)庫(kù)系統(tǒng)的結(jié)合場(chǎng)景,而且重點(diǎn)在于引入了數(shù)據(jù)預(yù)讀算法后,如何在保持系統(tǒng)較高性能的情況下在內(nèi)存對(duì)象緩存系統(tǒng)達(dá)到較高的緩存命中率。本發(fā)明的實(shí)現(xiàn)方法可以充分的應(yīng)用于實(shí)際系統(tǒng)中,具有較好的前景和實(shí)用性。
以上所述實(shí)施例僅表達(dá)了本發(fā)明的幾種實(shí)施方式,其描述較為具體和詳細(xì),但并不能因此而理解為對(duì)本發(fā)明專利范圍的限制。應(yīng)當(dāng)指出的是,對(duì)于本領(lǐng)域的普通技術(shù)人員來說,在不脫離本發(fā)明構(gòu)思的前提下,還可以做出若干變形和改進(jìn),這些都屬于本發(fā)明的保護(hù)范圍。因此,本發(fā)明專利的保護(hù)范圍應(yīng)以所附權(quán)利要求為準(zhǔn)。