安卓 h5頁面 詭異緩存問題定位 全解析- 怎么做h5和端上配合的緩存策略柠贤?

[toc]

image

緩存有哪些香浩?

影響到最終h5展示到用戶的緩存來源有以下幾個方面:
    1.服務(wù)端緩存
    2.cdn節(jié)點緩存
    3.瀏覽器緩存
    4.離線包緩存
    

端上怎么配合h5做緩存?

端上做h5容器臼勉,其實相當(dāng)于定制一個瀏覽器來承接h5頁面邻吭。h5頁面的加載頁與在瀏覽器中加載執(zhí)行的邏輯相同,向其中注入js對象就相當(dāng)于內(nèi)置的瀏覽器方法等同宴霸。

端上影響到h5緩存策略的設(shè)置來源于:
WebSettings webSettings = webview.getSettings();
webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);

    在其中有三種策略:
   /**
     * 優(yōu)先本地緩存囱晴,沒有則到網(wǎng)絡(luò)請求或者
     */
    public static final int LOAD_CACHE_ELSE_NETWORK = 1;

    /**
     * 不加載緩存中內(nèi)容膏蚓,只做網(wǎng)絡(luò)請求
     */
    public static final int LOAD_NO_CACHE = 2;

    /**
     * 只加載緩存中的內(nèi)容
     */
    public static final int LOAD_CACHE_ONLY = 3;
    /**
     * 默認模式:沒有設(shè)置緩存策略時候,當(dāng)有本地緩存同時expires沒有過期的時候使用緩存畸写,當(dāng)緩存不可用時驮瞧,使用網(wǎng)絡(luò)請求數(shù)據(jù)
     */
     public static final int LOAD_DEFAULT = -1;
    三種策略對應(yīng)的緩存策略比較直接;
    設(shè)置no_cache會直接忽略服務(wù)端header的設(shè)置枯芬,每次都走無緩存邏輯论笔;也就是h5的緩存策略會被跳過,不建議如此處理千所;
    一刀切的方式不利于進行加載速度優(yōu)化和流量優(yōu)化狂魔;

服務(wù)端配置-header的解析

服務(wù)端與客戶端交互的header,分為 reqeust-header 淫痰、 resonse-header兩種最楷。
瀏覽器緩存策略也包含在header中,對于header中涉及到的瀏覽器參數(shù)待错,可以進行一次盤點籽孙,理解清楚各個參數(shù)對瀏覽器行為的影響,有助于理解整個緩存邏輯的執(zhí)行情況火俄;
image

http請求包含: 請求行 --> http頭(通用信息頭犯建、請求頭、實體頭) --> 請求報文主體(只有post才有報文實體)

image

http響應(yīng)包含狀態(tài)行 --> http頭(通用信息頭烛占、響應(yīng)頭胎挎、實體頭) --> ** 響應(yīng)報文主體**

通用信息頭指的是請求和響應(yīng)報文都支持的頭域沟启,分別為 cache-control忆家、connection、date德迹、pragma芽卿、transfer-encoding、upgrade胳搞、via卸例;

實體頭則是實體信息的實體 分別為:allow 、 content-base肌毅、content-encoding筷转、content-language、content-length悬而、content-location呜舒、content-md5、content-range笨奠、content-type袭蝗、etag唤殴、expires、last-modified到腥、extentsion-header朵逝。

為了方便理解把通用信息頭,響應(yīng)/請求頭乡范,實體頭都歸為http頭配名。

同時 :從緩存判斷順序來說 分為:

  • 1.強制緩存:通過cache-control/expires配置生效
  • 2.啟發(fā)式緩存:未配置cache-control/expires時候,通過date + (date-last-modified)/10計算緩存過期時間
  • 3.協(xié)商緩存 :通過 etag/if-none-match last-modified/if-modified-since 兩個數(shù)值對來配合生效 Etag / If-None-Match的優(yōu)先級比Last-Modified / If-Modified-Since高晋辆。
  • 同時生效順序為: 強制緩存>啟發(fā)式緩存>協(xié)商緩存
image

更詳細的知識點1

更詳細的知識點2

以上為基礎(chǔ)知識段誊,為了更好的定位線上一個問題需要大概瀏覽。

為什么會有緩存3天時候栈拖?

