本發(fā)明涉及數(shù)據(jù)處理技術(shù)領(lǐng)域,特別涉及一種關(guān)系數(shù)據(jù)緩存及查詢方法及裝置。
背景技術(shù):
計(jì)算機(jī)硬件技術(shù)的數(shù)據(jù)交換緩沖區(qū)一般為介于內(nèi)存和CPU之間的存儲模塊,先于內(nèi)存,使得CPU能快速訪問需要的數(shù)據(jù)。軟件技術(shù)中的緩存一般為在內(nèi)存和固態(tài)硬盤中開辟一片區(qū)域,存儲一些經(jīng)常被訪問的數(shù)據(jù),用來補(bǔ)充內(nèi)存的不同以及磁盤訪問過慢的問題。
目前主流的緩存系統(tǒng)有Memcache d系統(tǒng)和Redis系統(tǒng)。Memcached系統(tǒng)基于Key-Value進(jìn)行數(shù)據(jù)緩存,Key-Value是一種鍵值Key和數(shù)據(jù)Value存儲與訪問方式,比如<1,a>,<2,b>可以通過鍵值1和2,訪問數(shù)據(jù)a和b。Redis系統(tǒng)除了支持Key-Value進(jìn)行數(shù)據(jù)緩存,還可以支持一些基于其他方式的數(shù)據(jù)緩存,例如基于字符串的、哈希表的,列表的、集合的和有序集的。但是上述各數(shù)據(jù)緩存方式雖然簡單,但是對于一些復(fù)雜情況,例如關(guān)系數(shù)據(jù)庫的緩存和查詢場景,Memcached系統(tǒng)和Redis系統(tǒng)就沒辦法滿足關(guān)系數(shù)據(jù)庫的查詢需求。
HBase數(shù)據(jù)庫是一個(gè)分布式的、面向列的開源數(shù)據(jù)庫。但HBase數(shù)據(jù)庫是一個(gè)基于外存的數(shù)據(jù)庫,該數(shù)據(jù)庫緩存數(shù)據(jù)的載體依然是磁盤,雖然有少量數(shù)據(jù)可以緩存到內(nèi)存,但當(dāng)讀取的數(shù)據(jù)超過了內(nèi)存緩存的數(shù)據(jù)量時(shí),讀取性能將會明顯下降。另外,對于Hbase數(shù)據(jù)庫而言,在進(jìn)行關(guān)系數(shù)據(jù)緩存時(shí),關(guān)系數(shù)據(jù)需要存儲到不同的列中,在現(xiàn)有的緩存系統(tǒng)中,針對每個(gè)列都設(shè)置對應(yīng)的Key-Value,因此造成了Key的冗余,造成存儲空間的浪費(fèi)。另外,在進(jìn)行數(shù)據(jù)存儲和查找時(shí),只能通過Key找Value,而無法實(shí)現(xiàn)整個(gè)關(guān)系數(shù)據(jù)的查找。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明實(shí)施例公開了一種關(guān)系數(shù)據(jù)緩存及查詢方法及裝置,用以提高關(guān)系數(shù)據(jù)的緩存效率,并提高內(nèi)存資源的利用率。
為達(dá)到上述目的,本發(fā)明實(shí)施例公開了一種關(guān)系數(shù)據(jù)緩存方法,應(yīng)用于電子設(shè)備,該方法包括:
接收待緩存的關(guān)系數(shù)據(jù),其中所述關(guān)系數(shù)據(jù)中至少包括一個(gè)關(guān)聯(lián)子數(shù)據(jù);
根據(jù)每個(gè)關(guān)聯(lián)子數(shù)據(jù)與列簇中每列的對應(yīng)關(guān)系,將每個(gè)關(guān)聯(lián)子數(shù)據(jù)緩存到對應(yīng)的列中;并
根據(jù)每列是否緩存了該關(guān)系數(shù)據(jù),更新位圖索引中對應(yīng)行的位圖標(biāo)識。
進(jìn)一步地,所述將每個(gè)關(guān)聯(lián)子數(shù)據(jù)緩存到對應(yīng)的列中后,所述方法還包括:
針對每列,判斷該列對應(yīng)的過濾器中是否保存有該關(guān)聯(lián)子數(shù)據(jù),如果不存在,則將該關(guān)聯(lián)子數(shù)據(jù)的信息添加到所述過濾器中。
進(jìn)一步地,所述將每個(gè)關(guān)聯(lián)子數(shù)據(jù)緩存到對應(yīng)的列中后,所述方法還包括:
針對每列,根據(jù)該關(guān)聯(lián)子數(shù)據(jù)緩存的行所在的分區(qū),判斷該列在該分區(qū)中對應(yīng)的過濾器中是否保存有該關(guān)聯(lián)子數(shù)據(jù),如果不存在,則將該關(guān)聯(lián)子數(shù)據(jù)的信息添加到所述過濾器中。
進(jìn)一步地,不同的分區(qū)位于同一電子設(shè)備,或不同的電子設(shè)備。
進(jìn)一步地,所述將每個(gè)關(guān)聯(lián)子數(shù)據(jù)緩存到對應(yīng)的列中包括:
針對每列,識別該列對應(yīng)的緩存數(shù)據(jù)的長度是否固定;
如果是,直接在該列中緩存該關(guān)聯(lián)子數(shù)據(jù);
如果否,則根據(jù)該列對應(yīng)的數(shù)據(jù)長度,將該列對應(yīng)的關(guān)聯(lián)子數(shù)據(jù)轉(zhuǎn)換為該數(shù)據(jù)長度,并在該列中緩存該轉(zhuǎn)換后的關(guān)聯(lián)子數(shù)據(jù)。
進(jìn)一步地,所述方法還包括:
按照設(shè)定的時(shí)間間隔,將緩存的關(guān)系數(shù)據(jù)同步到其他系統(tǒng)。
進(jìn)一步地,所述關(guān)系數(shù)據(jù)緩存在所述電子設(shè)備的內(nèi)存或固態(tài)硬盤上。
本發(fā)明實(shí)施例提供了一種基于上述關(guān)系數(shù)據(jù)緩存方法的關(guān)系數(shù)據(jù)查詢方法,應(yīng)用于電子設(shè)備,該方法包括:
接收待查詢的數(shù)據(jù),其中所述數(shù)據(jù)為關(guān)系數(shù)據(jù),或關(guān)系數(shù)據(jù)中的至少一項(xiàng) 關(guān)聯(lián)子數(shù)據(jù);
將所述數(shù)據(jù)拆分為至少一項(xiàng)關(guān)聯(lián)子數(shù)據(jù);
針對每項(xiàng)關(guān)聯(lián)子數(shù)據(jù),根據(jù)緩存該項(xiàng)關(guān)聯(lián)子數(shù)據(jù)的列,判斷該列緩存的關(guān)聯(lián)子數(shù)據(jù)中是否存在該關(guān)聯(lián)子數(shù)據(jù);如果是,根據(jù)所述關(guān)聯(lián)子數(shù)據(jù)所在的位置,查找位圖索引中該位置對應(yīng)行的位圖標(biāo)識,并根據(jù)所述行的位圖標(biāo)識,在對應(yīng)的每列相應(yīng)位置提取其他關(guān)聯(lián)子數(shù)據(jù),并組合為關(guān)系數(shù)據(jù);
將針對每個(gè)關(guān)聯(lián)子數(shù)據(jù)組合得到的關(guān)第一數(shù)量聯(lián)數(shù)據(jù)的交集作為查詢結(jié)果。
進(jìn)一步地,所述根據(jù)所述關(guān)聯(lián)子數(shù)據(jù)所在的位置,查找位圖索引中該位置對應(yīng)行的位圖標(biāo)識包括:
根據(jù)該關(guān)聯(lián)子數(shù)據(jù)在該列中緩存的行的行數(shù),在所述位圖索引中根據(jù)緩存有關(guān)聯(lián)子數(shù)據(jù)的第一位圖標(biāo)識,查找第一數(shù)量的第一位圖標(biāo)識所在位圖索引的行的標(biāo)識信息,并查找所述行中針對每列的位圖標(biāo)識,其中所述第一數(shù)量為所述行數(shù);
所述根據(jù)所述行的位圖標(biāo)識,在對應(yīng)的每列相應(yīng)位置提取其他關(guān)聯(lián)子數(shù)據(jù)包括:
根據(jù)所述位圖索引所述行中的每個(gè)第一位圖標(biāo)識,根據(jù)所述第一位圖標(biāo)識所在的列,針對該列,按照從前往后的順序識別所述列中從開始到所述行中出現(xiàn)第一位圖標(biāo)識的次數(shù),在相應(yīng)的列中提取該對應(yīng)次數(shù)的行中緩存的其他關(guān)聯(lián)子數(shù)據(jù)。
進(jìn)一步地,所述判斷該列緩存的關(guān)聯(lián)子數(shù)據(jù)中是否存在該關(guān)聯(lián)子數(shù)據(jù)包括:
針對每列,在該列對應(yīng)的過濾器中,判斷該列存儲的關(guān)聯(lián)子數(shù)據(jù)的信息中是否存在該關(guān)聯(lián)子數(shù)據(jù)。
進(jìn)一步地,所述判斷該列緩存的關(guān)聯(lián)子數(shù)據(jù)中是否存在該關(guān)聯(lián)子數(shù)據(jù)包括:
針對每個(gè)分區(qū)中的每列,在該列對應(yīng)的每個(gè)過濾器中,判斷該列存儲的關(guān)聯(lián)子數(shù)據(jù)的信息中是否存在該關(guān)聯(lián)子數(shù)據(jù)。
本發(fā)明實(shí)施例提供了一種關(guān)系數(shù)據(jù)緩存裝置,應(yīng)用于電子設(shè)備,該裝置包 括:
接收模塊,用于接收待緩存的關(guān)系數(shù)據(jù),其中所述關(guān)系數(shù)據(jù)中至少包括一個(gè)關(guān)聯(lián)子數(shù)據(jù);
緩存模塊,用于根據(jù)每個(gè)關(guān)聯(lián)子數(shù)據(jù)與列簇中每列的對應(yīng)關(guān)系,將每個(gè)關(guān)聯(lián)子數(shù)據(jù)緩存到對應(yīng)的列中;
更新模塊,用于根據(jù)每列是否緩存了該關(guān)系數(shù)據(jù),更新位圖索引中對應(yīng)行的位圖標(biāo)識。
進(jìn)一步地,所述裝置還包括:
過濾模塊,用于針對每列,判斷該列對應(yīng)的過濾器中是否保存有該關(guān)聯(lián)子數(shù)據(jù),如果不存在,則將該關(guān)聯(lián)子數(shù)據(jù)的信息添加到所述過濾器中。
進(jìn)一步地,所述裝置還包括:
過濾模塊,針對每列,根據(jù)該關(guān)聯(lián)子數(shù)據(jù)緩存的行所在的分區(qū),判斷該列在該分區(qū)中對應(yīng)的過濾器中是否保存有該關(guān)聯(lián)子數(shù)據(jù),如果不存在,則將該關(guān)聯(lián)子數(shù)據(jù)的信息添加到所述過濾器中。
進(jìn)一步地,所述緩存模塊,具體用于針對每列,識別該列對應(yīng)的緩存數(shù)據(jù)的長度是否固定;如果是,直接在該列中緩存該關(guān)聯(lián)子數(shù)據(jù);如果否,則根據(jù)該列對應(yīng)的數(shù)據(jù)長度,將該列對應(yīng)的關(guān)聯(lián)子數(shù)據(jù)轉(zhuǎn)換為該數(shù)據(jù)長度,并在該列中緩存該轉(zhuǎn)換后的關(guān)聯(lián)子數(shù)據(jù)。
進(jìn)一步地,所述裝置還包括:
同步模塊,用于按照設(shè)定的時(shí)間間隔,將緩存的關(guān)系數(shù)據(jù)同步到其他系統(tǒng)。
本發(fā)明實(shí)施例提供了一種基于上述關(guān)系數(shù)據(jù)緩存裝置的關(guān)系數(shù)據(jù)查詢裝置,應(yīng)用于電子設(shè)備,該裝置包括:
接收模塊,用于接收待查詢的數(shù)據(jù),其中所述數(shù)據(jù)為關(guān)系數(shù)據(jù),或關(guān)系數(shù)據(jù)中的至少一項(xiàng)關(guān)聯(lián)子數(shù)據(jù);
拆分模塊,用于將所述數(shù)據(jù)拆分為至少一項(xiàng)關(guān)聯(lián)子數(shù)據(jù);
查找模塊,用于針對每項(xiàng)關(guān)聯(lián)子數(shù)據(jù),根據(jù)緩存該項(xiàng)關(guān)聯(lián)子數(shù)據(jù)的列,判 斷該列緩存的關(guān)聯(lián)子數(shù)據(jù)中是否存在該關(guān)聯(lián)子數(shù)據(jù);如果是,根據(jù)所述關(guān)聯(lián)子數(shù)據(jù)所在的位置,查找位圖索引中該位置對應(yīng)行的位圖標(biāo)識,并根據(jù)所述行的位圖標(biāo)識,在對應(yīng)的每列相應(yīng)位置提取其他關(guān)聯(lián)子數(shù)據(jù),并組合為關(guān)系數(shù)據(jù);
提供模塊,用于將針對每個(gè)關(guān)聯(lián)子數(shù)據(jù)組合得到的關(guān)系數(shù)據(jù)的交集作為查詢結(jié)果。
進(jìn)一步地,所述查找模塊,具體用于根據(jù)該關(guān)聯(lián)子數(shù)據(jù)在該列中緩存的行的行數(shù),在所述位圖索引中根據(jù)緩存有關(guān)聯(lián)子數(shù)據(jù)的第一位圖標(biāo)識,查找該第一數(shù)量的第一位圖標(biāo)識所在位圖索引的行的標(biāo)識信息,并查找所述行中針對每列的位圖標(biāo)識,其中所述第一數(shù)量為所述行數(shù);根據(jù)所述位圖索引所述行中的每個(gè)第一位圖標(biāo)識,根據(jù)所述第一位圖標(biāo)識所在的列,針對該列,按照從前往后的順序識別所述列中從開始到所述行中出現(xiàn)第一位圖標(biāo)識的次數(shù),在相應(yīng)的列中提取該對應(yīng)次數(shù)的行中緩存的其他關(guān)聯(lián)子數(shù)據(jù)。
進(jìn)一步地,所述查找模塊,具體用于針對每列,在該列對應(yīng)的過濾器中,判斷該列存儲的關(guān)聯(lián)子數(shù)據(jù)的信息中是否存在該關(guān)聯(lián)子數(shù)據(jù)。
進(jìn)一步地,所述查找模塊,具體用于針對每個(gè)分區(qū)中的每列,在該列對應(yīng)的每個(gè)過濾器中,判斷該列存儲的關(guān)聯(lián)子數(shù)據(jù)的信息中是否存在該關(guān)聯(lián)子數(shù)據(jù)。
本發(fā)明實(shí)施例提供了一種關(guān)系數(shù)據(jù)緩存及查詢方法及裝置,該緩存方法包括:接收到待緩存的關(guān)系數(shù)據(jù)后,根據(jù)每個(gè)關(guān)聯(lián)子數(shù)據(jù)與列簇中每列的對應(yīng)關(guān)系,將每個(gè)關(guān)聯(lián)子數(shù)據(jù)緩存到對應(yīng)的列中,并根據(jù)每列是否緩存了該關(guān)系數(shù)據(jù),更新位圖索引中對應(yīng)行的位圖標(biāo)識。由于在本發(fā)明實(shí)施例中基于位圖索引和每列的對應(yīng)關(guān)系表,進(jìn)行關(guān)系數(shù)據(jù)緩存,并且關(guān)系數(shù)據(jù)被劃分為多個(gè)關(guān)聯(lián)子數(shù)據(jù),分別進(jìn)行緩存,因此提高了關(guān)系數(shù)據(jù)的緩存效率,并且該方法應(yīng)用于電子設(shè)備的內(nèi)存,提高了內(nèi)存的利用率。
附圖說明
為了更清楚地說明本發(fā)明實(shí)施例或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對實(shí)施例或現(xiàn)有技術(shù)描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明的一些實(shí)施例,對于本領(lǐng)域普通技術(shù)人員來講,在不付出創(chuàng)造性勞動(dòng)的前提下,還可以根據(jù)這些附圖獲得其他的附圖。
圖1為本發(fā)明實(shí)施例提供的一種關(guān)系數(shù)據(jù)的緩存過程;
圖2為本發(fā)明實(shí)施例提供的一種關(guān)系數(shù)據(jù)緩存中列簇表、位圖索引及每列的具體結(jié)構(gòu)示意圖;
圖3為本發(fā)明一個(gè)實(shí)施例提供的關(guān)系數(shù)據(jù)的緩存過程;
圖4為本發(fā)明實(shí)施例提供的基于上述緩存方式的一種關(guān)系數(shù)據(jù)查詢過程;
圖5為本發(fā)明實(shí)施例提供的另一種關(guān)系數(shù)據(jù)緩存中列簇表、位圖索引及每列的具體結(jié)構(gòu)示意圖;
圖6為本發(fā)明實(shí)施例提供的關(guān)系數(shù)據(jù)緩存裝置結(jié)構(gòu)示意圖;
圖7為本發(fā)明實(shí)施例提供的基于圖6所示關(guān)系數(shù)據(jù)緩存裝置的關(guān)系數(shù)據(jù)查詢裝置結(jié)構(gòu)示意圖。
具體實(shí)施方式
為了提高關(guān)系數(shù)據(jù)的緩存效率,充分利用內(nèi)存資源,本發(fā)明實(shí)施例提供了一種關(guān)系數(shù)據(jù)緩存及查詢方法及裝置。
下面將結(jié)合本發(fā)明實(shí)施例中的附圖,對本發(fā)明實(shí)施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實(shí)施例僅僅是本發(fā)明一部分實(shí)施例,而不是全部的實(shí)施例?;诒景l(fā)明中的實(shí)施例,本領(lǐng)域普通技術(shù)人員在沒有作出創(chuàng)造性勞動(dòng)前提下所獲得的所有其他實(shí)施例,都屬于本發(fā)明保護(hù)的范圍。
圖1為本發(fā)明實(shí)施例提供的一種關(guān)系數(shù)據(jù)的緩存過程,該過程包括以下步驟:
S101:接收待緩存的關(guān)系數(shù)據(jù),其中所述關(guān)系數(shù)據(jù)中至少包括一個(gè)關(guān)聯(lián)子數(shù)據(jù)。
本發(fā)明實(shí)施例提供的關(guān)系數(shù)據(jù)的緩存過程應(yīng)用于電子設(shè)備,該電子設(shè)備可以是服務(wù)器、PC等進(jìn)行數(shù)據(jù)緩存的設(shè)備。
關(guān)系數(shù)據(jù)中指包括至少一個(gè)關(guān)聯(lián)子數(shù)據(jù)的數(shù)據(jù),該至少一個(gè)關(guān)聯(lián)子數(shù)據(jù)相互關(guān)聯(lián)對該數(shù)據(jù)進(jìn)行描述,例如關(guān)聯(lián)子數(shù)據(jù)可以分別為:張三、男、28歲,或者李四、女、49公斤,或者馬五、健康,或者只有姓名等等。
在本發(fā)明實(shí)施例中對于緩存的是哪種關(guān)系數(shù)據(jù)是已知的,該關(guān)系數(shù)據(jù)包括哪幾個(gè)關(guān)聯(lián)子數(shù)據(jù)也是已知的。每個(gè)待緩存的關(guān)系數(shù)據(jù)中,可以包括該關(guān)系數(shù)據(jù)的全部關(guān)聯(lián)子數(shù)據(jù),或者只包括部分關(guān)聯(lián)子數(shù)據(jù),例如該關(guān)系數(shù)據(jù)為包括姓名,性別和年齡的關(guān)聯(lián)子數(shù)據(jù)的數(shù)據(jù),則該待緩存的關(guān)系數(shù)據(jù)可以只包括其中的一個(gè)關(guān)聯(lián)子數(shù)據(jù),例如姓名,或者性別;或者包括兩個(gè)關(guān)聯(lián)子數(shù)據(jù),例如包括姓名和性別,或者姓名和年齡等;當(dāng)然該關(guān)系數(shù)據(jù)也可以同時(shí)包括該三個(gè)關(guān)聯(lián)子數(shù)據(jù)。在具體使用時(shí),可以根據(jù)需求進(jìn)行緩存。
S102:根據(jù)每個(gè)關(guān)聯(lián)子數(shù)據(jù)與緩存列的對應(yīng)關(guān)系,將每個(gè)關(guān)聯(lián)子數(shù)據(jù)緩存到對應(yīng)的列中。
在本發(fā)明實(shí)施例中在進(jìn)行關(guān)系數(shù)據(jù)緩存時(shí),采用的是列式存儲。行式存儲是以行為數(shù)據(jù)緩存的處理對象,列式存儲是以縱向的列為數(shù)據(jù)緩存的處理對象。一般根據(jù)關(guān)系數(shù)據(jù)包含的關(guān)聯(lián)子數(shù)據(jù)的數(shù)量,確定進(jìn)行緩存的列的數(shù)量。還以上述例子為例進(jìn)行說明,關(guān)系數(shù)據(jù)為包括姓名,性別和年齡的關(guān)聯(lián)子數(shù)據(jù)的數(shù)據(jù),則進(jìn)行緩存的列的數(shù)量為3,該3個(gè)列可以構(gòu)成一個(gè)列簇。列簇是列式存儲中的概念,列簇中可以包括一個(gè)或兩個(gè)以上的列。
在對關(guān)系數(shù)據(jù)進(jìn)行緩存時(shí),可以預(yù)先獲知緩存的關(guān)系數(shù)據(jù)中都包括幾個(gè)關(guān)聯(lián)子數(shù)據(jù),以及哪幾個(gè)關(guān)聯(lián)子數(shù)據(jù),每個(gè)關(guān)聯(lián)子數(shù)據(jù)存儲到哪個(gè)列中也是可以預(yù)先設(shè)置的,因此可以將相應(yīng)的關(guān)聯(lián)子數(shù)據(jù)緩存到對應(yīng)列中。
S103:根據(jù)每列是否緩存了該關(guān)系數(shù)據(jù),更新位圖索引中將該行對應(yīng)的位圖標(biāo)識。
位圖索引可以對每列緩存的關(guān)聯(lián)子數(shù)據(jù)進(jìn)行標(biāo)識,即標(biāo)識每個(gè)關(guān)系數(shù)據(jù)的具體存儲位置,位圖索引也是由列和行構(gòu)成的,列的數(shù)量與緩存關(guān)系數(shù)據(jù)的列的數(shù)量相同,行的數(shù)量與緩存關(guān)系數(shù)據(jù)的列中包含的行的數(shù)量相同。具體的該位圖索引的同一行標(biāo)識的是同一個(gè)關(guān)系數(shù)據(jù)的各關(guān)聯(lián)子數(shù)據(jù)的存儲位圖,可以用位圖標(biāo)識進(jìn)行表示,比如1可以表示存儲了同一關(guān)系數(shù)據(jù)的某一關(guān)聯(lián)子數(shù)據(jù),0則表示未存儲該關(guān)系數(shù)據(jù)的關(guān)聯(lián)子數(shù)據(jù)。該位圖索引與對關(guān)系數(shù)據(jù)進(jìn)行緩存的列之間具有對應(yīng)的關(guān)聯(lián)關(guān)系,對關(guān)系數(shù)據(jù)進(jìn)行緩存的列的每行與位圖索引的每行相對應(yīng),即對關(guān)系數(shù)據(jù)進(jìn)行緩存的列中存在多少行,位圖索引中就有相同的行數(shù),且兩者每行之間一一對應(yīng)。
為了保證兩者之間的對應(yīng)關(guān)系,可以將位圖索引與對關(guān)系數(shù)據(jù)進(jìn)行緩存的列存儲在一起,也可以在位圖索引和對關(guān)系數(shù)據(jù)進(jìn)行緩存的列中建立一個(gè)指向?qū)Ψ降闹羔槨?/p>
在對關(guān)系數(shù)據(jù)進(jìn)行緩存時(shí),根據(jù)每列是否緩存了該關(guān)系數(shù)據(jù),更新位圖索引中將該行對應(yīng)的位圖標(biāo)識。具體的,在進(jìn)行緩存時(shí),可能某一關(guān)系數(shù)據(jù)并不包含所有的關(guān)聯(lián)子數(shù)據(jù),此時(shí)進(jìn)行緩存時(shí),該缺失的關(guān)聯(lián)子數(shù)據(jù)對應(yīng)的列中就沒有數(shù)據(jù)存入,因此將位圖索引中針對該列,將其對應(yīng)的位圖標(biāo)識更新為0,表示該關(guān)系數(shù)據(jù)未存入該列中,關(guān)系數(shù)據(jù)中存在的關(guān)聯(lián)子數(shù)據(jù)存入到對應(yīng)的列中時(shí),則在位圖索引中針對列,將其對應(yīng)的位圖標(biāo)識更新1,表示該關(guān)系數(shù)據(jù)緩存到了該列中。
為了實(shí)現(xiàn)關(guān)系數(shù)據(jù)的緩存,標(biāo)識位圖索引中每個(gè)行是否被占用,在本發(fā)明實(shí)施例中針對關(guān)系數(shù)據(jù)進(jìn)行緩存的列,可以設(shè)置該有對應(yīng)的ID表,在ID表中記錄有與其對應(yīng)的位圖索引中每行是否被占用的信息。ID表包含的行的數(shù)量與位圖索引包含的行的數(shù)量相同,并且ID表中記錄有每行的標(biāo)識信息,該標(biāo)識信息可以是該行的行數(shù)。另外,為了方便關(guān)系數(shù)據(jù)的緩存,在ID表中記錄有位圖索引中對應(yīng)的每行是否被占用的信息,例如01則表示位圖索引中對應(yīng)行被占用,00則表示位圖索引中對應(yīng)行未被占用。
因?yàn)樵诒景l(fā)明實(shí)施例中ID表中記錄的位圖索引對應(yīng)行被占用的信息,該行數(shù)與實(shí)際緩存的關(guān)系數(shù)據(jù)的數(shù)量是相同的,相應(yīng)的位圖索引中被占用的行的數(shù)量也與緩存的關(guān)系數(shù)據(jù)的數(shù)量是相同的,根據(jù)位圖索引中針對每列記錄的每行的位圖標(biāo)識,可以確定每列中緩存的關(guān)聯(lián)子數(shù)據(jù)的數(shù)量。
由于在本發(fā)明實(shí)施例中基于位圖索引和每列的對應(yīng)關(guān)系表,進(jìn)行關(guān)系數(shù)據(jù)緩存,并且關(guān)系數(shù)據(jù)被劃分為多個(gè)關(guān)聯(lián)子數(shù)據(jù),分別進(jìn)行緩存,因此提高了關(guān)系數(shù)據(jù)的緩存效率,并且該方法應(yīng)用于電子設(shè)備的內(nèi)存,提高了內(nèi)存的利用率。
本發(fā)明實(shí)施例提供的關(guān)系數(shù)據(jù)緩存方式,應(yīng)用于在電子設(shè)備的內(nèi)存或固態(tài)硬盤上進(jìn)行關(guān)系數(shù)據(jù)的緩存。相應(yīng)的以下各實(shí)施方式也都是可以應(yīng)用在電子設(shè)備的內(nèi)存或固態(tài)硬盤上的。
圖2為本發(fā)明實(shí)施例提供的一種關(guān)系數(shù)據(jù)緩存中ID表、位圖索引及每列的具體結(jié)構(gòu)示意圖。以圖2為例進(jìn)行說明,圖2中的ID所示即為ID表,ID表中 存在1、2、……k行,由于ID表與位圖索引相對應(yīng)的,在位圖索引中也存在k行。列簇中對該關(guān)系數(shù)據(jù)進(jìn)行緩存的列包含2個(gè)列,分別為A列和B列。為了對每列的占用情況進(jìn)行標(biāo)識,位圖索引中也設(shè)置有兩列,a列和b列,其中a列記錄A列中每個(gè)關(guān)聯(lián)子數(shù)據(jù)的存儲情況,b列記錄B列中每個(gè)關(guān)聯(lián)子數(shù)據(jù)的存儲情況。其中一個(gè)關(guān)系數(shù)據(jù)在該位圖索引中對應(yīng)一行。
如圖2所示,在位圖索引的第一行中記錄了位圖標(biāo)識1和1,說明第一個(gè)關(guān)系數(shù)據(jù)同時(shí)包括兩個(gè)關(guān)聯(lián)子數(shù)據(jù),該關(guān)聯(lián)子數(shù)據(jù)分別存儲到了A列的第一行和B列的第一行,第二行中記錄了位圖標(biāo)識1和0,說明第二個(gè)關(guān)系數(shù)據(jù)包括一個(gè)關(guān)聯(lián)子數(shù)據(jù),該關(guān)聯(lián)子數(shù)據(jù)存儲在了A列的第二行,第三行記錄了位圖標(biāo)識0和0,說明第三個(gè)關(guān)系數(shù)據(jù)未存儲在任何一列中,第四行記錄了位圖標(biāo)識1和1,說明第四個(gè)關(guān)系數(shù)據(jù)同時(shí)包括兩個(gè)關(guān)聯(lián)子數(shù)據(jù),該關(guān)聯(lián)子數(shù)據(jù)分別存儲到了A列的第三行和B列的第二行,依次類推,該位圖索引的第k行記錄了位圖標(biāo)識1和1,說明第k個(gè)關(guān)系數(shù)據(jù)同時(shí)包括兩個(gè)關(guān)聯(lián)子數(shù)據(jù),該關(guān)聯(lián)子數(shù)據(jù)分別存儲到了A列的第i行和B列的第j行,其中i為A列中存儲關(guān)聯(lián)子數(shù)據(jù)的數(shù)量,j為B列存儲關(guān)聯(lián)子數(shù)據(jù)的數(shù)量。
根據(jù)上述描述可知,對于ID表中的第k行,該行對應(yīng)的位圖索引中對應(yīng)行的位圖標(biāo)識的組合Bitmapk=(ak,bk),ak和bk為第k行中a列和b列的位圖標(biāo)識。對于ak,它是a列中第i個(gè)非零值,因此在確定ak對應(yīng)的為a列中的非零值數(shù)量時(shí),可以表示為P(ak)=i,對于bk,它是b列中第j個(gè)非零值,因此在確定bk對應(yīng)的為b列中的非零值數(shù)量時(shí),可以表示為P(bk)=j(luò)。相應(yīng)的對于A列,第i個(gè)數(shù)據(jù)Ai用位圖索引中第k行對應(yīng)的值標(biāo)識,對于B列,第j個(gè)數(shù)據(jù)Bj用位圖索引中第k行對應(yīng)的值標(biāo)識,上述各表直接的對應(yīng)關(guān)系可以表示為(IDK,Ai,Bj)為同一行數(shù)據(jù),并且P(ak)=i,P(bk)=j(luò)。
通過上述關(guān)系,可知對于上述各表中任意一行的任一一列的數(shù)值,都可能通過上述關(guān)系查找。
在本發(fā)明的另一個(gè)實(shí)施例中,為了實(shí)現(xiàn)關(guān)系數(shù)據(jù)的緩存,方便后續(xù)的查找,所述將每個(gè)關(guān)聯(lián)子數(shù)據(jù)緩存到對應(yīng)的列中后,所述方法還包括:
針對每列,判斷該列對應(yīng)的過濾器中是否保存有該關(guān)聯(lián)子數(shù)據(jù),如果不存在,則將該關(guān)聯(lián)子數(shù)據(jù)的信息添加到所述過濾器中。
針對每列都設(shè)置有過濾器,如圖2所示的Filter,在該過濾器中存儲有該列中緩存的關(guān)聯(lián)子數(shù)據(jù)的信息,具體的該關(guān)聯(lián)子數(shù)據(jù)的信息可以是該列中緩存的每個(gè)關(guān)聯(lián)子數(shù)據(jù),可以是該列緩存的關(guān)聯(lián)子數(shù)據(jù)滿足的相應(yīng)條件。因此當(dāng)在每列緩存了相應(yīng)的關(guān)聯(lián)子數(shù)據(jù)后,判斷過濾器是否保存有該關(guān)聯(lián)子數(shù)據(jù),如果過濾器中存儲了該關(guān)聯(lián)子數(shù)據(jù),則不對該過濾器進(jìn)行更新,當(dāng)該過濾器中未保存該關(guān)聯(lián)子數(shù)據(jù)時(shí),則將該關(guān)聯(lián)子數(shù)據(jù)的信息添加到過濾器中。
例如,對于緩存姓名、性別和年齡關(guān)系數(shù)據(jù)的每個(gè)列,對于緩存姓名的列,該列對應(yīng)的過濾器中緩存的可以是該列中包含的每個(gè)姓名,如果該過濾器中沒有保存該姓名,則將該姓名添加到過濾器中;對于緩存年齡的列,該列對應(yīng)的過濾器緩存的可以是該列中出現(xiàn)的所有年齡,也可以是所有年齡所在的范圍,例如該列中緩存的年齡包括13、14、15、17,則可以將過濾器中該關(guān)聯(lián)子數(shù)據(jù)的信息設(shè)置為13和17之間,如果某一年齡不在該范圍內(nèi),則對該范圍進(jìn)行調(diào)整,例如該年齡為18,則將18添加到過濾器中,將過濾器對應(yīng)的關(guān)聯(lián)子數(shù)據(jù)的信息設(shè)置為13和18之間。
為了滿足分布式存儲系統(tǒng)的需求,可以將數(shù)據(jù)分塊,不同的數(shù)據(jù)存儲在不同的設(shè)備上,因此相應(yīng)的每列中的所有行可能在不同的分區(qū)中,為了方便后續(xù)數(shù)據(jù)的查找。在本發(fā)明的一個(gè)實(shí)施例中,在每個(gè)分區(qū)中針對每列可以設(shè)置對應(yīng)的過濾器,所述將每個(gè)關(guān)聯(lián)子數(shù)據(jù)緩存到對應(yīng)的列中后,所述方法還包括:
針對每列,根據(jù)該關(guān)聯(lián)子數(shù)據(jù)緩存的行所在的分區(qū),判斷該列在該分區(qū)中對應(yīng)的過濾器中是否保存有該關(guān)聯(lián)子數(shù)據(jù),如果不存在,則將該關(guān)聯(lián)子數(shù)據(jù)的信息添加到所述過濾器中。
不同的分區(qū)位于同一電子設(shè)備,或不同的電子設(shè)備。
雖然同一列的不同行可能在不同的設(shè)備上,但是為了便于數(shù)據(jù)的查詢和緩存,列簇表和位圖索引還是使用同一個(gè),并且根據(jù)設(shè)備之間的連續(xù),設(shè)置不同設(shè)備之間行之間的關(guān)系。
對每個(gè)列的過濾器中保存的關(guān)聯(lián)子數(shù)據(jù)的信息進(jìn)行更新的過程與上述實(shí)施例中相同,在本發(fā)明實(shí)施例中對該過程不進(jìn)行贅述。
圖3為本發(fā)明一個(gè)實(shí)施例提供的關(guān)系數(shù)據(jù)的緩存過程,該過程包括以下步驟:
S301:接收待緩存的關(guān)系數(shù)據(jù),其中所述關(guān)系數(shù)據(jù)中至少包括一個(gè)關(guān)聯(lián)子數(shù)據(jù)。
S302:根據(jù)每個(gè)關(guān)聯(lián)子數(shù)據(jù)與列簇中每列的對應(yīng)關(guān)系,將每個(gè)關(guān)聯(lián)子數(shù)據(jù)緩存到對應(yīng)的列中。
S303:根據(jù)ID表中記錄的位圖索引被占用的行的標(biāo)識信息,確定位圖索引中該關(guān)系數(shù)據(jù)對應(yīng)行的標(biāo)識信息。
S304:根據(jù)每列是否緩存了該關(guān)系數(shù)據(jù),更新位圖索引中將該行對應(yīng)的位圖標(biāo)識。
S305:針對每列,根據(jù)該關(guān)聯(lián)子數(shù)據(jù)緩存的行所在的分區(qū),判斷該列在該分區(qū)中對應(yīng)的過濾器中是否保存有該關(guān)聯(lián)子數(shù)據(jù),如果否,則進(jìn)行S306,如果是,該數(shù)據(jù)緩存過程結(jié)束。
S306:則將該關(guān)聯(lián)子數(shù)據(jù)的信息添加到所述過濾器中。
上述過程中步驟S306只要位于步驟S302之后即可,本發(fā)明實(shí)施例對步驟S306與步驟S303~S305之間的順序不做限制。
為了方便關(guān)系數(shù)據(jù)的緩存,提高關(guān)系數(shù)據(jù)緩存的效率,在本發(fā)明的一個(gè)實(shí)施例中,所述將每個(gè)關(guān)聯(lián)子數(shù)據(jù)緩存到對應(yīng)的列中包括:
針對每列,識別該列對應(yīng)的緩存數(shù)據(jù)的長度是否固定;
如果是,直接在該列中緩存該關(guān)聯(lián)子數(shù)據(jù);
如果否,則根據(jù)該列對應(yīng)的數(shù)據(jù)長度,將該列對應(yīng)的關(guān)聯(lián)子數(shù)據(jù)轉(zhuǎn)換為該數(shù)據(jù)長度,并在該列中緩存該轉(zhuǎn)換后的關(guān)聯(lián)子數(shù)據(jù)。
在本發(fā)明實(shí)施例中可以采用變長域的方式進(jìn)行關(guān)聯(lián)子數(shù)據(jù)的存儲,也可以采用變長域與定長域結(jié)合的方式進(jìn)行關(guān)系數(shù)據(jù)緩存。無論采用哪種方式,每列對應(yīng)的緩存字長最好固定,可以統(tǒng)一使用變長域的方式緩存,也可以統(tǒng)一使用定長域的方式緩存。
對于變長域的緩存方式,在進(jìn)行緩存時(shí)包括兩部分,分別為變長域的數(shù)據(jù)長度F_Length,以及具體的滿足該長度的數(shù)據(jù)F_Value。對于定長域的緩存方式,只要緩存滿足該固定長度的數(shù)據(jù)F_Value即可。
為了實(shí)現(xiàn)緩存數(shù)據(jù)之間的交互,在本發(fā)明的另一實(shí)施方式中所述方法還包括:
按照設(shè)定的時(shí)間間隔,將緩存的關(guān)系數(shù)據(jù)同步到其他系統(tǒng)。
具體的,在本發(fā)明實(shí)施例中可以通過數(shù)據(jù)連接驅(qū)動(dòng)(Data Connection Driver)模塊,實(shí)現(xiàn)不同系統(tǒng)之間緩存數(shù)據(jù)的交互,常見的數(shù)據(jù)連接驅(qū)動(dòng)有java數(shù)據(jù)庫連接(Java Data Base Connectivity,JDBC),開放數(shù)據(jù)庫互連(Open Database Connectivity,ODBC)。
圖4為本發(fā)明實(shí)施例提供的基于上述緩存方式的一種關(guān)系數(shù)據(jù)查詢過程,該過程包括以下步驟:
S401:接收待查詢的數(shù)據(jù),其中所述數(shù)據(jù)為關(guān)系數(shù)據(jù),或關(guān)系數(shù)據(jù)中的至少一項(xiàng)關(guān)聯(lián)子數(shù)據(jù)。
該數(shù)據(jù)可能是關(guān)系數(shù)據(jù),也可能是該關(guān)系數(shù)據(jù)中的至少一項(xiàng)關(guān)聯(lián)子數(shù)據(jù)。關(guān)系數(shù)據(jù)中指包括至少一個(gè)關(guān)聯(lián)子數(shù)據(jù)的數(shù)據(jù),該至少一個(gè)關(guān)聯(lián)子數(shù)據(jù)相互關(guān)聯(lián)對該數(shù)據(jù)進(jìn)行描述,例如關(guān)聯(lián)子數(shù)據(jù)可以分別為:張三、男、28歲,或者李四、女、49公斤,或者馬五、健康,或者只有姓名等等。
S402:將所述數(shù)據(jù)拆分為至少一項(xiàng)關(guān)聯(lián)子數(shù)據(jù)。
在對關(guān)系數(shù)據(jù)進(jìn)行查找時(shí),可以預(yù)先獲知查找的關(guān)系數(shù)據(jù)中都包括幾個(gè)關(guān)聯(lián)子數(shù)據(jù),以及哪幾個(gè)關(guān)聯(lián)子數(shù)據(jù),因此可以實(shí)現(xiàn)該數(shù)據(jù)的拆分。并可以在對應(yīng)的列中查找該關(guān)聯(lián)子數(shù)據(jù)。
S403:針對每項(xiàng)關(guān)聯(lián)子數(shù)據(jù),根據(jù)緩存該項(xiàng)關(guān)聯(lián)子數(shù)據(jù)的列,判斷該列緩存的關(guān)聯(lián)子數(shù)據(jù)中是否存在該關(guān)聯(lián)子數(shù)據(jù),如果是,進(jìn)行步驟S404,否則,該查詢過程結(jié)束。
由于每項(xiàng)關(guān)聯(lián)子數(shù)據(jù)緩存在對應(yīng)的列中,因此對關(guān)聯(lián)子數(shù)據(jù)進(jìn)行查找時(shí),在對應(yīng)的列中查找即可,根據(jù)兩個(gè)關(guān)聯(lián)子數(shù)據(jù)是否相同,判斷該列中每行緩存的關(guān)聯(lián)子數(shù)據(jù)中是否存在該關(guān)聯(lián)子數(shù)據(jù),判斷兩個(gè)關(guān)聯(lián)子數(shù)據(jù)是否相同的過程屬于現(xiàn)有技術(shù),在本發(fā)明實(shí)施例中對該過程不進(jìn)行贅述。
S404:根據(jù)所述關(guān)聯(lián)子數(shù)據(jù)所在的位置,查找位圖索引中該位置對應(yīng)行的位圖標(biāo)識,并根據(jù)所述行的位圖標(biāo)識,在對應(yīng)的每列相應(yīng)位置提取其他關(guān)聯(lián)子 數(shù)據(jù),并組合為關(guān)系數(shù)據(jù)。
在本發(fā)明實(shí)施例中位圖索引可以對每列緩存的關(guān)聯(lián)子數(shù)據(jù)進(jìn)行標(biāo)識,即標(biāo)識每個(gè)關(guān)系數(shù)據(jù)的具體存儲位置,具體同一行標(biāo)識的是同一個(gè)關(guān)系數(shù)據(jù)的存儲位圖,可以用位圖標(biāo)識進(jìn)行表示,比如1可以表示對應(yīng)列中存儲了同一關(guān)系數(shù)據(jù)的某一關(guān)聯(lián)子數(shù)據(jù),0則表示對應(yīng)列中未存儲該關(guān)系數(shù)據(jù)的關(guān)聯(lián)子數(shù)據(jù)。
具體的,當(dāng)存在ID表時(shí),該位圖索引與ID表之間具有對應(yīng)的關(guān)聯(lián)關(guān)系,ID表中的每行與位圖索引的每行相對應(yīng),即ID表中存在多少行,位圖索引中就有相同的行數(shù),且兩者每行之間一一對應(yīng)。根據(jù)ID表中每行的標(biāo)識信息,可以查找位圖索引中該行的具體占用信息,并且位圖索引也可以反查ID表中對應(yīng)行的標(biāo)識信息。
根據(jù)圖2所示,每個(gè)列簇都有相應(yīng)的ID表,圖2中的ID所示即為該ID表,ID表中存在1、2、……k行,由于ID表與位圖索引項(xiàng)對應(yīng)的,在位圖索引中也存在k行。列簇中對該關(guān)系數(shù)據(jù)進(jìn)行緩存的列包含2個(gè)列,分別為A列和B列。為了對每列的占用情況進(jìn)行標(biāo)識,位圖索引中也設(shè)置有兩列,a列和b列,其中a列記錄A列中每個(gè)關(guān)聯(lián)子數(shù)據(jù)的存儲情況,b列記錄B列中每個(gè)關(guān)聯(lián)子數(shù)據(jù)的存儲情況。其中一個(gè)關(guān)系數(shù)據(jù)在該位圖索引中對應(yīng)一行。
如圖2所示,在位圖索引的第一行中記錄了位圖標(biāo)識1和1,說明第一個(gè)關(guān)系數(shù)據(jù)同時(shí)包括兩個(gè)關(guān)聯(lián)子數(shù)據(jù),該關(guān)聯(lián)子數(shù)據(jù)分別存儲到了A列的第一行和B列的第一行,第二行中記錄了位圖標(biāo)識1和0,說明第二個(gè)關(guān)系數(shù)據(jù)包括一個(gè)關(guān)聯(lián)子數(shù)據(jù),該關(guān)聯(lián)子數(shù)據(jù)存儲在了A列的第二行,第三行記錄了位圖標(biāo)識0和0,說明第三個(gè)關(guān)系數(shù)據(jù)未存儲在任何一列中,第四行記錄了位圖標(biāo)識1和1,說明第四個(gè)關(guān)系數(shù)據(jù)同時(shí)包括兩個(gè)關(guān)聯(lián)子數(shù)據(jù),該關(guān)聯(lián)子數(shù)據(jù)分別存儲到了A列的第三行和B列的第二行,依次類推,該位圖索引的第k行記錄了位圖標(biāo)識1和1,說明第k個(gè)關(guān)系數(shù)據(jù)同時(shí)包括兩個(gè)關(guān)聯(lián)子數(shù)據(jù),該關(guān)聯(lián)子數(shù)據(jù)分別存儲到了A列的第i行和B列的第j行,其中i為A列中存儲關(guān)聯(lián)子數(shù)據(jù)的數(shù)量,j為B列存儲關(guān)聯(lián)子數(shù)據(jù)的數(shù)量。
所述根據(jù)所述關(guān)聯(lián)子數(shù)據(jù)所在的位置,查找位圖索引中該位置對應(yīng)行的位圖標(biāo)識包括:
根據(jù)該關(guān)聯(lián)子數(shù)據(jù)在該列中緩存的行的行數(shù),在所述位圖索引中根據(jù)緩存 有關(guān)聯(lián)子數(shù)據(jù)的第一位圖標(biāo)識,查找第一數(shù)量的第一位圖標(biāo)識所在位圖索引的行的標(biāo)識信息,并查找所述行中針對每列的位圖標(biāo)識,其中所述第一數(shù)量為所述行數(shù);
所述根據(jù)所述行的位圖標(biāo)識,在對應(yīng)的每列相應(yīng)位置提取其他關(guān)聯(lián)子數(shù)據(jù)包括:
根據(jù)所述位圖索引所述行中的每個(gè)第一位圖標(biāo)識,根據(jù)所述第一位圖標(biāo)識所在的列,針對該列,按照從前往后的順序識別所述列中從開始到所述行中出現(xiàn)第一位圖標(biāo)識的次數(shù),在相應(yīng)的列中提取該對應(yīng)次數(shù)行中緩存的其他關(guān)聯(lián)子數(shù)據(jù)。
其中緩存有關(guān)聯(lián)子數(shù)據(jù)的第一位圖標(biāo)識,即上述所述的位圖標(biāo)識1,第二位圖標(biāo)識為位圖標(biāo)識0,為未緩存關(guān)聯(lián)子數(shù)據(jù)。根據(jù)圖2所示,對于ID表中的第k行,該行對應(yīng)的位圖索引中對應(yīng)行的位圖標(biāo)識的組合Bitmapk=(ak,bk),ak和bk為第k行中a列和b列的位圖標(biāo)識。對于ak,它是a列中第i個(gè)非零值,因此在確定ak對應(yīng)的為a列中的非零值數(shù)量時(shí),可以表示為P(ak)=i,對于bk,它是b列中第j個(gè)非零值,因此在確定bk對應(yīng)的為b列中的非零值數(shù)量時(shí),可以表示為P(bk)=j(luò)。相應(yīng)的對于A列,第i個(gè)數(shù)據(jù)Ai用位圖索引中第k行對應(yīng)的值標(biāo)識,對于B列,第j個(gè)數(shù)據(jù)Bj用位圖索引中第k行對應(yīng)的值標(biāo)識,上述各表直接的對應(yīng)關(guān)系可以表示為(IDK,Ai,Bj)為同一行數(shù)據(jù),并且P(ak)=i,P(bk)=j(luò)。
通過上述關(guān)系,可知對于上述各表中任意一行的任一一列的數(shù)值,都可能通過上述關(guān)系查找。
S405:將針對每個(gè)關(guān)聯(lián)子數(shù)據(jù)組合得到的關(guān)系數(shù)據(jù)的交集作為查詢結(jié)果。
針對每個(gè)關(guān)聯(lián)子數(shù)據(jù)都可以查找到相應(yīng)的關(guān)系數(shù)據(jù),當(dāng)該待查詢的關(guān)系數(shù)據(jù)中包含兩個(gè)以上的關(guān)聯(lián)子數(shù)據(jù)時(shí),將針對每個(gè)關(guān)聯(lián)子數(shù)據(jù)查找到的關(guān)系數(shù)據(jù)取交集即為最終的查詢結(jié)果。
例如該待查詢數(shù)據(jù)為男、14歲,還依照上述實(shí)施例的描述,將該數(shù)據(jù)拆分為兩項(xiàng)關(guān)聯(lián)子數(shù)據(jù)男和14歲,分別在性別所在列和年齡所在列查找滿足性別為男的關(guān)系數(shù)據(jù)以及滿足年齡為14的關(guān)系數(shù)據(jù),根據(jù)性別查找到的關(guān)系數(shù)據(jù)為第一關(guān)系數(shù)據(jù)、第二關(guān)系數(shù)據(jù)和第三關(guān)系數(shù)據(jù),根據(jù)年齡查找到的關(guān)系數(shù)據(jù)為第 一關(guān)系數(shù)據(jù)、第二關(guān)系數(shù)據(jù)和第四關(guān)系數(shù)據(jù),兩個(gè)關(guān)聯(lián)子數(shù)據(jù)組合得到的關(guān)系數(shù)據(jù)的交集為第一關(guān)系數(shù)據(jù)和第二關(guān)系數(shù)據(jù)。
由于在本發(fā)明實(shí)施例中針對每個(gè)關(guān)系數(shù)據(jù),通過位圖索引記錄該關(guān)系數(shù)據(jù)的每個(gè)關(guān)聯(lián)子數(shù)據(jù)的緩存位置,因此可以根據(jù)位圖索引查找對應(yīng)的關(guān)系數(shù)據(jù),方便關(guān)系數(shù)據(jù)的查詢,并提高內(nèi)存等存儲空間的利用率。
在本發(fā)明的一個(gè)實(shí)施例中,所述判斷每列存儲的關(guān)聯(lián)子數(shù)據(jù)中是否存在該關(guān)聯(lián)子數(shù)據(jù)包括:
針對每列,在該列對應(yīng)的過濾器中,判斷該列存儲的關(guān)聯(lián)子數(shù)據(jù)的信息中是否存在該關(guān)聯(lián)子數(shù)據(jù)。
在上述實(shí)施例中,針對每列都設(shè)置有過濾器,如圖2所示的Filter,在該過濾器中存儲有該列中緩存的關(guān)聯(lián)子數(shù)據(jù)的信息,具體的該關(guān)聯(lián)子數(shù)據(jù)的信息可以是該列中緩存的每個(gè)關(guān)聯(lián)子數(shù)據(jù),可以是該列緩存的關(guān)聯(lián)子數(shù)據(jù)滿足的相應(yīng)條件。因?yàn)楫?dāng)在每列緩存了相應(yīng)的關(guān)聯(lián)子數(shù)據(jù)后,判斷過濾器是否保存有該關(guān)聯(lián)子數(shù)據(jù),如果過濾器中存儲了該關(guān)聯(lián)子數(shù)據(jù),則不對該過濾器進(jìn)行更新,當(dāng)該過濾器中未保存該關(guān)聯(lián)子數(shù)據(jù)時(shí),則將該關(guān)聯(lián)子數(shù)據(jù)的信息添加到過濾器中。因此根據(jù)每個(gè)列對應(yīng)的過濾器中保存的關(guān)聯(lián)子數(shù)據(jù)的信息,可以加快查詢的速度。如果該過濾器中存在該關(guān)聯(lián)子數(shù)據(jù),則繼續(xù)在該列中一一查找,如果該過濾器中不存在該關(guān)聯(lián)子數(shù)據(jù),則可以省去后續(xù)查找步驟,直接輸出未查詢到相應(yīng)結(jié)果的提示信息。
在本發(fā)明的一個(gè)實(shí)施例中,所述判斷每列存儲的關(guān)聯(lián)子數(shù)據(jù)中是否存在該關(guān)聯(lián)子數(shù)據(jù)包括:
針對每個(gè)分區(qū)中的每列,在該列對應(yīng)的每個(gè)過濾器中,判斷該列存儲的關(guān)聯(lián)子數(shù)據(jù)的信息中是否存在該關(guān)聯(lián)子數(shù)據(jù)。
為了滿足分布式存儲系統(tǒng)的需求,可以將數(shù)據(jù)分塊,不同的數(shù)據(jù)存儲在不同的設(shè)備上,因此相應(yīng)的每列中的所有行可能在不同的分區(qū)中,為了方便后續(xù)數(shù)據(jù)的查找。在不同的分區(qū)針對每列設(shè)置有對應(yīng)的過濾器。
不同的分區(qū)位于同一電子設(shè)備,或不同的電子設(shè)備。
雖然同一列的不同行可能在不同的設(shè)備上,但是為了便于數(shù)據(jù)的查詢和緩 存,列簇表和位圖索引還是使用同一個(gè),并且根據(jù)設(shè)備之間的連續(xù),設(shè)置不同設(shè)備之間行之間的關(guān)系。對每個(gè)列的過濾器中查找關(guān)聯(lián)子數(shù)據(jù)的過程與上述實(shí)施例中相同,在本發(fā)明實(shí)施例中對該過程不進(jìn)行贅述。
下面結(jié)合一個(gè)具體的實(shí)施例,對本發(fā)明實(shí)施例的關(guān)系數(shù)據(jù)緩存和查詢過程進(jìn)行說明,結(jié)合圖5所示的各表間的關(guān)系示意圖所示。
關(guān)系數(shù)據(jù)包括:姓名、性別和年齡關(guān)聯(lián)子數(shù)據(jù),第一個(gè)緩存的關(guān)系數(shù)據(jù)為張三、男、21歲,第二緩存的關(guān)系數(shù)據(jù)為李四、女、23歲,第三個(gè)緩存的關(guān)系數(shù)據(jù)為20歲,第四個(gè)緩存的關(guān)系數(shù)據(jù)為馬五、女、20歲。
在進(jìn)行緩存時(shí)姓名緩存在A列,性別緩存在B列,年齡緩存在C列,在進(jìn)行緩存的關(guān)系數(shù)據(jù)中拆分出每個(gè)關(guān)系子數(shù)據(jù),將每個(gè)關(guān)系子數(shù)據(jù)緩存在對應(yīng)列中。具體的將第一個(gè)緩存的關(guān)系數(shù)據(jù)拆分為張三、男、21歲,將張三緩存在A列的第一行,將男緩存在B列的第一行,將21歲緩存在C列的第一行。當(dāng)前該ID表還沒有被使用,相應(yīng)的位圖索引也未被使用,因此將該關(guān)系數(shù)據(jù)的信息添加到位圖索引的第一行中,具體的在該位圖索引的第一行針對A列的位置添加位圖標(biāo)識1,針對B列的位置添加位圖標(biāo)識1,針對C類的位置添加1。并在該ID表中記錄第一行被占用的信息。
另外,在將關(guān)聯(lián)子數(shù)據(jù)緩存到A列時(shí),該A列對應(yīng)的數(shù)據(jù)長度為變長域長度,因此根據(jù)該列對應(yīng)的數(shù)據(jù)長度,將姓名轉(zhuǎn)換為該數(shù)據(jù)長度,并在該列中緩存該轉(zhuǎn)換后的關(guān)聯(lián)子數(shù)據(jù)。B列和C列對應(yīng)的為固定數(shù)據(jù)長度,則直接在相應(yīng)列中緩存關(guān)聯(lián)子數(shù)據(jù)。
針對每列的過濾器,根據(jù)緩存的每個(gè)關(guān)聯(lián)子數(shù)據(jù),添加每個(gè)關(guān)聯(lián)子數(shù)據(jù)的信息。并且通過數(shù)據(jù)連接驅(qū)動(dòng)(Data Connection Driver)可以按照設(shè)定的時(shí)間間隔,將緩存的關(guān)系數(shù)據(jù)同步到其他文件系統(tǒng)(FileSystem)。
同樣的針對第二個(gè)、第三個(gè)、第四個(gè)緩存的關(guān)系數(shù)據(jù),采用相同的方式進(jìn)行緩存,并對該位圖索引中第二行、第三行和第四行的相應(yīng)位置添加位圖標(biāo)識,如圖5中位圖索引的前四行。之后還會緩存其他的關(guān)系數(shù)據(jù),為了簡單此處只以緩存四個(gè)關(guān)系數(shù)據(jù)為例進(jìn)行說明。
當(dāng)接收到的待查詢的數(shù)據(jù)為李四、女、23歲時(shí),將該數(shù)據(jù)拆分為三項(xiàng)關(guān)聯(lián)子數(shù)據(jù)分別為李四、女、23歲,則分別在A列、B列和C列中進(jìn)行查詢。
當(dāng)在A列中進(jìn)行查詢時(shí),A列對應(yīng)的過濾器,判斷是否緩存有李四的信息,則在A列的每行中進(jìn)行查找,查找到第二行存儲有李四的信息。因?yàn)槔钏氖谴鎯υ贏列的第二行的,因此在位圖索引中查找出現(xiàn)第二個(gè)位圖標(biāo)識為1的行,具體的為位圖索引中的第二行。根據(jù)位圖索引的第二行的位圖標(biāo)識,可知A、B、C列中都緩存有該關(guān)系數(shù)據(jù)的關(guān)聯(lián)子數(shù)據(jù)。B列中圖標(biāo)識1為第二次出現(xiàn),則在B列的第二行中提取李四對應(yīng)的其他關(guān)聯(lián)子數(shù)據(jù),C列中圖標(biāo)識1為也是第二次出現(xiàn),則在C列的第二行中提取李四對應(yīng)的其他關(guān)聯(lián)子數(shù)據(jù)。
當(dāng)接收到的待查詢的數(shù)據(jù)為20時(shí),該數(shù)據(jù)為關(guān)系數(shù)據(jù)的關(guān)聯(lián)子數(shù)據(jù),并且存儲在C列中,則根據(jù)C列對應(yīng)的過濾器中,判斷是否緩存有20的信息,如果存在,則在C列中進(jìn)行查找,查找到C列的第三行和第四行都存儲有20的信息。因此根據(jù)C列中存儲的20的行數(shù),可知,分別為第三行和第四行,則在位圖索引中查找與C列對應(yīng)的列中出現(xiàn)第三個(gè)位圖標(biāo)識1的行數(shù)和出現(xiàn)第四個(gè)位圖標(biāo)識1的行數(shù),分別為位圖索引中的第三行和第四行。根據(jù)位圖索引第三行中的每個(gè)位圖標(biāo)識可知,對應(yīng)的關(guān)系數(shù)據(jù)只包含關(guān)聯(lián)子數(shù)據(jù)20,根據(jù)位圖索引第四行中的每個(gè)位圖標(biāo)識可知,對應(yīng)的關(guān)系數(shù)據(jù)在A列和B列中也有存儲。對于A列,根據(jù)位圖索引中第四行中與A列對應(yīng)的列中,第四行的位圖標(biāo)識1從頭到第四行出現(xiàn)的次數(shù)為3,因此可知該關(guān)系數(shù)據(jù)的其他關(guān)聯(lián)子數(shù)據(jù)緩存在A列的第3行;根據(jù)位圖索引中第四行中與B列對應(yīng)的列中,第四行的位圖標(biāo)識1從頭到第四行出現(xiàn)的次數(shù)為3。因此可知該關(guān)系數(shù)據(jù)的其他關(guān)聯(lián)子數(shù)據(jù)緩存在B列的第3行,提取A列和B列中第3行存儲的其他關(guān)聯(lián)子數(shù)據(jù),與從C列第四行查找到關(guān)聯(lián)子數(shù)據(jù)進(jìn)行組合得到第一關(guān)系數(shù)據(jù),并將從C列第三行查找到的關(guān)聯(lián)子數(shù)據(jù)作為第二關(guān)系數(shù)據(jù),將第一關(guān)系數(shù)據(jù)和第二關(guān)系數(shù)據(jù)作為查詢結(jié)果。
依據(jù)其他關(guān)聯(lián)子數(shù)據(jù)進(jìn)行查找的過程與上述過程類似,在這里就不進(jìn)行贅述。
圖6為本發(fā)明實(shí)施例提供的關(guān)系數(shù)據(jù)緩存裝置結(jié)構(gòu)示意圖,應(yīng)用于電子設(shè)備,該裝置包括:
接收模塊61,用于接收待緩存的關(guān)系數(shù)據(jù),其中所述關(guān)系數(shù)據(jù)中至少包括一個(gè)關(guān)聯(lián)子數(shù)據(jù);
緩存模塊62,用于根據(jù)每個(gè)關(guān)聯(lián)子數(shù)據(jù)與列簇中每列的對應(yīng)關(guān)系,將每個(gè) 關(guān)聯(lián)子數(shù)據(jù)緩存到對應(yīng)的列中;
更新模塊63,用于根據(jù)每列是否緩存了該關(guān)系數(shù)據(jù),更新位圖索引中對應(yīng)行的位圖標(biāo)識。
所述裝置還包括:
過濾模塊64,用于針對每列,判斷該列對應(yīng)的過濾器中是否保存有該關(guān)聯(lián)子數(shù)據(jù),如果不存在,則將該關(guān)聯(lián)子數(shù)據(jù)的信息添加到所述過濾器中。
所述裝置還包括:
過濾模塊64,針對每列,根據(jù)該關(guān)聯(lián)子數(shù)據(jù)緩存的行所在的分區(qū),判斷該列在該分區(qū)中對應(yīng)的過濾器中是否保存有該關(guān)聯(lián)子數(shù)據(jù),如果不存在,則將該關(guān)聯(lián)子數(shù)據(jù)的信息添加到所述過濾器中。
所述緩存模塊62,具體用于針對每列,識別該列對應(yīng)的緩存數(shù)據(jù)的長度是否固定;如果是,直接在該列中緩存該關(guān)聯(lián)子數(shù)據(jù);如果否,則根據(jù)該列對應(yīng)的數(shù)據(jù)長度,將該列對應(yīng)的關(guān)聯(lián)子數(shù)據(jù)轉(zhuǎn)換為該數(shù)據(jù)長度,并在該列中緩存該轉(zhuǎn)換后的關(guān)聯(lián)子數(shù)據(jù)。
所述裝置還包括:
同步模塊65,用于按照設(shè)定的時(shí)間間隔,將緩存的關(guān)系數(shù)據(jù)同步到其他系統(tǒng)。
具體的,所述關(guān)系數(shù)據(jù)緩存在所述電子設(shè)備的內(nèi)存或固態(tài)硬盤上。
圖7為本發(fā)明實(shí)施例提供的基于圖6所示關(guān)系數(shù)據(jù)緩存裝置的關(guān)系數(shù)據(jù)查詢裝置結(jié)構(gòu)示意圖,應(yīng)用于電子設(shè)備,該裝置包括:
接收模塊71,用于接收待查詢的數(shù)據(jù),其中所述數(shù)據(jù)為關(guān)系數(shù)據(jù),或關(guān)系數(shù)據(jù)中的至少一項(xiàng)關(guān)聯(lián)子數(shù)據(jù);
拆分模塊72,用于將所述數(shù)據(jù)拆分為至少一項(xiàng)關(guān)聯(lián)子數(shù)據(jù);
查找模塊73,用于針對每項(xiàng)關(guān)聯(lián)子數(shù)據(jù),根據(jù)緩存該項(xiàng)關(guān)聯(lián)子數(shù)據(jù)的列,判斷該列緩存的關(guān)聯(lián)子數(shù)據(jù)中是否存在該關(guān)聯(lián)子數(shù)據(jù);如果是,根據(jù)所述關(guān)聯(lián)子數(shù)據(jù)所在的位置,查找位圖索引中該位置對應(yīng)行的位圖標(biāo)識,并根據(jù)所述行的位圖標(biāo)識,在對應(yīng)的每列相應(yīng)位置提取其他關(guān)聯(lián)子數(shù)據(jù),并組合為關(guān)系數(shù)據(jù);
提供模塊74,用于將針對每個(gè)關(guān)聯(lián)子數(shù)據(jù)組合得到的關(guān)系數(shù)據(jù)的交集作為查詢結(jié)果。
所述查找模塊73,具體用于根據(jù)該關(guān)聯(lián)子數(shù)據(jù)在該列中緩存的行的行數(shù),在所述位圖索引中根據(jù)緩存有關(guān)聯(lián)子數(shù)據(jù)的第一位圖標(biāo)識,查找該第一數(shù)量的第一位圖標(biāo)識所在位圖索引的行的標(biāo)識信息,并查找所述行中針對每列的位圖標(biāo)識,其中所述第一數(shù)量為所述行數(shù);根據(jù)所述位圖索引所述行中的每個(gè)第一位圖標(biāo)識,根據(jù)所述第一位圖標(biāo)識所在的列,針對該列,按照從前往后的順序識別所述列中從開始到所述行中出現(xiàn)第一位圖標(biāo)識的次數(shù),在相應(yīng)的列中提取該對應(yīng)次數(shù)的行中緩存的其他關(guān)聯(lián)子數(shù)據(jù)。
所述查找模塊73,具體用于針對每列,在該列對應(yīng)的過濾器中,判斷該列存儲的關(guān)聯(lián)子數(shù)據(jù)的信息中是否存在該關(guān)聯(lián)子數(shù)據(jù)。
所述查找模塊73,具體用于針對每個(gè)分區(qū)中的每列,在該列對應(yīng)的過濾器中,判斷該列存儲的關(guān)聯(lián)子數(shù)據(jù)的信息中是否存在該關(guān)聯(lián)子數(shù)據(jù)。
本發(fā)明實(shí)施例提供了一種關(guān)系數(shù)據(jù)緩存及查詢方法及裝置,該緩存方法包括:接收到待緩存的關(guān)系數(shù)據(jù)后,根據(jù)每個(gè)關(guān)聯(lián)子數(shù)據(jù)與列簇中每列的對應(yīng)關(guān)系,將每個(gè)關(guān)聯(lián)子數(shù)據(jù)緩存到對應(yīng)的列中,并根據(jù)每列是否緩存了該關(guān)系數(shù)據(jù),更新位圖索引中對應(yīng)行的位圖標(biāo)識。由于在本發(fā)明實(shí)施例中基于位圖索引和每列的對應(yīng)關(guān)系表,進(jìn)行關(guān)系數(shù)據(jù)緩存,并且關(guān)系數(shù)據(jù)被劃分為多個(gè)關(guān)聯(lián)子數(shù)據(jù),分別進(jìn)行緩存,因此提高了關(guān)系數(shù)據(jù)的緩存效率,并且該方法應(yīng)用于電子設(shè)備的內(nèi)存,提高了內(nèi)存的利用率。
對于系統(tǒng)/裝置實(shí)施例而言,由于其基本相似于方法實(shí)施例,所以描述的比較簡單,相關(guān)之處參見方法實(shí)施例的部分說明即可。
需要說明的是,在本文中,諸如第一和第二等之類的關(guān)系術(shù)語僅僅用來將一個(gè)實(shí)體或者操作與另一個(gè)實(shí)體或操作區(qū)分開來,而不一定要求或者暗示這些實(shí)體或操作之間存在任何這種實(shí)際的關(guān)系或者順序。而且,術(shù)語“包括”、“包含”或者其任何其他變體意在涵蓋非排他性的包含,從而使得包括一系列要素的過程、方法、物品或者設(shè)備不僅包括那些要素,而且還包括沒有明確列出的其他要素,或者是還包括為這種過程、方法、物品或者設(shè)備所固有的要素。在沒有更多限制的情況下,由語句“包括一個(gè)……”限定的要素,并不排除在包括所述要 素的過程、方法、物品或者設(shè)備中還存在另外的相同要素。
本領(lǐng)域普通技術(shù)人員可以理解實(shí)現(xiàn)上述方法實(shí)施方式中的全部或部分步驟是可以通過程序來指令相關(guān)的硬件來完成,所述的程序可以存儲于計(jì)算機(jī)可讀取存儲介質(zhì)中,這里所稱得的存儲介質(zhì),如:ROM/RAM、磁碟、光盤等。
以上所述僅為本發(fā)明的較佳實(shí)施例而已,并非用于限定本發(fā)明的保護(hù)范圍。凡在本發(fā)明的精神和原則之內(nèi)所作的任何修改、等同替換、改進(jìn)等,均包含在本發(fā)明的保護(hù)范圍內(nèi)。