本發明涉及移動端緩存處理技術,尤其涉及一種適用于移動開發的高性能緩存方法。
背景技術:
某物流中心的物流移動端產品,需要對已讀的主題明細頁面提供離線瀏覽功能,主題明細頁面支持按照時間、部門等參數條件來請求后端數據響應并刷新,其中部分主題明細需要按照年、月、日、時、分來定時請求或更新瀏覽數據并緩存,部分主題明細需要排除個別請求參數值的情況下刷新頁面數據。
其次,對于定義的欄目、專題、主題等結構性數據,以及常量、枚舉等只讀數據可以按天或指定周期進行定時更新或請求,減少重復性的服務端數據請求。
另外,請求的數據中可能包含部分內網IP地址需要匹配替換為外網地址,部分富文本內容需要進行轉義處理,并支持PC端調試功能。
技術實現要素:
為了解決該問題,本發明提出了一種適用于移動開發的高性能緩存方法。根據緩存策略周期性或實時性抓取網絡數據并更新緩存,結合WebSql實現數據本地化,提高前端請求響應速度,并對請求數據進行預處理及加工。
本發明的技術方案是:
一種適用于移動開發的高性能緩存策略,
1)緩存主鍵構建及懶加載
通過url及其data參數拼接并轉義生成的緩存表唯一主鍵。當配置參數中的lazy==true時,請求參數將不參與主鍵的生成,避免部分請求因參數變化(或差異)而導致的重復后端數據請求。
2)cronPattern表達式
當cronPattern==true時,以本地緩存數據讀取優先
當cronPattern==false 或 不填 或 格式不正確(檢測數字、長度)時,以實時請求網絡數據優先
當cronPattern=='yyyyMMddHHmmss' 時,以策略抓取數據(根據表達式計算下一更新周期,當前時間是否在更新周期內),例如:
cronPattern=='yyyyMMd1HHmmss': 一天更新一次,其它時間位不參與
cronPattern=='yyyyMMd1H1mmss': 一天更新一次,且今天的小時至少大于昨天緩存的1小時
cronPattern=='yyyyMMd1000000': 一天更新一次,且今天的時間點大于昨天的時間點
3)排他模式
在cronPattern=true的時候,根據參數值決定當前url請求是否被排除使用緩存策略,當currVars中的值出現在patterns中或匹配指定的regex表達式,當前url請求被排除并需要進行網絡請求。
本發明的有益效果是
通過本專利技術的實現及運用,真實有效的解決了物流移動端產品開發中遇到的如下問題:
1:針對產品中定義的欄目、專題、主題等結構性數據獲取,通過緩存策略指定更新策略為:cronPattern=='yyyyMMd1HHmmss'(一天更新一次,不考慮時間點),有效的避免了當天客戶端頁面刷新時重復性請求后端數據的請求。
2:滿足部分主題明細頁面在支持離線瀏覽的同時,對當月或當日的明細數據以網絡優先抓取并加載。
3:基于數據庫存儲,通過WebSql操作,可以進行對緩存數據進行排序、分組等操作,并可以按需的進行批量刪除操作。
4:支持數據預處理操作,解決內外網IP地址批量替換問題和特殊字符轉義需要。
5:緩存策略調用緩存數據大大提高了頁面響應速度及效率,提高了客戶體驗度。
附圖說明
圖1是本發明的流程圖。
具體實施方式
下面對本發明的內容進行更加詳細的闡述:
本發明以AngularJS插件化方式實現,并以JS閉包形式返回工具對象和緩存處理對象。
其中,工具對象包含如下功能:
1、基于WebSql API進行二次封裝,提供完整的數據存儲功能。
2、提供緩存配置對象,統一日志抬頭、調試環境、數據庫名稱等信息。
3、基于AngularJS的$http方法及Promise JS進行二次封裝,提供高性能AJAX請求調度。
另外,緩存處理對象提供如下功能:
1、提供緩存模塊業務表數據初始化及清理API
2、提供網絡數據抓取及存儲API
3、提供本地緩存數據檢測及讀取API
4、提供支持緩存策略(懶加載、匹配模式、排他模式、數據預處理等)的數據抓取API。
5、支持緩存數據預處理(部分文本批量替換、特殊字符轉義等)
本發明實現方案如下:
定義執行緩存方法的數據抓取方法:
var pull = function(opt) {......}
其中參數opt定義如下:
@param opt 網絡請求參數(同$http請求參數)
{
type : '', //可選:get或post
url : '', //必填:請求路徑(參與緩存k的構建)
params : { (參與緩存k的構建)
method : '', //必填:請求方法名
data : {}, //可選:請求參數(同后臺交互時會json字符串化處理)
lazy : false //可選:params里面的參數是否參與緩存k值構建(默認false)
},
logTitle : '',//可選:日至輸出前綴
cronPattern: 'yyyyMMddHHmmss',//可選:緩存策略(true:本地緩存為主,'yyyyMMddHHmmss':以策略為準,其它:實時為主其次本地緩存),字母已兼容大小寫處理
excludePatterns : {//排他模式配置
currVars : [], //查詢條件值:例如月份
patterns : [], //需要排除的查詢條件
regex : '' //根據表達式排除
},
before : function(data){} //可選:成功從網絡獲取到數據時的入口函數(用于加工從網絡獲取的數據保存方式或內容)
}
緩存主鍵及懶加載:
通過url及其data參數拼接并轉義生成的緩存表唯一主鍵。
懶加載:當配置參數中的lazy==true時,請求參數將不參與主鍵的生成,避免部分請求因參數變化(或差異)而導致的重復后端數據請求。
其方法定義如下:
var buildUrlID = function(url, params) {
var k = url;
if (params) {
if (params.method) {
k += (k.indexOf("?") > 0 ? "&" : "?") + "method=" + params.method;
}
if (params.data && !params.lazy) {
k += (k.indexOf("?") > 0 ? "&" : "?") + encodeURI(JSON.stringify(params.data));
}
}
return k;
};
cronPattern表達式:
當cronPattern==true時,以本地緩存數據讀取優先
當cronPattern==false 或 不填 或 格式不正確(檢測數字、長度)時,以實時請求網絡數據優先
當cronPattern=='yyyyMMddHHmmss' 時,以策略抓取數據(根據表達式計算下一更新周期,當前時間是否在更新周期內)
//策略性加載,例如:
cronPattern=='yyyyMMd1HHmmss' : 一天更新一次,其它時間位不參與
cronPattern=='yyyyMMd1H1mmss' : 一天更新一次,且今天的小時至少大于昨天緩存的1小時
cronPattern=='yyyyMMd1000000' : 一天更新一次,且今天的時間點大于昨天的時間點
排他模式:
excludePatterns : {
currVars : [], //查詢條件值:例如月份
patterns : [], //需要排除的查詢條件值選項
regex : '' //根據表達式排除
}
//僅在cronPattern=true的時候生效,根據參數值決定是否進行網絡請求,當currVars中的值出現在patterns中或匹配指定的regex表達式,當前url請求被排除在緩存讀取方式考慮外。
數據預處理:
當數據成功從網絡獲取后,會優先調用before : function(data){...}方法。通過decodeHtml方法進行字符轉義處理,通過mapping方法將特殊url內容進行批量替換處理等操作。
before : function(r){//服務端返回的數據是encode過的,需要先解碼
r.data.picItem.INST_CONTENT = r.data.picItem.INST_CONTENT.codeHTML().decodeHtml();
r.data.picItem = $UriMappingsTool.mapping(r.data.picItem);
return r;
}
策略執行流程如下(偽代碼):
根據請求參數及url構建緩存主鍵K
檢測網絡信號(1時表示有網絡,返回2時表示無網絡)
if (無網絡) {
根據緩存主鍵K直接讀取本地緩存數據
} else {//有網絡
Var ecp = 執行excludeCronPatterns(排他模式)方法//檢測當前參數值currVars是否出現在匹配模式patterns或regex 中
if (!ecp && cronPattern == true) {//本地緩存加載優先
優先加載本地數據,本地數據抓取失敗后讀取網絡數據并緩存
} else {
if (cronPattern以策略為準) { //執行策略
根據緩存主鍵K從數據庫中加載緩存數據
if(查找到緩存){
獲取緩存數據的緩存時間
if(當前時間-緩存時間>緩存策略時間){//超過數據有效時期,需要重新加載數據
優先從網絡抓取數據,網絡數據抓取失敗后返回本地數據
}else{
直接返回本地數據
}
}else{
從網絡抓取最新數據并緩存
}
} else {//實時:格式錯誤、沒填、false、排除
請求網絡數據并緩存
}
}。