問題產(chǎn)生流程:

發(fā)布時間 13號 七點
離線包js文件更新再 11號   js文件更新 utm規(guī)則改變
17號改動了cache-control邏輯连舍,但是還要依賴用戶清緩存來做刷新緩存操作,改動不徹底
18號發(fā)布新的html 涩哟,改名進行替換

從發(fā)布流程來看索赏,預(yù)期結(jié)果是對某一html頁面進行更新使其承擔(dān)更多的業(yè)務(wù),也就是常規(guī)的業(yè)務(wù)流程改動贴彼。為何再端上會收到大規(guī)模的問題反饋呢潜腻?

以上的問題路徑并不能得出更多的信息,通過日志庫查詢發(fā)現(xiàn)用戶適用路徑基本來自新改動頁面發(fā)布之前就已經(jīng)訪問該頁面器仗,到發(fā)布之后再來訪問頁面的一個基本路徑融涣。結(jié)合聽云訪問日志記錄看,在15號發(fā)起該頁面的請求只有4個精钮,也就是大部分請求都被端上捂住了威鹿,沒有發(fā)起成功的服務(wù)器請求。

而從上緩存策略來看轨香,只有強制緩存+啟發(fā)式緩存會把請求捂住再本地忽你。那么跟蹤問題就有了頭緒;

找到相應(yīng)的html頁面對header進行分析臂容,找到目標(biāo)值科雳,對強制緩存和啟發(fā)式緩存的值進行計算,得出緩存過期的時間脓杉,看是否覆蓋用戶訪問的時間段糟秘。

最終計算得到:
(線上設(shè)置)沒有cache-control 和expires的強緩存策略,會到啟發(fā)式緩存中球散,根據(jù)算法

    const Date_value = new Date('Tue, 07 Apr 2020 08:32:28 GMT').getTime();
    const LastModified_value = new Date('Tue, 31 Mar 2020 03:11:14 GMT').getTime();
    const cacheTime = (Date_value - LastModified_value) / 10;
    const Expires_timestamp = Date_value + cacheTime;
    const Expires_value = new Date(Expires_timestamp);
    console.log('Expires:', Expires_value); //  Thu Apr 09 2020 05:43:07 GMT+0800 (中國標(biāo)準(zhǔn)時間)

(測試連接:*****year-card.html)得到的時間為:Expires: Wed Apr 08 2020 10:26:09 GMT+0800 (中國標(biāo)準(zhǔn)時間)

也就是會到8號才過期

image

當(dāng)本地時間調(diào)到 Wed Apr 08 2020 10:32:09時候尿赚,端上會發(fā)起一次304的服務(wù)端文件校驗請求,通過服務(wù)端文件是否發(fā)生改變的校驗來判斷重新請求還是直接讀取服務(wù)端緩存。

那么三天以上的緩存怎么計算得來的呢吼畏,通過date-last-modified 時間來看督赤,當(dāng)文件越舊,date越近泻蚊,那么計算出來的緩存時間就會越久躲舌。緩存三天以上完全有可能。

怎么做不同的h5頁面緩存策略性雄?

那么之后的h5頁面如何做緩存策略没卸?

1.首先webview 設(shè)置默認緩存策略  webview.setCacheMode(default);
2.區(qū)分業(yè)務(wù)的更新策略
頻繁更新的營銷頁面:營銷頁面直接設(shè)置緩存過期cache-control,expires    (Cache-Control:max-age=600 覆蓋 Expires)
不頻繁更新的頁面:業(yè)務(wù)頁面,更新不頻繁的依靠文件etag/if-none_match 或者 last-modified / if-modified-since 兩個協(xié)商策略秒旋;

問題發(fā)生核心是什么约计?

瀏覽器緩存、服務(wù)器緩存迁筛、端上緩存煤蚌,三種緩存交織再一起,造成緩存問題排查首先得弄清楚緩存存取優(yōu)先級和存取策略细卧,才能復(fù)現(xiàn)缺少有效信息時候的緩存問題尉桩;

在端上沒有發(fā)起請求的情況下,一般是來自于強制緩存將請求捂住到本地造成緩存出現(xiàn)問題贪庙;

怎么預(yù)防大促的問題蜘犁?

