一種面向分布式順序表的緩存方法及系統(tǒng)的制作方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及分布式信息處理技術(shù)領(lǐng)域,尤其涉及一種面向分布式順序表的緩存方法及系統(tǒng)。
【背景技術(shù)】
[0002]NoSQL現(xiàn)有的緩存系統(tǒng)一般采用LRU緩存算法或者由LRU緩存算法改進(jìn)而來的算法,如下所示:
[0003]LRU算法:LRU算法是根據(jù)對數(shù)據(jù)的歷史訪問記錄來確定換入換出數(shù)據(jù)的策略,基本思想是:數(shù)據(jù)在最近被訪問過,在未來會被訪問的概率就更高,在具體實(shí)現(xiàn)中,一般使用LinkedList作為存儲容器,緩存對象在被訪問后將被重新放到緩存頂部,在換出對象時(shí)則從緩存底部開始,算法具體流程如下:(I)新緩存對象總是被放到緩存頂部;(2)當(dāng)緩存中的緩存對象被訪問后,緩存對象將被移到緩存頂部,這樣緩存中的緩存對象總是按照最新的訪問時(shí)間排序;(3)當(dāng)緩存空間不足時(shí),根據(jù)需要釋放的空間大小,從緩存底部開始換出緩存對象。
[0004]Two Queues算法:Two Queues算法的基本思想是同時(shí)考慮時(shí)間、頻率兩個(gè)因素,利用分層的思想,將緩存分為LI和L2兩層,兩層均采用LRU緩存,算法具體流程如下:(I)當(dāng)新的緩存對象換入時(shí),首先進(jìn)入LI層,如果LI層中的緩存對象再次被訪問后,則將該緩存對象換入更大的L2層;(2)在需要換出數(shù)據(jù)時(shí),首先換出LI中的數(shù)據(jù),如果空間還是不足,再換出L2中的數(shù)據(jù)。
[0005]分布式順序表的典型緩存算法(BucketCache):HBase是應(yīng)用廣泛的典型分布式順序表,其使用的緩存算法是Two Queues的變型--BucketCache,Two Queues中,緩存被分為了 LI和L2兩層,但是在HBase使用的算法中,將緩存分為了 3層,即Single、Multi和InMemory,存算法流程如下:(I)在緩存新數(shù)據(jù)時(shí),如果數(shù)據(jù)被標(biāo)記為InMemory,則直接緩存都InMemory中,否則跟Two Queues中的處理方式一樣,先進(jìn)入Single,被訪問后再進(jìn)入Multi ; (2)在換出數(shù)據(jù)時(shí),則優(yōu)先換出Single中的數(shù)據(jù),其次是Multi,最后是InMemory。
[0006]上面提到的各種算法都是基于過去對數(shù)據(jù)的訪問歷史來確定換入換出策略的,但是僅僅基于數(shù)據(jù)的訪問歷史是很難準(zhǔn)確預(yù)測未來的,從而造成緩存命中率較低,緩存的數(shù)據(jù)讀取通量不高,因此,要進(jìn)一步提高緩存的命中率需要考慮利用一些其他的信息,在分布式順序表的具體實(shí)現(xiàn)中,可以利用查詢操作的訪問模式特征來提高緩存的命中率。
【發(fā)明內(nèi)容】
[0007]針對現(xiàn)有技術(shù)的不足,本發(fā)明提出一種面向分布式順序表的緩存方法及系統(tǒng)。
[0008]本發(fā)明提出一種面向分布式順序表的緩存方法,包括:
[0009]步驟I,為所有數(shù)據(jù)塊設(shè)置基礎(chǔ)分值,當(dāng)進(jìn)行數(shù)據(jù)查詢操作時(shí),通過分布式順序表,獲取數(shù)據(jù)查詢操作所涉及的數(shù)據(jù)范圍,統(tǒng)計(jì)數(shù)據(jù)范圍中各數(shù)據(jù)塊將要被訪問的訪問次數(shù),將訪問次數(shù)累加到相應(yīng)的數(shù)據(jù)塊;
[0010]步驟2,當(dāng)數(shù)據(jù)塊被緩存命中時(shí),被命中的數(shù)據(jù)塊的分值減去固定值,當(dāng)緩存空間已滿時(shí),則觸發(fā)緩存的換出操作,在換出操作開始時(shí),根據(jù)數(shù)據(jù)塊的分值進(jìn)行排序,從分值最小的數(shù)據(jù)塊開始淘汰,直到緩存空間能夠增加數(shù)據(jù)塊。
[0011]所述的面向分布式順序表的緩存方法,所述步驟I包括:根據(jù)數(shù)據(jù)查詢操作的起始行鍵定位到所述行鍵所屬的區(qū)域,對每個(gè)區(qū)域下的所有文件按照起始行鍵在數(shù)據(jù)塊索引結(jié)構(gòu)上定位到第一個(gè)數(shù)據(jù)塊索引項(xiàng),從第一個(gè)數(shù)據(jù)塊索引項(xiàng)開始順序讀取直到終止行鍵所在的數(shù)據(jù)塊索引項(xiàng),獲取數(shù)據(jù)范圍的所有數(shù)據(jù)塊信息。
[0012]所述的面向分布式順序表的緩存方法,緩存未命中數(shù)據(jù)塊時(shí),則根據(jù)未命中數(shù)據(jù)塊的分值決定未命中數(shù)據(jù)塊是否換入緩存。
[0013]所述的面向分布式順序表的緩存方法,若數(shù)據(jù)塊的分值為0,則分值為O的數(shù)據(jù)塊在已知的未來不會再被讀取,則不再換入到緩存。
[0014]所述的面向分布式順序表的緩存方法,記錄各數(shù)據(jù)塊的分值并保存。
[0015]本發(fā)明還提出一種面向分布式順序表的緩存系統(tǒng),包括:
[0016]獲取數(shù)據(jù)范圍模塊,用于為所有數(shù)據(jù)塊設(shè)置基礎(chǔ)分值,當(dāng)進(jìn)行數(shù)據(jù)查詢操作時(shí),通過分布式順序表,獲取數(shù)據(jù)查詢操作所涉及的數(shù)據(jù)范圍,統(tǒng)計(jì)數(shù)據(jù)范圍中各數(shù)據(jù)塊將要被訪問的訪問次數(shù),將訪問次數(shù)累加到相應(yīng)的數(shù)據(jù)塊;
[0017]計(jì)算分值模塊,用于當(dāng)數(shù)據(jù)塊被緩存命中時(shí),被命中的數(shù)據(jù)塊的分值減去固定值,當(dāng)緩存空間已滿時(shí),則觸發(fā)緩存的換出操作,在換出操作開始時(shí),根據(jù)數(shù)據(jù)塊的分值進(jìn)行排序,從分值最小的數(shù)據(jù)塊開始淘汰,直到緩存空間能夠增加數(shù)據(jù)塊。
[0018]所述的面向分布式順序表的緩存系統(tǒng),所述獲取數(shù)據(jù)范圍模塊包括:根據(jù)數(shù)據(jù)查詢操作的起始行鍵定位到所述行鍵所屬的區(qū)域,對每個(gè)區(qū)域下的所有文件按照起始行鍵在數(shù)據(jù)塊索引結(jié)構(gòu)上定位到第一個(gè)數(shù)據(jù)塊索引項(xiàng),從第一個(gè)數(shù)據(jù)塊索引項(xiàng)開始順序讀取直到終止行鍵所在的數(shù)據(jù)塊索引項(xiàng),獲取數(shù)據(jù)范圍的所有數(shù)據(jù)塊信息。
[0019]所述的面向分布式順序表的緩存系統(tǒng),緩存未命中數(shù)據(jù)塊時(shí),則根據(jù)未命中數(shù)據(jù)塊的分值決定未命中數(shù)據(jù)塊是否換入緩存。
[0020]所述的面向分布式順序表的緩存系統(tǒng),若數(shù)據(jù)塊的分值為0,則分值為O的數(shù)據(jù)塊在已知的未來不會再被讀取,則不再換入到緩存。
[0021]所述的面向分布式順序表的緩存系統(tǒng),記錄分值模塊,用于記錄各數(shù)據(jù)塊的分值并保存。以下為本發(fā)明的整體技術(shù)效果:
[0022]本發(fā)明通過實(shí)驗(yàn)數(shù)據(jù)證明本發(fā)明的技術(shù)效果,如下所示:
[0023]緩存系統(tǒng)的對比主要是對比緩存的命中率和數(shù)據(jù)讀取通量,測試中選擇了對比不同線程數(shù)量和不同緩存空間/查詢結(jié)果集比例兩種情況,如下所示:
[0024]不同線程數(shù)量測試,圖1為命中率對比,本發(fā)明提出的方法及系統(tǒng)的命中率比BucketCache緩存提高了 15個(gè)百分點(diǎn)以上;圖2為讀取通量對比,本發(fā)明提出的方法計(jì)系統(tǒng)的讀取通量比BucketCache緩存提高了 20%以上。
[0025]不同緩存空間/查詢結(jié)果集比例測試,圖3為命中率對比,本發(fā)明提出的方法及系統(tǒng)的命中率比BucketCache緩存都提高了 16個(gè)百分點(diǎn)以上;圖4為讀取通量對比,本發(fā)明的方法及系統(tǒng)的讀取通量比BucketCache緩存提高了 24%以上。
【附圖說明】
[0026]圖1為不同線程數(shù)量的緩存命中率對比圖;
[0027]圖2為不同線程數(shù)量的緩存讀取通量對比圖;
[0028]圖3為不同緩存空間/查詢結(jié)果集比例的緩存命中率對比圖;
[0029]圖4為不同緩存空間/查詢結(jié)果集比例的緩存讀取通量對比圖;
[0030]圖5為緩存算法流程不意圖;
[0031]圖6為緩存系統(tǒng)架構(gòu)圖;
[0032]圖7為ScoreManager模塊的計(jì)分管理結(jié)構(gòu)圖;
【具體實(shí)施方式】
[0033]針對現(xiàn)有技術(shù)的不足,本發(fā)明提出一種面向分布式順序表的緩存方法及系統(tǒng),本發(fā)明通過分布式順序表特有的存儲結(jié)構(gòu)來獲取每個(gè)查詢所涉及的數(shù)據(jù)范圍信息,然后利用這些信息并結(jié)合數(shù)據(jù)被訪問的情況來構(gòu)建每個(gè)數(shù)據(jù)的實(shí)時(shí)動態(tài)得分,該得分代表了對應(yīng)的數(shù)據(jù)在未來會被訪問的次數(shù),訪問次數(shù)越多越應(yīng)該保留在緩存中,最后利用每個(gè)數(shù)據(jù)的得分來指導(dǎo)數(shù)據(jù)的換入換出策略,以下為本發(fā)明方法詳細(xì)步驟,如下所示:
[0034]本發(fā)明方法包括:
[0035]步驟I,為所有數(shù)據(jù)塊設(shè)置基礎(chǔ)分值(此基礎(chǔ)分值不做限制,可以為任意整數(shù)),當(dāng)進(jìn)行數(shù)據(jù)查詢操作時(shí),通過分布式順序表,獲取數(shù)據(jù)查詢操作所涉及的數(shù)據(jù)范圍,統(tǒng)計(jì)數(shù)據(jù)范圍中各數(shù)據(jù)塊將要被訪問的訪問次數(shù),將訪問次數(shù)累加到相應(yīng)的數(shù)據(jù)塊,隨著查詢不斷地提交和執(zhí)行,不斷地有DataBlock(數(shù)據(jù)塊)需要訪問,同時(shí)也有DataBlock已經(jīng)訪問過了,這是一個(gè)動態(tài)的過程,而得分代表的是某一時(shí)刻各個(gè)DataBlock在未來一段時(shí)間內(nèi)被訪問的情況;
[0036]步驟2,當(dāng)數(shù)據(jù)塊被緩存命中時(shí),被命中的數(shù)據(jù)塊的分值減去固定值(此固定值不做限制,可以為1、2、3等整數(shù)),當(dāng)緩存空間已滿時(shí),則觸發(fā)緩存的換出操作,在換出操作開始時(shí),根據(jù)數(shù)據(jù)塊的分值進(jìn)行排序,從分值最小的數(shù)據(jù)塊開始淘汰,直到緩存空間能夠增加數(shù)據(jù)塊,其中記錄各數(shù)據(jù)塊的分值并保存。
[0037]所述步驟I包括:根據(jù)數(shù)據(jù)查詢操作的起始行鍵定位到所述行鍵所屬的區(qū)域,對每個(gè)區(qū)域下的所有文件按照起始行鍵在數(shù)據(jù)塊索引結(jié)構(gòu)上定位到第一個(gè)數(shù)據(jù)塊索引項(xiàng),從第一個(gè)數(shù)據(jù)塊索引項(xiàng)開始順序讀取直到終止行鍵所在的數(shù)據(jù)塊索引項(xiàng),獲取數(shù)據(jù)范圍的所有數(shù)據(jù)塊信息。
[0038]緩存未命中數(shù)據(jù)塊時(shí),則根據(jù)未命中數(shù)據(jù)塊的