本發(fā)明涉及計(jì)算機(jī)數(shù)據(jù)處理領(lǐng)域,具體涉及一種以用戶為中心且基于多級(jí)緩存的海洋時(shí)空數(shù)據(jù)訪問方法。
背景技術(shù):海洋時(shí)空數(shù)據(jù)不僅包含三維空間數(shù)據(jù),而且涵蓋各類時(shí)序多變量空間數(shù)據(jù),如氣象、水文、海洋生物,以及實(shí)時(shí)災(zāi)難預(yù)警、航線調(diào)整等信息。海洋時(shí)空數(shù)據(jù)具有多源、異質(zhì)、結(jié)構(gòu)復(fù)雜、數(shù)據(jù)量大以及空間分布不均勻等特性,面對(duì)用戶極具個(gè)性化的訪問需求,需要提供能夠高效調(diào)度和管理海洋時(shí)空數(shù)據(jù)的海洋地理信息系統(tǒng)。緩存能緩解處理器和磁盤I/O之間的性能差距,是提高數(shù)據(jù)訪問效率的有效機(jī)制,尤其在數(shù)據(jù)量大、訪問頻繁的情況下緩解性能更為明顯,隨著硬件技術(shù)的發(fā)展,內(nèi)存容量大幅提高,為緩存策略的發(fā)展帶來新的機(jī)遇。傳統(tǒng)的緩存策略受容量的限制,需以進(jìn)程為數(shù)據(jù)訪問單位,考慮全體訪問數(shù)據(jù)的緩存。假設(shè)訪問數(shù)據(jù)集為某時(shí)刻駐留集為T={a1,a2,a3,…,ai},其中緩存策略主要基于訪問頻率和訪問時(shí)間,即訪問頻率較高和最近訪問的數(shù)據(jù)駐留在時(shí)刻駐留集T中,但是在實(shí)際應(yīng)用中,用戶完整的數(shù)據(jù)請(qǐng)求可能需要多個(gè)進(jìn)程才能完成,尤其是涉及到多方面數(shù)據(jù)時(shí),緩存帶來的效益并非對(duì)全體用戶公平一致,因此,以進(jìn)程為單位的緩存策略并不能適應(yīng)用戶個(gè)性化的數(shù)據(jù)訪問模式。在三維海洋信息系統(tǒng)中,所有用戶都是同等地位的,用戶不應(yīng)以訪問 的先后順序或以訪問量的大小作為優(yōu)先的條件。作為緩存策略的核心,不同的緩存策略必然產(chǎn)生不同的替換算法。傳統(tǒng)的緩存替換算法主要利用對(duì)數(shù)據(jù)塊的訪問頻率或者最近的訪問時(shí)間為標(biāo)準(zhǔn),判斷數(shù)據(jù)塊在本次替換操作中是否應(yīng)該被替換。經(jīng)典的替換算法以LRU、MRU、LFU三類代表,另外常見的基于頻率和時(shí)間平衡策略的算法有UFU、ARC、MQ/2Q等,然而,這些替換算法的判斷標(biāo)準(zhǔn)都比較單一,且基本上只對(duì)一類訪問模式有比較好的效果,對(duì)其他的訪問模式效果并不明顯。多級(jí)緩存從邏輯上對(duì)數(shù)據(jù)分層緩存,主要分為兩類:基于層次感知的緩存和基于侵略性協(xié)作的緩存。前者通過猜測(cè)判斷緩存數(shù)據(jù)的冗余情況來改變自身的緩存結(jié)果;后者則是通過對(duì)其他緩存的侵略性協(xié)作改變當(dāng)前緩存數(shù)據(jù)??傮w來說,二者仍然基于訪問頻率和訪問時(shí)間的平衡策略。為了滿足三維海洋信息系統(tǒng)實(shí)時(shí)數(shù)據(jù)訪問要求,快速響應(yīng)用戶數(shù)據(jù)請(qǐng)求,需要研究高效的緩存策略。海洋信息系統(tǒng)單次訪問數(shù)據(jù)量較大,如查看某海港實(shí)時(shí)海況,在三維海洋信息系統(tǒng)中不僅要獲取海港三維模型,而且要讀取海港實(shí)時(shí)天氣數(shù)據(jù)。傳統(tǒng)的緩存策略盡量緩存最近訪問最多的數(shù)據(jù),當(dāng)緩存池空閑容量不足時(shí),新用戶的訪問數(shù)據(jù)需要等到替換完成后才能全部加載到緩存池中,新用戶等待時(shí)間較長(zhǎng)。
技術(shù)實(shí)現(xiàn)要素:本發(fā)明提供了一種以用戶為中心且基于多級(jí)緩存的海洋時(shí)空數(shù)據(jù)訪問方法,以用戶為中心,保證每個(gè)用戶能夠公平享有數(shù)據(jù)緩存帶來的優(yōu)勢(shì),同時(shí),能夠減小磁盤I/O,降低數(shù)據(jù)的交換頻率,同時(shí)基于海洋時(shí)空數(shù)據(jù)的自身特點(diǎn),通過預(yù)讀機(jī)制進(jìn)一步提高數(shù)據(jù)訪問的效率。一種以用戶為中心且基于多級(jí)緩存的海洋時(shí)空數(shù)據(jù)訪問方法,所述海洋時(shí)空數(shù)據(jù)存放于多臺(tái)數(shù)據(jù)服務(wù)器中,每臺(tái)數(shù)據(jù)服務(wù)器中建立有:數(shù)據(jù)庫(kù),用于存放海洋時(shí)空數(shù)據(jù);緩存池,用于存放數(shù)據(jù)庫(kù)中被用戶訪問過的數(shù)據(jù);緩存列表,用于存放該數(shù)據(jù)服務(wù)器的各用戶的訪問記錄。數(shù)據(jù)服務(wù)器針對(duì)所有用戶建立緩存列表,記錄每個(gè)用戶在緩存服務(wù)器上的訪問時(shí)間以及訪問的數(shù)據(jù),相同數(shù)據(jù)被訪問的次數(shù)等信息。緩存池中以數(shù)據(jù)項(xiàng)的形式存儲(chǔ)所有被用戶訪問過的數(shù)據(jù),數(shù)據(jù)項(xiàng)除了包含數(shù)據(jù)信息外,還包括與數(shù)據(jù)相關(guān)的信息,例如數(shù)據(jù)大小、數(shù)據(jù)位置、訪問記錄等。進(jìn)行海洋時(shí)空數(shù)據(jù)訪問的步驟為:(1)用戶通過客戶端指定查詢條件,客戶端向中間服務(wù)器發(fā)出查詢請(qǐng)求。本申請(qǐng)的客戶端中建立有數(shù)據(jù)緩存區(qū)、按R樹組織的空間索引(記錄海洋空間中每塊區(qū)域?qū)?yīng)的所有數(shù)據(jù)的ID)以及請(qǐng)求隊(duì)列。用戶指定查詢條件時(shí),如果查詢條件指向單個(gè)數(shù)據(jù),則根據(jù)該單個(gè)數(shù)據(jù)的ID查找數(shù)據(jù)緩存區(qū),如果數(shù)據(jù)不在數(shù)據(jù)緩存區(qū)中,則將該數(shù)據(jù)的ID放入請(qǐng)求隊(duì)列中,同時(shí)記錄此次請(qǐng)求的時(shí)間戳。如果查詢條件指向某塊區(qū)域(某塊區(qū)域是指某海洋空間范圍內(nèi)的數(shù)據(jù),利用地理上的經(jīng)度和緯度進(jìn)行區(qū)域限定),則根據(jù)空間索引查找該塊區(qū)域中所有數(shù)據(jù)的ID,并根據(jù)每個(gè)數(shù)據(jù)的ID查找數(shù)據(jù)緩存區(qū),如果某個(gè)數(shù)據(jù)不在數(shù)據(jù)緩存區(qū)中,則將該數(shù)據(jù)的ID放入請(qǐng)求隊(duì)列中,同時(shí)記錄此次請(qǐng)求的時(shí)間戳。列入請(qǐng)求隊(duì)列中的數(shù)據(jù)極為客戶端不能直接獲得的數(shù)據(jù),須向中間服務(wù)器發(fā)出查詢請(qǐng)求,中間服務(wù)器為用戶分配合適的數(shù)據(jù)服務(wù)器,數(shù)據(jù)服務(wù)器向用戶返回所需的數(shù)據(jù)。(2)中間服務(wù)器接收查詢請(qǐng)求,根據(jù)請(qǐng)求數(shù)據(jù)的位置,為該用戶指定數(shù)據(jù)服務(wù)器,被指定的數(shù)據(jù)服務(wù)器根據(jù)緩存列表判斷該用戶的請(qǐng)求數(shù)據(jù)是否有訪問記錄;如果有訪問記錄,則從緩存池中讀取該數(shù)據(jù)并返回給用戶;否則,則跳轉(zhuǎn)至步驟(3),并更新緩存列表。作為優(yōu)選,數(shù)據(jù)服務(wù)器定時(shí)向中間服務(wù)器發(fā)送心跳信息,中間服務(wù)器根據(jù)心跳信息判斷各數(shù)據(jù)服務(wù)器的空閑狀態(tài)。中間服務(wù)器接收查詢請(qǐng)求,判斷請(qǐng)求數(shù)據(jù)所在的數(shù)據(jù)服務(wù)器,當(dāng)請(qǐng)求 數(shù)據(jù)存在于多臺(tái)數(shù)據(jù)服務(wù)器時(shí),優(yōu)先指定空閑的數(shù)據(jù)服務(wù)器。(3)檢查緩存池中是否存在請(qǐng)求數(shù)據(jù);如果緩存池中有請(qǐng)求數(shù)據(jù),則將該請(qǐng)求數(shù)據(jù)返回給用戶;否則,從該數(shù)據(jù)服務(wù)器的數(shù)據(jù)庫(kù)中讀取請(qǐng)求數(shù)據(jù)并返回給用戶,同時(shí)更新緩存池。緩存池每次更新完成后,緩存池中的各數(shù)據(jù)項(xiàng)的位置記錄在緩存索引中,每次從緩存池中讀取數(shù)據(jù)時(shí),根據(jù)該緩存索引讀取相應(yīng)的數(shù)據(jù),每次更新緩存池時(shí),對(duì)緩存索引做相應(yīng)更新。更新緩存池時(shí),首先檢查緩存池的剩余容量,如果剩余容量可以容納需要更新的數(shù)據(jù),則將需要更新的數(shù)據(jù)載入緩存池,完成更新;否則,計(jì)算緩存池內(nèi)所有數(shù)據(jù)項(xiàng)的權(quán)值,按照權(quán)值由小至大的次序,將緩存池內(nèi)原有的數(shù)據(jù)項(xiàng)取出緩存池,直至緩存池的剩余容量能夠容納需要更新的數(shù)據(jù),將需要更新的數(shù)據(jù)載入緩存池,完成更新。三維海洋信息系統(tǒng)中,用戶訪問數(shù)據(jù)量較大,為了減少等待時(shí)間,需要根據(jù)對(duì)用戶可能訪問的數(shù)據(jù)做預(yù)測(cè),優(yōu)選地,從數(shù)據(jù)庫(kù)中讀取數(shù)據(jù)前,判斷所讀取數(shù)據(jù)對(duì)應(yīng)的地理位置,以地理位置為中心,按照預(yù)定的半徑確定地理范圍(地理范圍利用經(jīng)度和緯度確定),讀取與該地理范圍相對(duì)應(yīng)的所有同類型數(shù)據(jù),并更新緩存池,同時(shí)僅將用戶請(qǐng)求的數(shù)據(jù)返回給用戶。三維海洋信息系統(tǒng)中包含三維空間數(shù)據(jù)以及各類時(shí)序多變量空間數(shù)據(jù),如氣象、水文、海洋生物,以及實(shí)時(shí)災(zāi)難預(yù)警、航線調(diào)整等信息,所述的同類型數(shù)據(jù)是指,描述同一類信息的數(shù)據(jù),例如用戶需要查找水文數(shù)據(jù),則以所讀取數(shù)據(jù)對(duì)應(yīng)的地理位置為中心,預(yù)定半徑的地理范圍內(nèi)的所有水文數(shù)據(jù)均為同類型數(shù)據(jù)。同類型數(shù)據(jù)的數(shù)據(jù)量可能極大,可以改變預(yù)定半徑的大小,以減少數(shù)據(jù)量,也可以依據(jù)與所讀取數(shù)據(jù)的距離由小到大的次序,選擇固定數(shù)目的同類型數(shù)據(jù),進(jìn)行緩存池的更新。更新緩存池時(shí),選定的同類型數(shù)據(jù)全部載入緩存池中,而返回給用戶的僅為用戶所查詢的數(shù)據(jù)。本發(fā)明利用三級(jí)緩存(分別為客戶端的數(shù)據(jù)緩存區(qū)、數(shù)據(jù)服務(wù)器的緩 存列表以及數(shù)據(jù)服務(wù)器的緩存池)最大程度地減小客戶端的數(shù)據(jù)緩存量,同時(shí),最大程度地減少對(duì)數(shù)據(jù)服務(wù)器中數(shù)據(jù)庫(kù)的直接讀取操作,利用分布式系統(tǒng)內(nèi)存的大容量性質(zhì),為所有用戶建立個(gè)性化的緩存,提高每個(gè)用戶的數(shù)據(jù)訪問速度。本發(fā)明以用戶為中心且基于多級(jí)緩存的海洋時(shí)空數(shù)據(jù)訪問方法,以用戶為中心,利用三級(jí)緩存提高用戶的數(shù)據(jù)訪問速度,同時(shí),在更新數(shù)據(jù)服務(wù)器的緩存池時(shí),采用預(yù)讀機(jī)制,將用戶請(qǐng)求數(shù)據(jù)的相關(guān)數(shù)據(jù)一并放入緩存池中,進(jìn)一步提高用戶的數(shù)據(jù)訪問速度。附圖說明圖1為本發(fā)明以用戶為中心且基于多級(jí)緩存的海洋時(shí)空數(shù)據(jù)訪問方法中數(shù)據(jù)服務(wù)器中多級(jí)緩存結(jié)構(gòu)示意圖;圖2為本發(fā)明以用戶為中心且基于多級(jí)緩存的海洋時(shí)空數(shù)據(jù)訪問方法中的數(shù)據(jù)訪問流程圖;圖3為本發(fā)明以用戶為中心且基于多級(jí)緩存的海洋時(shí)空數(shù)據(jù)訪問方法中數(shù)據(jù)服務(wù)器讀取數(shù)據(jù)的流程圖;圖4為本發(fā)明以用戶為中心且基于多級(jí)緩存的海洋時(shí)空數(shù)據(jù)訪問方法中緩存池更新數(shù)據(jù)流程圖。具體實(shí)施方式下面結(jié)合附圖,對(duì)本發(fā)明以用戶為中心且基于多級(jí)緩存的海洋時(shí)空數(shù)據(jù)訪問方法做詳細(xì)描述。本發(fā)明以用戶為中心且基于多級(jí)緩存的海洋時(shí)空數(shù)據(jù)訪問方法,海洋時(shí)空數(shù)據(jù)存放于多臺(tái)數(shù)據(jù)服務(wù)器中,如圖1所示,每臺(tái)數(shù)據(jù)服務(wù)器中建立有:數(shù)據(jù)庫(kù),用于存放海洋時(shí)空數(shù)據(jù);緩存池,用于存放數(shù)據(jù)庫(kù)中被用戶訪問過的數(shù)據(jù);緩存列表,用于存放該數(shù)據(jù)服務(wù)器的各用戶的訪問記錄。緩存池中以數(shù)據(jù)項(xiàng)的形式記錄所有用戶訪問過的數(shù)據(jù),數(shù)據(jù)項(xiàng)中包括數(shù)據(jù)以及數(shù)據(jù)的相關(guān)狀態(tài),數(shù)據(jù)項(xiàng)記為其中,ui為訪問過該數(shù)據(jù)的所有用戶的數(shù)量,ht為為該數(shù)據(jù)被訪問的所有次數(shù),t 為最近訪問時(shí)間間隔(即該數(shù)據(jù)最后兩次訪問的時(shí)間間隔),size為數(shù)據(jù)的大小。數(shù)據(jù)服務(wù)器為每個(gè)活躍用戶(有數(shù)據(jù)查詢需求的用戶)建立一個(gè)緩存列表,緩存列表的初始狀態(tài)為空,用戶每次訪問的數(shù)據(jù)都加載到緩存池中,緩存列表中記錄緩存池中數(shù)據(jù)的地址作為緩存索引,緩存列表記為item=(ci,idx),其中ci為第i個(gè)用戶,idx為緩存索引,當(dāng)用戶不再活躍時(shí),刪除該緩存列表中的相應(yīng)項(xiàng),并更新緩存池中的數(shù)據(jù)項(xiàng)。用戶通過客戶端進(jìn)行數(shù)據(jù)查詢,客戶端中建立有數(shù)據(jù)緩存區(qū)、按R樹組織的空間索引(記錄海洋空間中每塊區(qū)域?qū)?yīng)的所有數(shù)據(jù)的ID)以及請(qǐng)求隊(duì)列。如圖2、圖3所示,進(jìn)行海洋時(shí)空數(shù)據(jù)訪問的步驟為:(1)用戶通過客戶端指定查詢條件,客戶端向中間服務(wù)器發(fā)出查詢請(qǐng)求;用戶指定查詢條件時(shí),如果查詢條件指向單個(gè)數(shù)據(jù),則根據(jù)該單個(gè)數(shù)據(jù)的ID查找數(shù)據(jù)緩存區(qū),如果數(shù)據(jù)不在數(shù)據(jù)緩存區(qū)中,則將該數(shù)據(jù)的ID放入請(qǐng)求隊(duì)列中,同時(shí)記錄此次請(qǐng)求的時(shí)間戳。如果查詢條件指向某塊區(qū)域(某塊區(qū)域是指某海洋空間范圍內(nèi)的數(shù)據(jù),利用地理上的經(jīng)度和緯度進(jìn)行區(qū)域限定),則根據(jù)空間索引查找該塊區(qū)域中所有數(shù)據(jù)的ID,并根據(jù)每個(gè)數(shù)據(jù)的ID查找數(shù)據(jù)緩存區(qū),如果某個(gè)數(shù)據(jù)不在數(shù)據(jù)緩存區(qū)中,則將該數(shù)據(jù)的ID放入請(qǐng)求隊(duì)列中,同時(shí)記錄此次請(qǐng)求的時(shí)間戳。(2)中間服務(wù)器接收查詢請(qǐng)求,根據(jù)請(qǐng)求數(shù)據(jù)的位置,為該用戶指定數(shù)據(jù)服務(wù)器,被指定的數(shù)據(jù)服務(wù)器根據(jù)緩存列表判斷該用戶的請(qǐng)求數(shù)據(jù)是否有訪問記錄;如果有訪問記錄,則從緩存池中讀取該數(shù)據(jù)并返回給用戶;否則,則跳轉(zhuǎn)至步驟(3),并更新緩存列表。數(shù)據(jù)服務(wù)器定時(shí)向中間服務(wù)器發(fā)送心跳信息,中間服務(wù)器根據(jù)心跳信息判斷各數(shù)據(jù)服務(wù)器的空閑狀態(tài)。中間服務(wù)器接收查詢請(qǐng)求,判斷請(qǐng)求數(shù)據(jù)所在的數(shù)據(jù)服務(wù)器,當(dāng)請(qǐng)求數(shù)據(jù)存在于多臺(tái)數(shù)據(jù)服務(wù)器時(shí),優(yōu)先指定空閑的數(shù)據(jù)服務(wù)器。(3)檢查緩存池中是否存在請(qǐng)求數(shù)據(jù);如果緩存池中有請(qǐng)求數(shù)據(jù),則將該請(qǐng)求數(shù)據(jù)返回給用戶;否則,從該數(shù)據(jù)服務(wù)器的數(shù)據(jù)庫(kù)中讀取請(qǐng)求數(shù)據(jù)并返回給用戶,同時(shí)更新緩存池。從數(shù)據(jù)庫(kù)中讀取數(shù)據(jù)前,判斷所讀取數(shù)據(jù)對(duì)應(yīng)的地理位置,以地理位置為中心,按照預(yù)定的半徑確定地理范圍,讀取與該地理范圍相對(duì)應(yīng)的所有同類型數(shù)據(jù),并更新緩存池,同時(shí)僅將用戶請(qǐng)求的數(shù)據(jù)返回給用戶。本申請(qǐng)利用KNN算法以所讀取數(shù)據(jù)對(duì)應(yīng)的地理位置為中心,尋找最近的k個(gè)(k值可以人為設(shè)定)同類型的數(shù)據(jù)(例如從數(shù)據(jù)庫(kù)中查找5km范圍內(nèi)的水深和底質(zhì)數(shù)據(jù)),載入緩存池中。訪問時(shí),用戶可能會(huì)連續(xù)改變查詢條件,即更改所讀取數(shù)據(jù),也即更新相對(duì)應(yīng)的地理位置,在改變查詢條件的過程中,如果連續(xù)給出兩次查詢條件之間的時(shí)間差小于某一閾值,則終止前一查詢條件的數(shù)據(jù)查找,直接進(jìn)行后一查詢條件的數(shù)據(jù)查找。如圖4所示,更新緩存池時(shí),首先檢查緩存池的剩余容量,如果剩余容量可以容納需要更新的數(shù)據(jù),則將需要更新的數(shù)據(jù)載入緩存池,完成更新;否則,計(jì)算緩存池內(nèi)所有數(shù)據(jù)項(xiàng)的權(quán)值,按照權(quán)值由小至大的次序,將緩存池內(nèi)原有的數(shù)據(jù)項(xiàng)取出緩存池,直至緩存池的剩余容量能夠容納需要更新的數(shù)據(jù),將需要更新的數(shù)據(jù)載入緩存池,完成更新。數(shù)據(jù)項(xiàng)的權(quán)值計(jì)算公式為w=∑uf(ht,t)=∑u(a*size+(b*ht)/(c*t)),其中a、b、c為參數(shù);通過設(shè)定不同的a、b、c值,可以改變數(shù)據(jù)項(xiàng)的權(quán)值,選擇取出緩存池的數(shù)據(jù)項(xiàng),例如減小a的取值,即減小數(shù)據(jù)的大小在權(quán)值中的比重,也即數(shù)據(jù)的大小對(duì)于權(quán)值的影響較小。