h5 - nginx 緩存策略全局設(shè)置
客戶端靜態(tài)文件緩存nginx策略:
    1、gif|jpg|jpeg|png|bmp|swf|flv|mp4|ico等文件止邮,緩存7天这橙。
    2、js|css等文件导披,緩存1天屈扎。
    3、html文件緩存300s (其他站頁面)
    4盛卡、實時html頁面助隧,端上不緩存筑凫。(營銷頁面/活動)

備注:
端上緩存文件過期后滑沧,會再次從cdn獲取文件。

對promotion進行特殊處理 處理方案同京東的秒殺活動:
https://miaosha.jd.com/

線上問題對應(yīng)解決方案:
nginx已配置巍实,對于文件的cache時間進行指定滓技,出現(xiàn)問題nginx更新策略無法影響到所有緩存。這個時候只能對客戶端開關(guān)進行處理棚潦。
大促出現(xiàn)問題怎么解決:
    1.apollo配置cachecotrol 為 nocache令漂, 會忽略nginx控制的瀏覽器緩存直接走無緩存邏輯
    2.下發(fā)補丁做cachecotrol強行指定
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子叠必,更是在濱河造成了極大的恐慌荚孵,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件纬朝,死亡現(xiàn)場離奇詭異收叶,居然都是意外死亡,警方通過查閱死者的電腦和手機共苛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門判没,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人隅茎,你說我怎么就攤上這事澄峰。” “怎么了辟犀?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵俏竞,是天一觀的道長。 經(jīng)常有香客問我堂竟,道長胞此,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任跃捣,我火速辦了婚禮漱牵,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘疚漆。我一直安慰自己酣胀,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布娶聘。 她就那樣靜靜地躺著闻镶,像睡著了一般。 火紅的嫁衣襯著肌膚如雪丸升。 梳的紋絲不亂的頭發(fā)上铆农,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天,我揣著相機與錄音狡耻,去河邊找鬼墩剖。 笑死,一個胖子當(dāng)著我的面吹牛夷狰,可吹牛的內(nèi)容都是我干的岭皂。 我是一名探鬼主播,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了辆飘?” 一聲冷哼從身側(cè)響起份殿,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤俩块,失蹤者是張志新(化名)和其女友劉穎肖油,沒想到半個月后卢未,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體觅够,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡陶因,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年洞斯,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片坑赡。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡烙如,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出毅否,到底是詐尸還是另有隱情亚铁,我是刑警寧澤,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布螟加,位于F島的核電站徘溢,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏捆探。R本人自食惡果不足惜然爆,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望黍图。 院中可真熱鬧曾雕,春花似錦、人聲如沸助被。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽揩环。三九已至搔弄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間丰滑,已是汗流浹背顾犹。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留褒墨,地道東北人炫刷。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像貌亭,于是被迫代替她去往敵國和親柬唯。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,927評論 2 355

推薦閱讀更多精彩內(nèi)容

  • API定義規(guī)范 本規(guī)范設(shè)計基于如下使用場景: 請求頻率不是非常高:如果產(chǎn)品的使用周期內(nèi)請求頻率非常高圃庭,建議使用雙通...
    有涯逐無涯閱讀 2,547評論 0 6
  • 瀏覽器對于請求資源, 流程如圖所示: 可以看到瀏覽器的緩存機制分為兩個部分: 1、當(dāng)前緩存是否過期? 2剧腻、服務(wù)器中...
    zhoulujun閱讀 1,204評論 0 3
  • 今天看奇舞團推了篇文章講緩存策略的拘央,講的挺不錯,記錄一下书在。 原文地址就在下面灰伟。 總結(jié): 緩存分為強緩存和協(xié)商緩存...
    NowhereToRun閱讀 4,822評論 1 7
  • 解析URL 輸入URL后,會進行解析(URL的本質(zhì)就是統(tǒng)一資源定位符) URL一般包括幾大部分: protocol...
    小超人的前端之路閱讀 754評論 0 1
  • 兒子今年就要畢業(yè)了儒旬,因為考研栏账,兒子錯過了秋招,也錯過我們系統(tǒng)的招聘栈源,研也沒考過挡爵,做為母親,心里一直牽掛糾結(jié)著甚垦。 更...
    我堅持寫簡書閱讀 241評論 0 0