本申請涉及網(wǎng)絡(luò)技術(shù)領(lǐng)域,尤其涉及一種數(shù)據(jù)緩存方法、數(shù)據(jù)查詢方法及裝置。
背景技術(shù):
隨著網(wǎng)絡(luò)技術(shù)的飛速發(fā)展,越來越多的用戶通過網(wǎng)絡(luò)獲取信息,網(wǎng)站需要處理的數(shù)據(jù)量也越來越大,當(dāng)今已然進(jìn)入大數(shù)據(jù)時代。網(wǎng)站的服務(wù)端通常包括至少一個大數(shù)據(jù)終端、推送服務(wù)器和數(shù)據(jù)庫,其中,不同的大數(shù)據(jù)終端可能處理用戶的不同業(yè)務(wù),各個大數(shù)據(jù)終端之間有時也會進(jìn)行數(shù)據(jù)交互,也就是說,每個大數(shù)據(jù)終端可能會處理來自用戶和其他大數(shù)據(jù)終端的數(shù)據(jù)獲取請求,大數(shù)據(jù)終端從接收數(shù)據(jù)獲取請求到反饋數(shù)據(jù)所需的時間為響應(yīng)時間,很顯然,響應(yīng)時間越短,大數(shù)據(jù)終端的性能越好,用戶體驗也越好。
為了減少響應(yīng)時間,推送服務(wù)器會以設(shè)定周期獲取數(shù)據(jù)庫中的全量數(shù)據(jù),然后再將每個大數(shù)據(jù)終端的數(shù)據(jù)推送給對應(yīng)的大數(shù)據(jù)終端。按照相關(guān)的數(shù)據(jù)緩存方法,各個大數(shù)據(jù)終端以設(shè)定周期接收推送服務(wù)器推送的數(shù)據(jù),若大數(shù)據(jù)終端的內(nèi)存中存在已有數(shù)據(jù),則將接收到的數(shù)據(jù)替換已有數(shù)據(jù),若大數(shù)據(jù)終端的內(nèi)存中不存在已有數(shù)據(jù),則直接將接收到的數(shù)據(jù)保存在內(nèi)存中,當(dāng)大數(shù)據(jù)終端接收到數(shù)據(jù)獲取請求后,會從內(nèi)存緩存的數(shù)據(jù)中獲取需要的數(shù)據(jù)元素,并反饋給發(fā)送數(shù)據(jù)獲取請求的用戶或者其它大數(shù)據(jù)終端。
上述數(shù)據(jù)緩存方法中,為保證大數(shù)據(jù)終端可以正常處理數(shù)據(jù)獲取請求,在替換已有數(shù)據(jù)的過程中,內(nèi)存中會保存兩份數(shù)據(jù),由于這兩份數(shù)據(jù)都是在數(shù)據(jù)庫中保存的該大數(shù)據(jù)終端所需的全部數(shù)據(jù)元素,數(shù)據(jù)量非常大,替換數(shù)據(jù)的過程會占用很多內(nèi)存資源,從而容易造成內(nèi)存不足,甚至?xí)l(fā)內(nèi)存回收和大數(shù)據(jù)終端宕機。
技術(shù)實現(xiàn)要素:
本申請實施例提供一種數(shù)據(jù)緩存方法、數(shù)據(jù)查詢方法及裝置,用以解決相關(guān)技術(shù)中存在的替換數(shù)據(jù)的過程占用很多內(nèi)存資源,從而容易造成內(nèi)存不足,甚至?xí)l(fā)內(nèi)存回收和大數(shù)據(jù)終端宕機的問題。
根據(jù)本申請實施例,提供一種數(shù)據(jù)緩存方法,應(yīng)用在大數(shù)據(jù)終端中,包括:
接收待緩存數(shù)據(jù),針對所述待緩存數(shù)據(jù)包括的每個第一數(shù)據(jù)元素,執(zhí)行:
獲取所述第一數(shù)據(jù)元素的標(biāo)識;
確定所述大數(shù)據(jù)終端的內(nèi)存中是否保存所述第一數(shù)據(jù)元素的標(biāo)識對應(yīng)的已有數(shù)據(jù)元素;
若確定所述內(nèi)存中保存所述已有數(shù)據(jù)元素,則將所述已有數(shù)據(jù)元素替換為所述第一數(shù)據(jù)元素;
若確定所述內(nèi)存中未保存所述已有數(shù)據(jù)元素,確定所述內(nèi)存的存儲量是否達(dá)到設(shè)定閾值;若所述內(nèi)存的存儲量未達(dá)到所述設(shè)定閾值,則將所述第一數(shù)據(jù)元素及其標(biāo)識保存在所述內(nèi)存中;若所述內(nèi)存的存儲量達(dá)到所述設(shè)定閾值,則將所述第一數(shù)據(jù)元素保存在所述大數(shù)據(jù)終端的外部存儲器中,并將所述第一數(shù)據(jù)元素的標(biāo)識和存儲位置保存在所述內(nèi)存中。
具體的,獲取所述第一數(shù)據(jù)元素的標(biāo)識,具體包括:
從所述第一數(shù)據(jù)元素中查找選定字段;
獲取所述選定字段的數(shù)值,得到所述第一數(shù)據(jù)元素的標(biāo)識。
具體的,確定所述大數(shù)據(jù)終端的內(nèi)存中是否保存所述第一數(shù)據(jù)元素的標(biāo)識對應(yīng)的已有數(shù)據(jù)元素,具體包括:
獲取所述內(nèi)存中保存的帶有索引的雙向鏈表;
確定所述雙向鏈表的索引中是否包括所述第一數(shù)據(jù)元素的標(biāo)識;
若所述雙向鏈表的索引中包括所述第一數(shù)據(jù)元素的標(biāo)識,則確定所述內(nèi)存中保存所述已有數(shù)據(jù)元素;
若所述雙向鏈表的索引中未包括所述第一數(shù)據(jù)元素的標(biāo)識,則確定所述內(nèi)存中未保存所述已有數(shù)據(jù)元素。
可選的,確定所述內(nèi)存中保存所述已有數(shù)據(jù)元素之后,還包括:
獲取所述雙向鏈表中所述第一數(shù)據(jù)元素的標(biāo)識對應(yīng)的第一結(jié)點;
從所述第一結(jié)點的數(shù)據(jù)字段獲取所述已有數(shù)據(jù)元素;
對比所述第一數(shù)據(jù)元素包括的內(nèi)容與所述已有數(shù)據(jù)元素包括的內(nèi)容是否完全相同;
若所述第一數(shù)據(jù)元素包括的內(nèi)容與所述已有數(shù)據(jù)元素包括的內(nèi)容不完全相同,則執(zhí)行將所述已有數(shù)據(jù)元素替換為所述第一數(shù)據(jù)元素的步驟。
具體的,將所述第一數(shù)據(jù)元素及其標(biāo)識保存在所述內(nèi)存中,具體包括:
在所述雙向鏈表的索引中保存所述第一數(shù)據(jù)元素的標(biāo)識;
在所述雙向鏈表中建立與所述第一數(shù)據(jù)元素的標(biāo)識對應(yīng)的第二結(jié)點,并將所述第一數(shù)據(jù)元素保存在所述第二節(jié)點的數(shù)據(jù)字段中。
具體的,將所述第一數(shù)據(jù)元素保存在所述大數(shù)據(jù)終端的外部存儲器中,并將所述第一數(shù)據(jù)元素的標(biāo)識和存儲位置保存在所述內(nèi)存中,具體包括:
將所述第一數(shù)據(jù)元素保存在所述大數(shù)據(jù)終端的外部存儲器的文件中;
獲取所述第一數(shù)據(jù)元素在所述大數(shù)據(jù)終端的外部存儲器的存儲位置;
在所述內(nèi)存保存的標(biāo)識與存儲位置的對應(yīng)關(guān)系中建立包括所述第一數(shù)據(jù)元素的標(biāo)識與存儲位置的表項。
可選的,還包括:
接收用戶或者其它大數(shù)據(jù)終端發(fā)送的攜帶第二數(shù)據(jù)元素的標(biāo)識的數(shù)據(jù)獲取請求;
根據(jù)所述第二數(shù)據(jù)元素的標(biāo)識在所述內(nèi)存中查詢所述第二數(shù)據(jù)元素或者所述第二數(shù)據(jù)元素的存儲位置;
若查詢到所述第二數(shù)據(jù)元素,則將所述第二數(shù)據(jù)元素發(fā)送給所述用戶或者其它大數(shù)據(jù)終端;
若查詢到所述第二數(shù)據(jù)元素的存儲位置,則根據(jù)所述第二數(shù)據(jù)元素的存儲位置從所述外部存儲器獲取所述第二數(shù)據(jù)元素,并發(fā)送給所述用戶或者其它大數(shù)據(jù)終端;以及,將所述第二數(shù)據(jù)元素保存在所述內(nèi)存中。
可選的,根據(jù)所述第二數(shù)據(jù)元素的標(biāo)識在所述內(nèi)存中查詢所述第二數(shù)據(jù)元素或者所述第二數(shù)據(jù)元素的存儲位置,具體包括:
分別從所述內(nèi)存中保存的帶有索引的雙向鏈表中、以及標(biāo)識與存儲位置的對應(yīng)關(guān)系中查找所述第二數(shù)據(jù)元素的標(biāo)識;
若在所述雙向鏈表中查找到所述第二數(shù)據(jù)元素的標(biāo)識,則從所述雙向鏈表中獲取所述第二數(shù)據(jù)元素的標(biāo)識對應(yīng)的第三結(jié)點,并從所述第三結(jié)點的數(shù)據(jù)字段獲取所述第二數(shù)據(jù)元素;
若在所述對應(yīng)關(guān)系中查找到包括所述第二數(shù)據(jù)元素的標(biāo)識的表項,則在所述表項中獲取所述第二數(shù)據(jù)元素的存儲位置。
可選的,查詢到所述第二數(shù)據(jù)元素之后,還包括:
更新所述第三結(jié)點中所述第二數(shù)據(jù)元素的被訪問次數(shù);以及,
按照被訪問次數(shù)調(diào)整所述雙向鏈表中各個結(jié)點的位置,并相應(yīng)調(diào)整所述雙向鏈表中各 個結(jié)點中的指針。
具體的,將所述第二數(shù)據(jù)元素保存在所述內(nèi)存中,具體包括:
判斷所述內(nèi)存的存儲量是否達(dá)到所述設(shè)定閾值;
若所述內(nèi)存的存儲量達(dá)到所述設(shè)定閾值,則確定所述內(nèi)存中保存的被訪問次數(shù)最少的第三數(shù)據(jù)元素,將所述第三數(shù)據(jù)元素保存在所述外部存儲器中,并在所述對應(yīng)關(guān)系中保存包括所述第三數(shù)據(jù)元素的標(biāo)識和存儲位置的表項;刪除所述雙向鏈表的索引中保存的所述第三數(shù)據(jù)元素的標(biāo)識和所述雙向鏈表中所述第三數(shù)據(jù)元素所在的結(jié)點;在所述雙向鏈表中建立與所述第二數(shù)據(jù)元素的標(biāo)識對應(yīng)的第四結(jié)點,將所述第二數(shù)據(jù)元素保存在所述第四節(jié)點的數(shù)據(jù)字段中,并在所述雙向鏈表的索引中保存所述第二數(shù)據(jù)元素的標(biāo)識;更新所述第四結(jié)點中所述第二數(shù)據(jù)元素的被訪問次數(shù),按照被訪問次數(shù)調(diào)整所述雙向鏈表中各個結(jié)點的位置,并相應(yīng)調(diào)整所述雙向鏈表中各個結(jié)點中的指針;
若所述內(nèi)存的存儲量未達(dá)到所述設(shè)定閾值,則在所述雙向鏈表中建立與所述第二數(shù)據(jù)元素的標(biāo)識對應(yīng)的第五結(jié)點,將所述第二數(shù)據(jù)元素保存在所述第五節(jié)點的數(shù)據(jù)字段中,并在所述雙向鏈表的索引中保存所述第二數(shù)據(jù)元素的標(biāo)識;更新所述第五結(jié)點中所述第二數(shù)據(jù)元素的被訪問次數(shù),按照被訪問次數(shù)調(diào)整所述雙向鏈表中各個結(jié)點的位置,并相應(yīng)調(diào)整所述雙向鏈表中各個結(jié)點中的指針。
根據(jù)本申請實施例,還提供一種數(shù)據(jù)查詢方法,應(yīng)用在大數(shù)據(jù)終端中,包括:
接收用戶或者其它大數(shù)據(jù)終端發(fā)送的攜帶第二數(shù)據(jù)元素的標(biāo)識的數(shù)據(jù)獲取請求;
根據(jù)所述第二數(shù)據(jù)元素的標(biāo)識在所述大數(shù)據(jù)終端的內(nèi)存中查詢所述第二數(shù)據(jù)元素或者所述第二數(shù)據(jù)元素的存儲位置;
若查詢到所述第二數(shù)據(jù)元素,則將所述第二數(shù)據(jù)元素發(fā)送給所述用戶或者其它大數(shù)據(jù)終端;
若查詢到所述第二數(shù)據(jù)元素的存儲位置,則根據(jù)所述第二數(shù)據(jù)元素的存儲位置從所述大數(shù)據(jù)終端的外部存儲器獲取所述第二數(shù)據(jù)元素,并發(fā)送給所述用戶或者其它大數(shù)據(jù)終端;以及,將所述第二數(shù)據(jù)元素保存在所述內(nèi)存中。
具體的,根據(jù)所述第二數(shù)據(jù)元素的標(biāo)識在所述內(nèi)存中查詢所述第二數(shù)據(jù)元素或者所述第二數(shù)據(jù)元素的存儲位置,具體包括:
分別從所述內(nèi)存中保存的帶有索引的雙向鏈表中、以及標(biāo)識與存儲位置的對應(yīng)關(guān)系中查找所述第二數(shù)據(jù)元素的標(biāo)識;
若在所述雙向鏈表中查找到所述第二數(shù)據(jù)元素的標(biāo)識,則從所述雙向鏈表中獲取所述 第二數(shù)據(jù)元素的標(biāo)識對應(yīng)的第三結(jié)點,并從所述第三結(jié)點的數(shù)據(jù)字段獲取所述第二數(shù)據(jù)元素;
若在所述對應(yīng)關(guān)系中查找到包括所述第二數(shù)據(jù)元素的標(biāo)識的表項,則在所述表項中獲取所述第二數(shù)據(jù)元素的存儲位置。
可選的,查詢到所述第二數(shù)據(jù)元素之后,還包括:
更新所述第三結(jié)點中所述第二數(shù)據(jù)元素的被訪問次數(shù);以及,
按照被訪問次數(shù)調(diào)整所述雙向鏈表中各個結(jié)點的位置,并相應(yīng)調(diào)整所述雙向鏈表中各個結(jié)點中的指針。
具體的,將所述第二數(shù)據(jù)元素保存在所述內(nèi)存中,具體包括:
判斷所述內(nèi)存的存儲量是否達(dá)到所述設(shè)定閾值;
若所述內(nèi)存的存儲量達(dá)到所述設(shè)定閾值,則確定所述內(nèi)存中保存的被訪問次數(shù)最少的第三數(shù)據(jù)元素,將所述第三數(shù)據(jù)元素保存在所述外部存儲器中,并在所述對應(yīng)關(guān)系中保存包括所述第三數(shù)據(jù)元素的標(biāo)識和存儲位置的表項;刪除所述雙向鏈表的索引中保存的所述第三數(shù)據(jù)元素的標(biāo)識和所述雙向鏈表中所述第三數(shù)據(jù)元素所在的結(jié)點;在所述雙向鏈表中建立與所述第二數(shù)據(jù)元素的標(biāo)識對應(yīng)的第四結(jié)點,將所述第二數(shù)據(jù)元素保存在所述第四節(jié)點的數(shù)據(jù)字段中,并在所述雙向鏈表的索引中保存所述第二數(shù)據(jù)元素的標(biāo)識;更新所述第四結(jié)點中所述第二數(shù)據(jù)元素的被訪問次數(shù),按照被訪問次數(shù)調(diào)整所述雙向鏈表中各個結(jié)點的位置,并相應(yīng)調(diào)整所述雙向鏈表中各個結(jié)點中的指針;
若所述內(nèi)存的存儲量未達(dá)到所述設(shè)定閾值,則在所述雙向鏈表中建立與所述第二數(shù)據(jù)元素的標(biāo)識對應(yīng)的第五結(jié)點,將所述第二數(shù)據(jù)元素保存在所述第五節(jié)點的數(shù)據(jù)字段中,并在所述雙向鏈表的索引中保存所述第二數(shù)據(jù)元素的標(biāo)識;更新所述第五結(jié)點中所述第二數(shù)據(jù)元素的被訪問次數(shù),按照被訪問次數(shù)調(diào)整所述雙向鏈表中各個結(jié)點的位置,并相應(yīng)調(diào)整所述雙向鏈表中各個結(jié)點中的指針。
根據(jù)本申請實施例,還提供一種數(shù)據(jù)緩存裝置,應(yīng)用在大數(shù)據(jù)終端中,包括:
第一接收單元,用于接收待緩存數(shù)據(jù),針對所述待緩存數(shù)據(jù)包括的每個第一數(shù)據(jù)元素,執(zhí)行:
獲取單元,用于獲取所述第一數(shù)據(jù)元素的標(biāo)識;
確定單元,用于確定所述大數(shù)據(jù)終端的內(nèi)存中是否保存所述第一數(shù)據(jù)元素的標(biāo)識對應(yīng)的已有數(shù)據(jù)元素;
緩存單元,用于若確定所述內(nèi)存中保存所述已有數(shù)據(jù)元素,則將所述已有數(shù)據(jù)元素替 換為所述第一數(shù)據(jù)元素;若確定所述內(nèi)存中未保存所述已有數(shù)據(jù)元素,確定所述內(nèi)存的存儲量是否達(dá)到設(shè)定閾值;若所述內(nèi)存的存儲量未達(dá)到所述設(shè)定閾值,則將所述第一數(shù)據(jù)元素及其標(biāo)識保存在所述內(nèi)存中;若所述內(nèi)存的存儲量達(dá)到所述設(shè)定閾值,則將所述第一數(shù)據(jù)元素保存在所述大數(shù)據(jù)終端的外部存儲器中,并將所述第一數(shù)據(jù)元素的標(biāo)識和存儲位置保存在所述內(nèi)存中。
具體的,所述獲取單元,用于獲取所述第一數(shù)據(jù)元素的標(biāo)識,具體用于:
從所述第一數(shù)據(jù)元素中查找選定字段;
獲取所述選定字段的數(shù)值,得到所述第一數(shù)據(jù)元素的標(biāo)識。
具體的,所述確定單元,用于確定所述大數(shù)據(jù)終端的內(nèi)存中是否保存所述第一數(shù)據(jù)元素的標(biāo)識對應(yīng)的已有數(shù)據(jù)元素,具體包括:
獲取所述內(nèi)存中保存的帶有索引的雙向鏈表;
確定所述雙向鏈表的索引中是否包括所述第一數(shù)據(jù)元素的標(biāo)識;
若所述雙向鏈表的索引中包括所述第一數(shù)據(jù)元素的標(biāo)識,則確定所述內(nèi)存中保存所述已有數(shù)據(jù)元素;
若所述雙向鏈表的索引中未包括所述第一數(shù)據(jù)元素的標(biāo)識,則確定所述內(nèi)存中未保存所述已有數(shù)據(jù)元素。
可選的,所述確定單元,還用于:
確定所述內(nèi)存中保存所述已有數(shù)據(jù)元素之后,獲取所述雙向鏈表中所述第一數(shù)據(jù)元素的標(biāo)識對應(yīng)的第一結(jié)點;
從所述第一結(jié)點的數(shù)據(jù)字段獲取所述已有數(shù)據(jù)元素;
對比所述第一數(shù)據(jù)元素包括的內(nèi)容與所述已有數(shù)據(jù)元素包括的內(nèi)容是否完全相同;
若所述第一數(shù)據(jù)元素包括的內(nèi)容與所述已有數(shù)據(jù)元素包括的內(nèi)容不完全相同,則轉(zhuǎn)向所述緩存單元。
具體的,所述緩存單元,用于將所述第一數(shù)據(jù)元素及其標(biāo)識保存在所述內(nèi)存中,具體用于:
在所述雙向鏈表的索引中保存所述第一數(shù)據(jù)元素的標(biāo)識;
在所述雙向鏈表中建立與所述第一數(shù)據(jù)元素的標(biāo)識對應(yīng)的第二結(jié)點,并將所述第一數(shù)據(jù)元素保存在所述第二節(jié)點的數(shù)據(jù)字段中。
具體的,所述緩存單元,用于將所述第一數(shù)據(jù)元素保存在所述大數(shù)據(jù)終端的外部存儲 器中,并將所述第一數(shù)據(jù)元素的標(biāo)識和存儲位置保存在所述內(nèi)存中,具體用于:
將所述第一數(shù)據(jù)元素保存在所述大數(shù)據(jù)終端的外部存儲器的文件中;
獲取所述第一數(shù)據(jù)元素在所述大數(shù)據(jù)終端的外部存儲器的存儲位置;
在所述內(nèi)存保存的標(biāo)識與存儲位置的對應(yīng)關(guān)系中建立包括所述第一數(shù)據(jù)元素的標(biāo)識與存儲位置的表項。
可選的,還包括:
第二接收單元,用于接收用戶或者其它大數(shù)據(jù)終端發(fā)送的攜帶第二數(shù)據(jù)元素的標(biāo)識的數(shù)據(jù)獲取請求;
查詢單元,用于根據(jù)所述第二數(shù)據(jù)元素的標(biāo)識在所述內(nèi)存中查詢所述第二數(shù)據(jù)元素或者所述第二數(shù)據(jù)元素的存儲位置;
發(fā)送單元,用于若查詢到所述第二數(shù)據(jù)元素,則將所述第二數(shù)據(jù)元素發(fā)送給所述用戶或者其它大數(shù)據(jù)終端;若查詢到所述第二數(shù)據(jù)元素的存儲位置,則根據(jù)所述第二數(shù)據(jù)元素的存儲位置從所述外部存儲器獲取所述第二數(shù)據(jù)元素,并發(fā)送給所述用戶或者其它大數(shù)據(jù)終端;以及,將所述第二數(shù)據(jù)元素保存在所述內(nèi)存中。
具體的,所述查詢單元,用于根據(jù)所述第二數(shù)據(jù)元素的標(biāo)識在所述內(nèi)存中查詢所述第二數(shù)據(jù)元素或者所述第二數(shù)據(jù)元素的存儲位置,具體用于:
分別從所述內(nèi)存中保存的帶有索引的雙向鏈表中、以及標(biāo)識與存儲位置的對應(yīng)關(guān)系中查找所述第二數(shù)據(jù)元素的標(biāo)識;
若在所述雙向鏈表中查找到所述第二數(shù)據(jù)元素的標(biāo)識,則從所述雙向鏈表中獲取所述第二數(shù)據(jù)元素的標(biāo)識對應(yīng)的第三結(jié)點,并從所述第三結(jié)點的數(shù)據(jù)字段獲取所述第二數(shù)據(jù)元素;
若在所述對應(yīng)關(guān)系中查找到包括所述第二數(shù)據(jù)元素的標(biāo)識的表項,則在所述表項中獲取所述第二數(shù)據(jù)元素的存儲位置。
可選的,所述發(fā)送單元,還用于:
在所述查詢單元查詢到所述第二數(shù)據(jù)元素之后,更新所述第三結(jié)點中所述第二數(shù)據(jù)元素的被訪問次數(shù);以及,
按照被訪問次數(shù)調(diào)整所述雙向鏈表中各個結(jié)點的位置,并相應(yīng)調(diào)整所述雙向鏈表中各個結(jié)點中的指針。
具體的,所述發(fā)送單元,用于將所述第二數(shù)據(jù)元素保存在所述內(nèi)存中,具體用于:
判斷所述內(nèi)存的存儲量是否達(dá)到所述設(shè)定閾值;
若所述內(nèi)存的存儲量達(dá)到所述設(shè)定閾值,則確定所述內(nèi)存中保存的被訪問次數(shù)最少的第三數(shù)據(jù)元素,將所述第三數(shù)據(jù)元素保存在所述外部存儲器中,并在所述對應(yīng)關(guān)系中保存包括所述第三數(shù)據(jù)元素的標(biāo)識和存儲位置的表項;刪除所述雙向鏈表的索引中保存的所述第三數(shù)據(jù)元素的標(biāo)識和所述雙向鏈表中所述第三數(shù)據(jù)元素所在的結(jié)點;在所述雙向鏈表中建立與所述第二數(shù)據(jù)元素的標(biāo)識對應(yīng)的第四結(jié)點,將所述第二數(shù)據(jù)元素保存在所述第四節(jié)點的數(shù)據(jù)字段中,并在所述雙向鏈表的索引中保存所述第二數(shù)據(jù)元素的標(biāo)識;更新所述第四結(jié)點中所述第二數(shù)據(jù)元素的被訪問次數(shù),按照被訪問次數(shù)調(diào)整所述雙向鏈表中各個結(jié)點的位置,并相應(yīng)調(diào)整所述雙向鏈表中各個結(jié)點中的指針;
若所述內(nèi)存的存儲量未達(dá)到所述設(shè)定閾值,則在所述雙向鏈表中建立與所述第二數(shù)據(jù)元素的標(biāo)識對應(yīng)的第五結(jié)點,將所述第二數(shù)據(jù)元素保存在所述第五節(jié)點的數(shù)據(jù)字段中,并在所述雙向鏈表的索引中保存所述第二數(shù)據(jù)元素的標(biāo)識;更新所述第五結(jié)點中所述第二數(shù)據(jù)元素的被訪問次數(shù),按照被訪問次數(shù)調(diào)整所述雙向鏈表中各個結(jié)點的位置,并相應(yīng)調(diào)整所述雙向鏈表中各個結(jié)點中的指針。
根據(jù)本申請實施例,還提供一種數(shù)據(jù)查詢裝置,應(yīng)用在大數(shù)據(jù)終端中,包括:
接收單元,用于接收用戶或者其它大數(shù)據(jù)終端發(fā)送的攜帶第二數(shù)據(jù)元素的標(biāo)識的數(shù)據(jù)獲取請求;
查詢單元,用于根據(jù)所述第二數(shù)據(jù)元素的標(biāo)識在所述大數(shù)據(jù)終端的內(nèi)存中查詢所述第二數(shù)據(jù)元素或者所述第二數(shù)據(jù)元素的存儲位置;
發(fā)送單元,用于若查詢到所述第二數(shù)據(jù)元素,則將所述第二數(shù)據(jù)元素發(fā)送給所述用戶或者其它大數(shù)據(jù)終端;若查詢到所述第二數(shù)據(jù)元素的存儲位置,則根據(jù)所述第二數(shù)據(jù)元素的存儲位置從所述大數(shù)據(jù)終端的外部存儲器獲取所述第二數(shù)據(jù)元素,并發(fā)送給所述用戶或者其它大數(shù)據(jù)終端;以及,將所述第二數(shù)據(jù)元素保存在所述內(nèi)存中。
具體的,所述查詢單元,用于根據(jù)所述第二數(shù)據(jù)元素的標(biāo)識在所述內(nèi)存中查詢所述第二數(shù)據(jù)元素或者所述第二數(shù)據(jù)元素的存儲位置,具體用于:
分別從所述內(nèi)存中保存的帶有索引的雙向鏈表中、以及標(biāo)識與存儲位置的對應(yīng)關(guān)系中查找所述第二數(shù)據(jù)元素的標(biāo)識;
若在所述雙向鏈表中查找到所述第二數(shù)據(jù)元素的標(biāo)識,則從所述雙向鏈表中獲取所述第二數(shù)據(jù)元素的標(biāo)識對應(yīng)的第三結(jié)點,并從所述第三結(jié)點的數(shù)據(jù)字段獲取所述第二數(shù)據(jù)元素;
若在所述對應(yīng)關(guān)系中查找到包括所述第二數(shù)據(jù)元素的標(biāo)識的表項,則在所述表項中獲 取所述第二數(shù)據(jù)元素的存儲位置。
可選的,所述發(fā)送單元,還用于:
在所述查詢單元查詢到所述第二數(shù)據(jù)元素之后,更新所述第三結(jié)點中所述第二數(shù)據(jù)元素的被訪問次數(shù);以及,
按照被訪問次數(shù)調(diào)整所述雙向鏈表中各個結(jié)點的位置,并相應(yīng)調(diào)整所述雙向鏈表中各個結(jié)點中的指針。
具體的,所述發(fā)送單元,用于將所述第二數(shù)據(jù)元素保存在所述內(nèi)存中,具體用于:
判斷所述內(nèi)存的存儲量是否達(dá)到所述設(shè)定閾值;
若所述內(nèi)存的存儲量達(dá)到所述設(shè)定閾值,則確定所述內(nèi)存中保存的被訪問次數(shù)最少的第三數(shù)據(jù)元素,將所述第三數(shù)據(jù)元素保存在所述外部存儲器中,并在所述對應(yīng)關(guān)系中保存包括所述第三數(shù)據(jù)元素的標(biāo)識和存儲位置的表項;刪除所述雙向鏈表的索引中保存的所述第三數(shù)據(jù)元素的標(biāo)識和所述雙向鏈表中所述第三數(shù)據(jù)元素所在的結(jié)點;在所述雙向鏈表中建立與所述第二數(shù)據(jù)元素的標(biāo)識對應(yīng)的第四結(jié)點,將所述第二數(shù)據(jù)元素保存在所述第四節(jié)點的數(shù)據(jù)字段中,并在所述雙向鏈表的索引中保存所述第二數(shù)據(jù)元素的標(biāo)識;更新所述第四結(jié)點中所述第二數(shù)據(jù)元素的被訪問次數(shù),按照被訪問次數(shù)調(diào)整所述雙向鏈表中各個結(jié)點的位置,并相應(yīng)調(diào)整所述雙向鏈表中各個結(jié)點中的指針;
若所述內(nèi)存的存儲量未達(dá)到所述設(shè)定閾值,則在所述雙向鏈表中建立與所述第二數(shù)據(jù)元素的標(biāo)識對應(yīng)的第五結(jié)點,將所述第二數(shù)據(jù)元素保存在所述第五節(jié)點的數(shù)據(jù)字段中,并在所述雙向鏈表的索引中保存所述第二數(shù)據(jù)元素的標(biāo)識;更新所述第五結(jié)點中所述第二數(shù)據(jù)元素的被訪問次數(shù),按照被訪問次數(shù)調(diào)整所述雙向鏈表中各個結(jié)點的位置,并相應(yīng)調(diào)整所述雙向鏈表中各個結(jié)點中的指針。
本申請實施例提供一種數(shù)據(jù)緩存方法、數(shù)據(jù)查詢方法及裝置,接收待緩存數(shù)據(jù),針對所述待緩存數(shù)據(jù)包括的每個第一數(shù)據(jù)元素,執(zhí)行:獲取所述第一數(shù)據(jù)元素的標(biāo)識;確定所述大數(shù)據(jù)終端的內(nèi)存中是否保存所述第一數(shù)據(jù)元素的標(biāo)識對應(yīng)的已有數(shù)據(jù)元素;若確定所述內(nèi)存中保存所述已有數(shù)據(jù)元素,則將所述已有數(shù)據(jù)元素替換為所述第一數(shù)據(jù)元素;若確定所述內(nèi)存中未保存所述已有數(shù)據(jù)元素,確定所述內(nèi)存的存儲量是否達(dá)到設(shè)定閾值;若所述內(nèi)存的存儲量未達(dá)到所述設(shè)定閾值,則將所述第一數(shù)據(jù)元素及其標(biāo)識保存在所述內(nèi)存中;若所述內(nèi)存的存儲量達(dá)到所述設(shè)定閾值,則將所述第一數(shù)據(jù)元素保存在所述大數(shù)據(jù)終端的外部存儲器中,并將所述第一數(shù)據(jù)元素的標(biāo)識和存儲位置保存在所述內(nèi)存中。該方案中,并不是將推送服務(wù)器或者數(shù)據(jù)庫推送的待緩存數(shù)據(jù)都保存在內(nèi)存中,而是采用內(nèi)存和外部存儲相結(jié)合的方式來保存待緩存數(shù)據(jù),內(nèi)存的存儲量始終控制在設(shè)定閾值之內(nèi),從而可以 有效避免相關(guān)技術(shù)中替換數(shù)據(jù)的過程占用很多內(nèi)存資源,從而容易造成內(nèi)存不足,甚至?xí)l(fā)內(nèi)存回收和大數(shù)據(jù)終端宕機的問題。
附圖說明
此處所說明的附圖用來提供對本申請的進(jìn)一步理解,構(gòu)成本申請的一部分,本申請的示意性實施例及其說明用于解釋本申請,并不構(gòu)成對本申請的不當(dāng)限定。在附圖中:
圖1為本申請實施例中一種數(shù)據(jù)緩存方法的流程圖;
圖2為本申請實施例中S12的流程圖;
圖3為本申請實施例中S13的流程圖;
圖4為本申請實施例中帶有索引的雙向鏈表的結(jié)構(gòu)示意圖;
圖5為本申請實施例中一種數(shù)據(jù)查詢方法的流程圖;
圖6為本申請實施例中一種數(shù)據(jù)緩存裝置的結(jié)構(gòu)示意圖;
圖7為本申請實施例中另一種數(shù)據(jù)緩存裝置的結(jié)構(gòu)示意圖;
圖8為本申請實施例中一種數(shù)據(jù)查詢裝置的結(jié)構(gòu)示意圖。
具體實施方式
為了使本申請所要解決的技術(shù)問題、技術(shù)方案及有益效果更加清楚、明白,以下結(jié)合附圖和實施例,對本申請進(jìn)行進(jìn)一步詳細(xì)說明。應(yīng)當(dāng)理解,此處所描述的具體實施例僅僅用以解釋本申請,并不用于限定本申請。
為了解決相關(guān)技術(shù)中存在的替換數(shù)據(jù)的過程占用很多內(nèi)存資源,從而容易造成內(nèi)存不足,甚至?xí)l(fā)內(nèi)存回收和大數(shù)據(jù)終端宕機的問題,本申請實施例提供一種數(shù)據(jù)緩存方法,該方法可以但不限于應(yīng)用在大數(shù)據(jù)終端中,該大數(shù)據(jù)終端可以是網(wǎng)站的服務(wù)端中唯一的大數(shù)據(jù)終端,也可以是大數(shù)據(jù)終端集群中的任一個大數(shù)據(jù)終端,該方法的流程如圖1所示,具體包括如下步驟:
S11:接收待緩存數(shù)據(jù),針對待緩存數(shù)據(jù)包括的每個第一數(shù)據(jù)元素,執(zhí)行S12。
待緩存數(shù)據(jù)可能是推送服務(wù)器或者數(shù)據(jù)庫推送的,下面分別介紹推送服務(wù)器和數(shù)據(jù)庫推送待緩存數(shù)據(jù)的情況。
推送服務(wù)器會在以下兩種情況推送待緩存數(shù)據(jù):
第一種情況,推送服務(wù)器以第一周期從數(shù)據(jù)庫獲取全量數(shù)據(jù)并從中選取出各個大數(shù)據(jù)終端所需的數(shù)據(jù),得到各個大數(shù)據(jù)終端的待緩存數(shù)據(jù),然后推送給對應(yīng)的大數(shù)據(jù)終端,第一周期可以根據(jù)實際需要進(jìn)行設(shè)定,可以設(shè)定為1天、2天等等,優(yōu)選的是選擇每天業(yè)務(wù)量比較少的時段進(jìn)行推送,例如每天0點、0點30分等等。
第二種情況,推送服務(wù)器還會以第二周期從數(shù)據(jù)庫獲取更新數(shù)據(jù)并從中選取出各個大數(shù)據(jù)終端的更新數(shù)據(jù),得到各個大數(shù)據(jù)終端的待緩存數(shù)據(jù),然后推送給對應(yīng)的大數(shù)據(jù)終端,第二周期小于第一周期,可以根據(jù)實際需要進(jìn)行設(shè)定,可以設(shè)定為1小時、2小時、3小時等等。由于推送服務(wù)器定時推送各個大數(shù)據(jù)終端的更新數(shù)據(jù),從而可以確保大數(shù)據(jù)終端中保存的是最新、最全的數(shù)據(jù),進(jìn)而確保大數(shù)據(jù)終端可以實時處理來自用戶的業(yè)務(wù),減少業(yè)務(wù)處理延時。
數(shù)據(jù)庫會在以下情況推送待緩存數(shù)據(jù),當(dāng)大數(shù)據(jù)終端初始化時,首先向推送服務(wù)器注冊,然后推送服務(wù)器將從數(shù)據(jù)庫獲取的全量數(shù)據(jù)中選取出該大數(shù)據(jù)終端所需的數(shù)據(jù)推送給該大數(shù)據(jù)終端,若推送服務(wù)器以第一設(shè)定周期向各個大數(shù)據(jù)終端推動待緩存數(shù)據(jù),也就是說推送服務(wù)器推送的是固定時間之前的數(shù)據(jù),為了確保獲取到最新的數(shù)據(jù),大數(shù)據(jù)終端可以自行向數(shù)據(jù)庫請求當(dāng)前時間到固定時間之間的數(shù)據(jù),數(shù)據(jù)庫將大數(shù)據(jù)終端請求的數(shù)據(jù)推送該大數(shù)據(jù)終端。例如,若推送服務(wù)器在每天0點定時向大數(shù)據(jù)終端推送數(shù)據(jù),而當(dāng)前時刻是13點,那么今天0點到13點之間的數(shù)據(jù)需要大數(shù)據(jù)終端向數(shù)據(jù)庫請求,數(shù)據(jù)庫將今天0點到13點之間的數(shù)據(jù)推送給大數(shù)據(jù)終端。
S12:獲取第一數(shù)據(jù)元素的標(biāo)識。
S13:確定大數(shù)據(jù)終端的內(nèi)存中是否保存第一數(shù)據(jù)元素的標(biāo)識對應(yīng)的已有數(shù)據(jù)元素,若確定內(nèi)存中保存已有數(shù)據(jù)元素,執(zhí)行S14;若確定內(nèi)存中未保存已有數(shù)據(jù)元素,執(zhí)行S15。
一個數(shù)據(jù)元素包括的數(shù)據(jù)量可能會比較大,在確定大數(shù)據(jù)終端的內(nèi)存中是否保存第一數(shù)據(jù)元素時,可以獲取第一數(shù)據(jù)元素的標(biāo)識,然后確定大數(shù)據(jù)終端的內(nèi)存中是否保存第一數(shù)據(jù)元素的標(biāo)識對應(yīng)的已有數(shù)據(jù)元素,由于第一數(shù)據(jù)元素的標(biāo)識數(shù)據(jù)量非常小,從而可以大大減少大數(shù)據(jù)終端的工作量,提升數(shù)據(jù)緩存效率。
S14:將已有數(shù)據(jù)元素替換為第一數(shù)據(jù)元素。
若內(nèi)存中保存已有數(shù)據(jù)元素,為了確保內(nèi)存中保存的是最新的數(shù)據(jù)元素,可以直接將已有數(shù)據(jù)元素替換為第一數(shù)據(jù)元素。
S15:確定內(nèi)存的存儲量是否達(dá)到設(shè)定閾值,若內(nèi)存的存儲量未達(dá)到設(shè)定閾值,執(zhí)行S16;若內(nèi)存的存儲量達(dá)到設(shè)定閾值,執(zhí)行S17。
若內(nèi)存中未保存已有數(shù)據(jù)元素,則需要確定第一數(shù)據(jù)元素是保存在內(nèi)存中還是保存在 大數(shù)據(jù)終端的外部存儲器中,具體可以確定內(nèi)存是否還有存儲空間,即判斷內(nèi)存的存儲量是否達(dá)到設(shè)定閾值,設(shè)定閾值可以根據(jù)實際需要進(jìn)行設(shè)定。
S16:將第一數(shù)據(jù)元素及其標(biāo)識保存在內(nèi)存中。
S17:將第一數(shù)據(jù)元素保存在大數(shù)據(jù)終端的外部存儲器中,并將第一數(shù)據(jù)元素的標(biāo)識和存儲位置保存在內(nèi)存中。
若內(nèi)存的存儲量達(dá)到設(shè)定閾值,則需要將第一數(shù)據(jù)元素保存在外部存儲器中。其中,第一數(shù)據(jù)元素的標(biāo)識和存儲位置可以采用鍵(Key)/值(Vlaue)對的形式保存在內(nèi)存中,Key為第一數(shù)據(jù)元素的標(biāo)識,Value為第一數(shù)據(jù)元素在外部存儲器中的存儲位置。在一個實施方式中,該存儲位置具體可以是外部存儲器的偏移量。在另一個實施方式中,該存儲位置具體可以是外部存儲器中的離散存儲位置。
該方案中,并不是將推送服務(wù)器或者數(shù)據(jù)庫推送的待緩存數(shù)據(jù)都保存在內(nèi)存中,而是采用內(nèi)存和外部存儲相結(jié)合的方式來保存待緩存數(shù)據(jù),內(nèi)存的存儲量始終控制在設(shè)定閾值之內(nèi),從而可以有效避免相關(guān)技術(shù)中替換數(shù)據(jù)的過程占用很多內(nèi)存資源,從而容易造成內(nèi)存不足,甚至?xí)l(fā)內(nèi)存回收和大數(shù)據(jù)終端宕機的問題。
下面詳細(xì)介紹上述數(shù)據(jù)緩存方法中的每個步驟。
具體的,上述S12中的獲取一數(shù)據(jù)元素的標(biāo)識的實現(xiàn)過程如圖2所示,具體包括如下步驟:
S121:從第一數(shù)據(jù)元素中查找選定字段。
S122:獲取選定字段的數(shù)值,得到第一數(shù)據(jù)元素的標(biāo)識。
第一數(shù)據(jù)元素中通常包括很多與其他數(shù)據(jù)元素相區(qū)別的唯一字段,可以從中選取出一個或多個字段得到選定字段,將該選定字段的數(shù)值作為第一數(shù)據(jù)元素的標(biāo)識,該標(biāo)識為第一數(shù)據(jù)元素的全局唯一標(biāo)示符,可以是包括數(shù)字、字母、字符等等形式,也可以包括數(shù)字、字母、字符等等各種形式的組合。
具體的,上述S13中確定大數(shù)據(jù)終端的內(nèi)存中是否保存第一數(shù)據(jù)元素的標(biāo)識對應(yīng)的已有數(shù)據(jù)元素的實現(xiàn)過程如圖3所示,具體包括如下步驟:
S131:獲取內(nèi)存中保存的帶有索引的雙向鏈表。
內(nèi)存中數(shù)據(jù)元素的存儲結(jié)構(gòu)可以采用多種形式,例如雙向鏈表、數(shù)據(jù)表格等等,下面以如圖4所示帶有索引的雙向鏈表為例進(jìn)行說明,其中:
表頭指針(Head):鏈表的第一個結(jié)點指針,可以從這個表頭指針找到鏈表的第一個結(jié)點;
前結(jié)點指針(Pre):指向當(dāng)前結(jié)點的上一個結(jié)點,如果沒有上一個結(jié)點,表明當(dāng)前結(jié)點是第一個結(jié)點;
后結(jié)點指針(Next):指向當(dāng)前結(jié)點的下一個結(jié)點,沒有沒有下一個結(jié)點,表明當(dāng)前結(jié)點就是最后一個結(jié)點;
數(shù)據(jù)字段(data):當(dāng)前結(jié)點的數(shù)據(jù)實體,可以是業(yè)務(wù)數(shù)據(jù)等等;
表尾結(jié)點(Tail):鏈表的最后一個結(jié)點指針,可以從這個表尾結(jié)點找到鏈表的最后一個結(jié)點。
上述帶有索引的雙向鏈表采用Key/Vlaue對的形式,其中,數(shù)據(jù)元素的標(biāo)識為Key,數(shù)據(jù)元素所在的結(jié)點為Value。
S132:確定雙向鏈表的索引中是否包括第一數(shù)據(jù)元素的標(biāo)識,若雙向鏈表的索引中包括第一數(shù)據(jù)元素的標(biāo)識,執(zhí)行S133;若雙向鏈表的索引中未包括第一數(shù)據(jù)元素的標(biāo)識,執(zhí)行S134。
S133:確定內(nèi)存中保存已有數(shù)據(jù)元素。
S134:確定內(nèi)存中未保存已有數(shù)據(jù)元素。
由于帶有索引的雙向鏈表中數(shù)據(jù)元素的標(biāo)識與該數(shù)據(jù)元素所在的結(jié)點是一一對應(yīng)的,因此,可以根據(jù)雙向鏈表的索引中是否保存第一數(shù)據(jù)元素的標(biāo)識來確定內(nèi)存中是否保存第一數(shù)據(jù)元素,從而可以快速確定內(nèi)存中是否保存第一數(shù)據(jù)元素,提高數(shù)據(jù)緩存效率。
可選的,在確定內(nèi)存中保存已有數(shù)據(jù)元素之后,執(zhí)行S16之前,還包括:
獲取雙向鏈表中第一數(shù)據(jù)元素的標(biāo)識對應(yīng)的第一結(jié)點;
從第一結(jié)點的數(shù)據(jù)字段獲取已有數(shù)據(jù)元素;
對比第一數(shù)據(jù)元素包括的內(nèi)容與已有數(shù)據(jù)元素包括的內(nèi)容是否完全相同;
若第一數(shù)據(jù)元素包括的內(nèi)容與已有數(shù)據(jù)元素包括的內(nèi)容不完全相同,則執(zhí)行S16。
若內(nèi)存中保存已有數(shù)據(jù)元素,可以進(jìn)一步確定已有數(shù)據(jù)元素與第一數(shù)據(jù)元素是否相同,若第一數(shù)據(jù)元素與已有數(shù)據(jù)元素不同,也就是說第一數(shù)據(jù)元素相對于已有數(shù)據(jù)元素的內(nèi)容有了一定的更新,由于標(biāo)識沒有改變,只需要將已有數(shù)據(jù)元素替換為第一數(shù)據(jù)元素即可;若第一數(shù)據(jù)元素與已有數(shù)據(jù)元素相同,那么就可以忽略第一數(shù)據(jù)元素,繼續(xù)針對下一個數(shù)據(jù)元素進(jìn)行判斷。
在一個替換實施方式中,也可以省略將第一數(shù)據(jù)元素包括的內(nèi)容與已有數(shù)據(jù)元素包括的內(nèi)容進(jìn)行比較的步驟,直接將已有數(shù)據(jù)元素替換為第一數(shù)據(jù)元素。即,不論已有數(shù)據(jù)元 素的內(nèi)容如何,始終默認(rèn)所獲取的第一數(shù)據(jù)元素為最新的值,因而執(zhí)行替換操作。
具體的,當(dāng)內(nèi)存中的存儲結(jié)構(gòu)為采用帶有索引的雙向鏈表時,上述S16中將已有數(shù)據(jù)元素替換為第一數(shù)據(jù)元素,具體包括:刪除第一結(jié)點的數(shù)據(jù)字段中保存的已有數(shù)據(jù)元素;將第一數(shù)據(jù)元素保存在第一結(jié)點的數(shù)據(jù)字段中。
替換已有數(shù)據(jù)元素時,實際上就是將第一數(shù)據(jù)元素的標(biāo)識對應(yīng)的第一結(jié)點中的數(shù)據(jù)字段中保存的數(shù)據(jù)元素替換為第一數(shù)據(jù)元素。
相應(yīng)地,上述S17中將第一數(shù)據(jù)元素及其標(biāo)識保存在內(nèi)存中,具體包括:在雙向鏈表的索引中保存第一數(shù)據(jù)元素的標(biāo)識;在雙向鏈表中建立與第一數(shù)據(jù)元素的標(biāo)識對應(yīng)的第二結(jié)點,并將第一數(shù)據(jù)元素保存在第二節(jié)點的數(shù)據(jù)字段中。
在內(nèi)存中保存第一數(shù)據(jù)元素及其標(biāo)識,就是要在帶有索引的雙向鏈表中建立Key/Value對,Key為第一數(shù)據(jù)元素的標(biāo)識,Value為包括第一數(shù)據(jù)元素的第二結(jié)點。
相應(yīng)地,上述S17中的將第一數(shù)據(jù)元素保存在大數(shù)據(jù)終端的外部存儲器中,并將第一數(shù)據(jù)元素的標(biāo)識和存儲位置保存在內(nèi)存中,具體包括:將第一數(shù)據(jù)元素保存在大數(shù)據(jù)終端的外部存儲器的文件中;獲取第一數(shù)據(jù)元素在大數(shù)據(jù)終端的外部存儲器的存儲位置;在內(nèi)存保存的標(biāo)識與存儲位置的對應(yīng)關(guān)系中建立包括第一數(shù)據(jù)元素的標(biāo)識與存儲位置的表項。
外部存儲器可以根據(jù)實際需要進(jìn)行設(shè)定,優(yōu)選的可以采用具有高數(shù)據(jù)讀取/寫入速度的大容量存儲設(shè)備,諸如,固態(tài)硬盤(Solid State Drives,SSD),也可以采用普通的大容量存儲設(shè)備。外部存儲器中的數(shù)據(jù)元素可以保存在一個文件中,當(dāng)然還可以采用其他的存儲方式,這里不再贅述。
以上介紹了數(shù)據(jù)緩存方法,大數(shù)據(jù)終端在對數(shù)據(jù)進(jìn)行緩存后,還會從緩存的數(shù)據(jù)中查找需要的數(shù)據(jù)元素,本申請實施例還提供一種數(shù)據(jù)查詢方法,該方法可以但不限于應(yīng)用在大數(shù)據(jù)終端中,該方法的流程如圖5所示,包括如下步驟:
S51:接收用戶或者其它大數(shù)據(jù)終端發(fā)送的攜帶第二數(shù)據(jù)元素的標(biāo)識的數(shù)據(jù)獲取請求。
當(dāng)用戶或者其它大數(shù)據(jù)終端需要獲取數(shù)據(jù)元素時,這些數(shù)據(jù)元素可以定義為第二數(shù)據(jù)元素,可以向大數(shù)據(jù)終端發(fā)送攜帶第二數(shù)據(jù)元素的標(biāo)識的數(shù)據(jù)獲取請求。
S52:根據(jù)第二數(shù)據(jù)元素的標(biāo)識在大數(shù)據(jù)終端的內(nèi)存中查詢第二數(shù)據(jù)元素或者第二數(shù)據(jù)元素的存儲位置,若查詢到第二數(shù)據(jù)元素,執(zhí)行S53;若查詢到第二數(shù)據(jù)元素的存儲位置,執(zhí)行S54。
由于大數(shù)據(jù)終端的內(nèi)存中保存數(shù)據(jù)元素或者數(shù)據(jù)元素的存儲位置,并且內(nèi)存中的查詢速度非??欤虼?,可以直接在內(nèi)存中查找第二數(shù)據(jù)元素或者第二數(shù)據(jù)元素的存儲位置。
具體的,可以分別從內(nèi)存中保存的帶有索引的雙向鏈表中、以及標(biāo)識與存儲位置的對應(yīng)關(guān)系中查找第二數(shù)據(jù)元素的標(biāo)識;若在雙向鏈表中查找到第二數(shù)據(jù)元素的標(biāo)識,則從雙向鏈表中獲取第二數(shù)據(jù)元素的標(biāo)識對應(yīng)的第三結(jié)點,并從第三結(jié)點的數(shù)據(jù)字段獲取第二數(shù)據(jù)元素;若在對應(yīng)關(guān)系中查找到包括第二數(shù)據(jù)元素的標(biāo)識的表項,則在表項中獲取第二數(shù)據(jù)元素的存儲位置。
S53:將第二數(shù)據(jù)元素發(fā)送給用戶或者其它大數(shù)據(jù)終端。
S54:根據(jù)第二數(shù)據(jù)元素的存儲位置從大數(shù)據(jù)終端的外部存儲器獲取第二數(shù)據(jù)元素,并發(fā)送給用戶或者其它大數(shù)據(jù)終端;以及,將第二數(shù)據(jù)元素保存在內(nèi)存中。
該方案中,由于大數(shù)據(jù)終端中的數(shù)據(jù)元素采用內(nèi)存加外部存儲相結(jié)合的方式,而保存在外部存儲器中的數(shù)據(jù)元素的標(biāo)識和存儲位置保存在內(nèi)存中,相應(yīng)地,在查詢第二數(shù)據(jù)元素時,若第二數(shù)據(jù)元素保存在內(nèi)存中,可以直接獲取第二數(shù)據(jù)元素,若第二數(shù)據(jù)元素保存在外部存儲器中,可以在內(nèi)存中查詢到第二數(shù)據(jù)元素的存儲位置,因此,即使第二數(shù)據(jù)元素保存在外部存儲器中,也可以快速獲取第二數(shù)據(jù)元素的存儲位置,進(jìn)而獲取第二數(shù)據(jù)元素,從而減少數(shù)據(jù)查詢的延時,確保數(shù)據(jù)查詢的實時性,提升了用戶體驗。
下面詳細(xì)介紹上述數(shù)據(jù)查詢方法的各個步驟。
可選的,查詢到第二數(shù)據(jù)元素之后,還包括:
更新第三結(jié)點中第二數(shù)據(jù)元素的被訪問次數(shù);以及,
按照被訪問次數(shù)調(diào)整雙向鏈表中各個結(jié)點的位置,并相應(yīng)調(diào)整雙向鏈表中各個結(jié)點中的指針。
若內(nèi)存的存儲結(jié)構(gòu)為帶索引的雙向鏈表,可以在雙向鏈表的每個結(jié)點中增加計數(shù)器(counter)指針,用來記錄對應(yīng)結(jié)點中數(shù)據(jù)元素的被訪問次數(shù)。在一個替換實施方式中,若雙向鏈表中的結(jié)點是按照數(shù)據(jù)元素的被訪問次數(shù)大小排序的,在更新第三結(jié)點中第二數(shù)據(jù)元素的被訪問次數(shù)后,還需要調(diào)整第二數(shù)據(jù)元素的位置。即,舉例而言,第二數(shù)據(jù)元素為A,雙向鏈表中的兩個數(shù)據(jù)元素B和C,則當(dāng)更新完A的被訪問次數(shù)后,從A所在的結(jié)點開始向前查找被訪問次數(shù)大于A的結(jié)點,假設(shè)查找到B的被訪問次數(shù)大于A,C的被訪問次數(shù)小于A,則將A所在的結(jié)點調(diào)整到B所在的結(jié)點之后、C所在的結(jié)點之前,并調(diào)整A、B、C所在結(jié)點中的指針。
可選的,上述S54中將第二數(shù)據(jù)元素保存在內(nèi)存中之后,為了避免重復(fù)保存,還可以刪除內(nèi)存中保存的第二數(shù)據(jù)元素的存儲位置和外部存儲器中保存的第二數(shù)據(jù)元素,具體過程為:從對應(yīng)關(guān)系中刪除包括第二數(shù)據(jù)元素的標(biāo)識及其存儲位置的表項;以及,從外部存儲器中刪除第二數(shù)據(jù)元素。
具體的,上述S54中的將第二數(shù)據(jù)元素保存在內(nèi)存中的實現(xiàn)過程,具體包括以下步驟:
第一步,判斷內(nèi)存的存儲量是否達(dá)到設(shè)定閾值,若內(nèi)存的存儲量達(dá)到設(shè)定閾值,執(zhí)行第二步;若內(nèi)存的存儲量未達(dá)到設(shè)定閾值,執(zhí)行第三步。
第二步,確定內(nèi)存中保存的被訪問次數(shù)最少的第三數(shù)據(jù)元素,將第三數(shù)據(jù)元素保存在外部存儲器中,并在對應(yīng)關(guān)系中保存包括第三數(shù)據(jù)元素的標(biāo)識和存儲位置的表項;刪除雙向鏈表的索引中保存的第三數(shù)據(jù)元素的標(biāo)識和雙向鏈表中第三數(shù)據(jù)元素所在的結(jié)點;在雙向鏈表中建立與第二數(shù)據(jù)元素的標(biāo)識對應(yīng)的第四結(jié)點,將第二數(shù)據(jù)元素保存在第四節(jié)點的數(shù)據(jù)字段中,并在雙向鏈表的索引中保存第二數(shù)據(jù)元素的標(biāo)識;更新第四結(jié)點中第二數(shù)據(jù)元素的被訪問次數(shù),按照被訪問次數(shù)調(diào)整雙向鏈表中各個結(jié)點的位置,并相應(yīng)調(diào)整雙向鏈表中各個結(jié)點中的指針。
由于第三數(shù)據(jù)元素的被訪問次數(shù)最少,說明第三數(shù)據(jù)元素被重復(fù)使用的可能性很小,因此,可以將其保存在外部存儲器中,將內(nèi)存的空間留給被訪問次數(shù)多的數(shù)據(jù)元素。在一個具體實施方式中第二數(shù)據(jù)元素為A,若內(nèi)存的存儲量達(dá)到設(shè)定閾值,在刪除第三數(shù)據(jù)元素后,則從雙向鏈表的尾部向前查找,一旦找到數(shù)據(jù)元素B的被訪問次數(shù)大于1,則在B所在的結(jié)點之后建立包括A的結(jié)點,如果不存在B,則將在雙向鏈表的尾部建立包括A的結(jié)點,同時調(diào)整A所在的第四結(jié)點相鄰結(jié)點中的指針,并更新第四結(jié)點中的被訪問次數(shù)為1。
第三步,在雙向鏈表中建立與第二數(shù)據(jù)元素的標(biāo)識對應(yīng)的第五結(jié)點,將第二數(shù)據(jù)元素保存在第五節(jié)點的數(shù)據(jù)字段中,并在雙向鏈表的索引中保存第二數(shù)據(jù)元素的標(biāo)識;更新第五結(jié)點中第二數(shù)據(jù)元素的被訪問次數(shù),按照被訪問次數(shù)調(diào)整雙向鏈表中各個結(jié)點的位置,并相應(yīng)調(diào)整雙向鏈表中各個結(jié)點中的指針。
在一個具體實施方式中,第二數(shù)據(jù)元素為A,若內(nèi)存的存儲量未達(dá)到設(shè)定閾值,則直接在雙向鏈表的尾部建立包括A的第五結(jié)點,同時調(diào)整第五結(jié)點中的指針,并更新第五結(jié)點中的被訪問次數(shù)為1。
需要說明的是,以上分別介紹了數(shù)據(jù)緩存方法和數(shù)據(jù)查詢方法,但是對于大數(shù)據(jù)終端來說,既可以分別執(zhí)行上述數(shù)據(jù)緩存方法和數(shù)據(jù)查詢方法,也可以同時執(zhí)行上述數(shù)據(jù)緩存方法和數(shù)據(jù)查詢方法。
基于同一發(fā)明構(gòu)思,本申請實施例還提供一種數(shù)據(jù)緩存裝置,該裝置與如圖1所示的數(shù)據(jù)緩存方法對應(yīng),該裝置的結(jié)構(gòu)如6圖所示,包括
第一接收單元61,用于接收待緩存數(shù)據(jù),針對待緩存數(shù)據(jù)包括的每個第一數(shù)據(jù)元素,執(zhí)行:
獲取單元62,用于獲取第一數(shù)據(jù)元素的標(biāo)識;
確定單元63,用于確定大數(shù)據(jù)終端的內(nèi)存中是否保存第一數(shù)據(jù)元素的標(biāo)識對應(yīng)的已有數(shù)據(jù)元素;
緩存單元64,用于若確定內(nèi)存中保存已有數(shù)據(jù)元素,則將已有數(shù)據(jù)元素替換為第一數(shù)據(jù)元素;若確定內(nèi)存中未保存已有數(shù)據(jù)元素,確定內(nèi)存的存儲量是否達(dá)到設(shè)定閾值;若內(nèi)存的存儲量未達(dá)到設(shè)定閾值,則將第一數(shù)據(jù)元素及其標(biāo)識保存在內(nèi)存中;若內(nèi)存的存儲量達(dá)到設(shè)定閾值,則將第一數(shù)據(jù)元素保存在大數(shù)據(jù)終端的外部存儲器中,并將第一數(shù)據(jù)元素的標(biāo)識和存儲位置保存在內(nèi)存中。
該方案中,并不是將推送服務(wù)器或者數(shù)據(jù)庫推送的待緩存數(shù)據(jù)都保存在內(nèi)存中,而是采用內(nèi)存和外部存儲相結(jié)合的方式來保存待緩存數(shù)據(jù),內(nèi)存的存儲量始終控制在設(shè)定閾值之內(nèi),從而可以有效避免相關(guān)技術(shù)中替換數(shù)據(jù)的過程占用很多內(nèi)存資源,從而容易造成內(nèi)存不足,甚至?xí)l(fā)內(nèi)存回收和大數(shù)據(jù)終端宕機的問題。
具體的,獲取單元62,用于獲取第一數(shù)據(jù)元素的標(biāo)識,具體用于:
從第一數(shù)據(jù)元素中查找選定字段;
獲取選定字段的數(shù)值,得到第一數(shù)據(jù)元素的標(biāo)識。
具體的,確定單元63,用于確定大數(shù)據(jù)終端的內(nèi)存中是否保存第一數(shù)據(jù)元素的標(biāo)識對應(yīng)的已有數(shù)據(jù)元素,具體包括:
獲取內(nèi)存中保存的帶有索引的雙向鏈表;
確定雙向鏈表的索引中是否包括第一數(shù)據(jù)元素的標(biāo)識;
若雙向鏈表的索引中包括第一數(shù)據(jù)元素的標(biāo)識,則確定內(nèi)存中保存已有數(shù)據(jù)元素;
若雙向鏈表的索引中未包括第一數(shù)據(jù)元素的標(biāo)識,則確定內(nèi)存中未保存已有數(shù)據(jù)元素。
可選的,確定單元63,還用于:
確定內(nèi)存中保存已有數(shù)據(jù)元素之后,獲取雙向鏈表中第一數(shù)據(jù)元素的標(biāo)識對應(yīng)的第一結(jié)點;
從第一結(jié)點的數(shù)據(jù)字段獲取已有數(shù)據(jù)元素;
對比第一數(shù)據(jù)元素包括的內(nèi)容與已有數(shù)據(jù)元素包括的內(nèi)容是否完全相同;
若第一數(shù)據(jù)元素包括的內(nèi)容與已有數(shù)據(jù)元素包括的內(nèi)容不完全相同,則轉(zhuǎn)向緩存單元。
具體的,緩存單元64,用于將第一數(shù)據(jù)元素及其標(biāo)識保存在內(nèi)存中,具體用于:
在雙向鏈表的索引中保存第一數(shù)據(jù)元素的標(biāo)識;
在雙向鏈表中建立與第一數(shù)據(jù)元素的標(biāo)識對應(yīng)的第二結(jié)點,并將第一數(shù)據(jù)元素保存在 第二節(jié)點的數(shù)據(jù)字段中。
具體的,緩存單元64,用于將第一數(shù)據(jù)元素保存在大數(shù)據(jù)終端的外部存儲器中,并將第一數(shù)據(jù)元素的標(biāo)識和存儲位置保存在內(nèi)存中,具體用于:
將第一數(shù)據(jù)元素保存在大數(shù)據(jù)終端的外部存儲器的文件中;
獲取第一數(shù)據(jù)元素在大數(shù)據(jù)終端的外部存儲器的存儲位置;
在內(nèi)存保存的標(biāo)識與存儲位置的對應(yīng)關(guān)系中建立包括第一數(shù)據(jù)元素的標(biāo)識與存儲位置的表項。
根據(jù)本申請實施例還提供另一種數(shù)據(jù)緩存裝置,該裝置的結(jié)構(gòu)如圖7所示,該裝置與如圖6所示的裝置相同的單元省略不表,在如圖6所示的裝置的基礎(chǔ)上,還包括:
第二接收單元65,用于接收用戶或者其它大數(shù)據(jù)終端發(fā)送的攜帶第二數(shù)據(jù)元素的標(biāo)識的數(shù)據(jù)獲取請求;
查詢單元66,用于根據(jù)第二數(shù)據(jù)元素的標(biāo)識在內(nèi)存中查詢第二數(shù)據(jù)元素或者第二數(shù)據(jù)元素的存儲位置;
發(fā)送單元67,用于若查詢到第二數(shù)據(jù)元素,則將第二數(shù)據(jù)元素發(fā)送給用戶或者其它大數(shù)據(jù)終端;若查詢到第二數(shù)據(jù)元素的存儲位置,則根據(jù)第二數(shù)據(jù)元素的存儲位置從外部存儲器獲取第二數(shù)據(jù)元素,并發(fā)送給用戶或者其它大數(shù)據(jù)終端;以及,將第二數(shù)據(jù)元素保存在內(nèi)存中。
具體的,查詢單元66,用于根據(jù)第二數(shù)據(jù)元素的標(biāo)識在內(nèi)存中查詢第二數(shù)據(jù)元素或者第二數(shù)據(jù)元素的存儲位置,具體用于:
分別從內(nèi)存中保存的帶有索引的雙向鏈表中、以及標(biāo)識與存儲位置的對應(yīng)關(guān)系中查找第二數(shù)據(jù)元素的標(biāo)識;
若在雙向鏈表中查找到第二數(shù)據(jù)元素的標(biāo)識,則從雙向鏈表中獲取第二數(shù)據(jù)元素的標(biāo)識對應(yīng)的第三結(jié)點,并從第三結(jié)點的數(shù)據(jù)字段獲取第二數(shù)據(jù)元素;
若在對應(yīng)關(guān)系中查找到包括第二數(shù)據(jù)元素的標(biāo)識的表項,則在表項中獲取第二數(shù)據(jù)元素的存儲位置。
可選的,發(fā)送單元67,還用于:
在查詢單元66查詢到第二數(shù)據(jù)元素之后,更新第三結(jié)點中第二數(shù)據(jù)元素的被訪問次數(shù);以及,
按照被訪問次數(shù)調(diào)整雙向鏈表中各個結(jié)點的位置,并相應(yīng)調(diào)整雙向鏈表中各個結(jié)點中 的指針。
具體的,發(fā)送單元67,用于將第二數(shù)據(jù)元素保存在內(nèi)存中,具體用于:
判斷內(nèi)存的存儲量是否達(dá)到設(shè)定閾值;
若內(nèi)存的存儲量達(dá)到設(shè)定閾值,則確定內(nèi)存中保存的被訪問次數(shù)最少的第三數(shù)據(jù)元素,將第三數(shù)據(jù)元素保存在外部存儲器中,并在對應(yīng)關(guān)系中保存包括第三數(shù)據(jù)元素的標(biāo)識和存儲位置的表項;刪除雙向鏈表的索引中保存的第三數(shù)據(jù)元素的標(biāo)識和雙向鏈表中第三數(shù)據(jù)元素所在的結(jié)點;在雙向鏈表中建立與第二數(shù)據(jù)元素的標(biāo)識對應(yīng)的第四結(jié)點,將第二數(shù)據(jù)元素保存在第四節(jié)點的數(shù)據(jù)字段中,并在雙向鏈表的索引中保存第二數(shù)據(jù)元素的標(biāo)識;更新第四結(jié)點中第二數(shù)據(jù)元素的被訪問次數(shù),按照被訪問次數(shù)調(diào)整雙向鏈表中各個結(jié)點的位置,并相應(yīng)調(diào)整雙向鏈表中各個結(jié)點中的指針;
若內(nèi)存的存儲量未達(dá)到設(shè)定閾值,則在雙向鏈表中建立與第二數(shù)據(jù)元素的標(biāo)識對應(yīng)的第五結(jié)點,將第二數(shù)據(jù)元素保存在第五節(jié)點的數(shù)據(jù)字段中,并在雙向鏈表的索引中保存第二數(shù)據(jù)元素的標(biāo)識;更新第五結(jié)點中第二數(shù)據(jù)元素的被訪問次數(shù),按照被訪問次數(shù)調(diào)整雙向鏈表中各個結(jié)點的位置,并相應(yīng)調(diào)整雙向鏈表中各個結(jié)點中的指針。
基于同一發(fā)明構(gòu)思,本申請實施例還提供一種數(shù)據(jù)查詢裝置,該裝置與如圖5所示的數(shù)據(jù)查詢方法對應(yīng),該裝置的結(jié)構(gòu)如圖8所示,包括
接收單元81,用于接收用戶或者其它大數(shù)據(jù)終端發(fā)送的攜帶第二數(shù)據(jù)元素的標(biāo)識的數(shù)據(jù)獲取請求;
查詢單元82,用于根據(jù)第二數(shù)據(jù)元素的標(biāo)識在大數(shù)據(jù)終端的內(nèi)存中查詢第二數(shù)據(jù)元素或者第二數(shù)據(jù)元素的存儲位置;
發(fā)送單元83,用于若查詢到第二數(shù)據(jù)元素,則將第二數(shù)據(jù)元素發(fā)送給用戶或者其它大數(shù)據(jù)終端;若查詢到第二數(shù)據(jù)元素的存儲位置,則根據(jù)第二數(shù)據(jù)元素的存儲位置從大數(shù)據(jù)終端的外部存儲器獲取第二數(shù)據(jù)元素,并發(fā)送給用戶或者其它大數(shù)據(jù)終端;以及,將第二數(shù)據(jù)元素保存在內(nèi)存中。
該方案中,由于大數(shù)據(jù)終端中的數(shù)據(jù)元素采用內(nèi)存加外部存儲相結(jié)合的方式,而保存在外部存儲器中的數(shù)據(jù)元素的標(biāo)識和存儲位置保存在內(nèi)存中,相應(yīng)地,在查詢第二數(shù)據(jù)元素時,若第二數(shù)據(jù)元素保存在內(nèi)存中,可以直接獲取第二數(shù)據(jù)元素,若第二數(shù)據(jù)元素保存在外部存儲器中,可以在內(nèi)存中查詢到第二數(shù)據(jù)元素的存儲位置,因此,即使第二數(shù)據(jù)元素保存在外部存儲器中,也可以快速獲取第二數(shù)據(jù)元素的存儲位置,進(jìn)而獲取第二數(shù)據(jù)元素,從而減少數(shù)據(jù)查詢的延時,確保數(shù)據(jù)查詢的實時性,提升了用戶體驗。
具體的,查詢單元82,用于根據(jù)第二數(shù)據(jù)元素的標(biāo)識在內(nèi)存中查詢第二數(shù)據(jù)元素或者 第二數(shù)據(jù)元素的存儲位置,具體用于:
分別從內(nèi)存中保存的帶有索引的雙向鏈表中、以及標(biāo)識與存儲位置的對應(yīng)關(guān)系中查找第二數(shù)據(jù)元素的標(biāo)識;
若在雙向鏈表中查找到第二數(shù)據(jù)元素的標(biāo)識,則從雙向鏈表中獲取第二數(shù)據(jù)元素的標(biāo)識對應(yīng)的第三結(jié)點,并從第三結(jié)點的數(shù)據(jù)字段獲取第二數(shù)據(jù)元素;
若在對應(yīng)關(guān)系中查找到包括第二數(shù)據(jù)元素的標(biāo)識的表項,則在表項中獲取第二數(shù)據(jù)元素的存儲位置。
可選的,發(fā)送單元83,還用于:
在查詢單元82查詢到第二數(shù)據(jù)元素之后,更新第三結(jié)點中第二數(shù)據(jù)元素的被訪問次數(shù);以及,
按照被訪問次數(shù)調(diào)整雙向鏈表中各個結(jié)點的位置,并相應(yīng)調(diào)整雙向鏈表中各個結(jié)點中的指針。
具體的,發(fā)送單元83,用于將第二數(shù)據(jù)元素保存在內(nèi)存中,具體用于:
判斷內(nèi)存的存儲量是否達(dá)到設(shè)定閾值;
若內(nèi)存的存儲量達(dá)到設(shè)定閾值,則確定內(nèi)存中保存的被訪問次數(shù)最少的第三數(shù)據(jù)元素,將第三數(shù)據(jù)元素保存在外部存儲器中,并在對應(yīng)關(guān)系中保存包括第三數(shù)據(jù)元素的標(biāo)識和存儲位置的表項;刪除雙向鏈表的索引中保存的第三數(shù)據(jù)元素的標(biāo)識和雙向鏈表中第三數(shù)據(jù)元素所在的結(jié)點;在雙向鏈表中建立與第二數(shù)據(jù)元素的標(biāo)識對應(yīng)的第四結(jié)點,將第二數(shù)據(jù)元素保存在第四節(jié)點的數(shù)據(jù)字段中,并在雙向鏈表的索引中保存第二數(shù)據(jù)元素的標(biāo)識;更新第四結(jié)點中第二數(shù)據(jù)元素的被訪問次數(shù),按照被訪問次數(shù)調(diào)整雙向鏈表中各個結(jié)點的位置,并相應(yīng)調(diào)整雙向鏈表中各個結(jié)點中的指針;
若內(nèi)存的存儲量未達(dá)到設(shè)定閾值,則在雙向鏈表中建立與第二數(shù)據(jù)元素的標(biāo)識對應(yīng)的第五結(jié)點,將第二數(shù)據(jù)元素保存在第五節(jié)點的數(shù)據(jù)字段中,并在雙向鏈表的索引中保存第二數(shù)據(jù)元素的標(biāo)識;更新第五結(jié)點中第二數(shù)據(jù)元素的被訪問次數(shù),按照被訪問次數(shù)調(diào)整雙向鏈表中各個結(jié)點的位置,并相應(yīng)調(diào)整雙向鏈表中各個結(jié)點中的指針。
上述說明示出并描述了本申請的優(yōu)選實施例,但如前所述,應(yīng)當(dāng)理解本申請并非局限于本文所披露的形式,不應(yīng)看作是對其他實施例的排除,而可用于各種其他組合、修改和環(huán)境,并能夠在本文所述發(fā)明構(gòu)想范圍內(nèi),通過上述教導(dǎo)或相關(guān)領(lǐng)域的技術(shù)或知識進(jìn)行改動。而本領(lǐng)域人員所進(jìn)行的改動和變化不脫離本申請的精神和范圍,則都應(yīng)在本申請所附權(quán)利要求的保護(hù)范圍內(nèi)。