一文搞懂瀏覽器緩存機制

文章目錄

    • 概述
    • 強制緩存
    • 協商緩存
    • 總結
    • 參考文章

概述

瀏覽器的緩存機制也就是我們說的HTTP緩存機制,其機制是根據HTTP報文的緩存標識進行的

瀏覽器第一次向服務器發送HTTP請求, 瀏覽器拿到請求結果后,會根據響應報文的緩存標識,決定是否進行緩存。

我們可以看出

  1. 瀏覽器每次發送請求,都會先在瀏覽器中查找該請求的結果以及緩存標識
  2. 瀏覽器每次拿到結果都會將該結果和緩存標識存入瀏覽器緩存之中

我們根據是否向服務端再次發起HTTP請求和緩存過程分為兩個部分,分別是強制緩存和協商緩存

我們先做一下簡單解釋:

  • 🌊強制緩存就是向瀏覽器緩存查找結果,并根據該結果的緩存規則來決定是否使用該緩存的結果
  • 🌊協商緩存就是強制緩存失效后,瀏覽器攜帶緩存標識向服務器發起請求,由服務器根據緩存標識決定是否使用緩存的過程

強制緩存

場景

  1. 不存在該緩存結果和緩存標識,強制緩存失效,則直接向服務器發起請求(跟第一次發起請求一致)
  2. 存在該緩存結果和緩存標識,但該結果已失效,強制緩存失效
  3. 存在該緩存結果和緩存標識,且該結果尚未失效,強制緩存生效

注意:場景在總結圖中有體現

相關字段

  • Expires
    Expires是HTTP/1.0控制網頁緩存的字段,其值為服務器返回該請求結果緩存的到期時間,即再次發起該請求時,如果客戶端的時間小于Expires的值時,直接使用緩存結果
  • Cache-Control
    在HTTP/1.1中,Cache-Control是最重要的規則,主要用于控制網頁緩存,主要取值為
    - public:所有內容都將被緩存(客戶端和代理服務器都可緩存)
    - private:所有內容只有客戶端可以緩存,Cache-Control的默認取值
    - no-cache:客戶端緩存內容,但是是否使用緩存則需要經過協商緩存來驗證決定
    - no-store:所有內容都不會被緩存,即不使用強制緩存,也不使用協商緩存
    - max-age=xxx (xxx is numeric):緩存內容將在xxx秒后失效

拓展:內容緩存

我們需要了解內存緩存(from memory cache)和硬盤緩存(from disk cache),如下:

  1. 內存緩存(from memory cache):內存緩存具有兩個特點,分別是快速讀取和時效性:
  2. 快速讀取:內存緩存會將編譯解析后的文件,直接存入該進程的內存中,占據該進程一定的內存資源,以方便下次運行使用時的快速讀取。
  3. 時效性:一旦該進程關閉,則該進程的內存則會清空。
  4. 硬盤緩存(from disk cache):硬盤緩存則是直接將緩存寫入硬盤文件中,讀取緩存需要對該緩存存放的硬盤文件進行I/O操作,然后重新解析該緩存內容,讀取復雜,速度比內存緩存慢。

在瀏覽器中,瀏覽器會在js和圖片等文件解析執行后直接存入內存緩存中,那么當刷新頁面時只需直接從內存緩存中讀取(from memory cache);而css文件則會存入硬盤文件中,所以每次渲染頁面都需要從硬盤讀取緩存(from disk cache)。

協商緩存

協商緩存失效,返回304

場景

  1. 協商緩存生效,返回304
    發送請求,瀏覽器緩存失效,會再向服務端發送請求,服務端進行返回結果,將請求結果和緩存標識存入瀏覽器中
  2. 協商緩存失效,返回200和請求結果結果
    與上面不同的是,服務端發現該資源沒有變化,返回304,會繼續向瀏覽器緩存獲取結果(怎么發現該資源是否有變化,可以參考下面的相關字段Etag / If-None-Match)

注意:場景在總結圖中有體現

相關字段

  • Last-Modified / If-Modified-Since
    Last-Modified是服務器響應請求時,返回該資源文件在服務器最后被修改的時間
  • Etag / If-None-Match
    Etag是服務器響應請求時,返回當前資源文件的一個唯一標識
    If-None-Match是客戶端再次發起該請求時,攜帶上次請求返回的唯一標識Etag值,通過此字段值告訴服務器該資源上次請求返回的唯一標識值。服務器收到該請求后,發現該請求頭中含有If-None-Match,則會根據If-None-Match的字段值與該資源在服務器的Etag值做對比,一致則返回304,代表資源無更新,繼續使用緩存文件;不一致則重新返回資源文件,狀態碼為200

總結

強制緩存優先于協商緩存進行,若強制緩存(Expires和Cache-Control)生效則直接使用緩存,若不生效則進行協商緩存(Last-Modified / If-Modified-Since和Etag / If-None-Match),協商緩存由服務器決定是否使用緩存,若協商緩存失效,那么代表該請求的緩存失效,重新獲取請求結果,再存入瀏覽器緩存中;生效則返回304,繼續使用緩存

在這里插入圖片描述

參考文章

徹底理解瀏覽器的緩存機制

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/717262.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/717262.shtml
英文地址,請注明出處:http://en.pswp.cn/news/717262.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

機器學習:數據處理基操

在處理完數據之后,選擇好模型,就可以用訓練集訓練模型,用測試集輸入模型 然后輸出需要預測的結果啦~ 一、模塊導入 import numpy as np import pandas as pd #讀入數據 二、pandas數據 一、dataframe基礎 一、dataframe的創建…

github新手使用詳解及環境搭建案例

對于 GitHub 的新手使用以及環境搭建,以下是詳細的步驟和案例: 一、GitHub 新手使用詳解 注冊 GitHub 賬號:首先,你需要在 GitHub 官網上注冊一個賬號。填寫必要的個人信息,如用戶名、郵箱和密碼等。注冊完成后&…

【代碼】Android|判斷asserts下的文件存在與否,以及普通文件存在與否

作者版本:Android 11及以上 主要是發現網上沒有完整的、能跑的代碼,不知道怎么回事,GPT給我重寫的。我只能保證這個代碼尊嘟能跑,不像其他的缺胳膊少腿的。 asserts 貼一下結果: boolean isAssertFileExists(String …

Nginx配置php起WoWSimpleRegistration服務

WoWSimpleRegistration服務的git地址: GitHub - TrinityCore/WoWSimpleRegistration: Simple Registration page for TrinityCore/AzerothCore/AshamaneCore/CMangos 下載WoWSimpleRegistration 首先git下載: git clone https://github.com/TrinityC…

kafka消費者接收不到消息

背景: 對kafka消息進行監聽,生產者發了消息,但是消費端沒有接到消息,監聽代碼 消費端,kafka配置 spring.kafka.bootstrap-serverskafka.cestc.dmp:9591 spring.kafka.properties.sasl.jaas.configorg.apache.kafka.…

29.HarmonyOS App(JAVA)通知

普通通知: 通知渠道,彈出消息后,自動消失 長文本通知 //多行文本通知 //圖片通知 //社交通知 //媒體通知--經測試,圖片無法顯示,文字不顯示 場景介紹 HarmonyOS提供了通知功能,即在一個應用的UI界面之外顯示的消息,主…

C++之結構體以及通訊錄管理系統

1,結構體基本概念 結構體屬于自定義的數據概念,允許用戶存儲不同的數據類型 2,結構體的定義和使用 語法:struct 結構體名{ 結構體成員列表}; 通過結構體創建變量的方式有三種: 1,struct …

【簡說八股】面試官:你知道什么是AOP么?

回答 AOP(Aspect-Oriented Programming),即面向切面編程,是一種編程范式,它的主要思想是將應用程序中的橫切關注點(如日志記錄、性能統計、安全控制等)從業務邏輯中剝離出來,然后通過特殊的方式將這些橫切…

設計模式學習筆記 - 設計原則 - 8.迪米特法則(LOD)

前言 迪米特法則,是一個非常實用的原則。利用這個原則,可以幫我們實現代碼的 “高內聚、松耦合”。 圍繞下面幾個問題,來學習迪米特原則。 什么是 “高內聚、松耦合”?如何利用迪米特法則來實現 高內聚、松耦合?哪些…

程序員求職

程序員的金三銀四求職寶典 隨著春天的腳步漸近,對于許多程序員來說,一年中最繁忙、最重要的面試季節也隨之而來。金三銀四,即三月和四月,被廣大程序員視為求職的黃金時期。在這兩個月里,各大公司紛紛開放招聘&#xf…

技術實踐|百度安全「大模型內容安全」高級攻擊風險評測

1、引子 2023年10月16日,OWASP發布了《OWASP Top 10 for LLM Applications》,這對于新興的大語言模型安全領域,可謂一份綱領性的重要報告。 OWASP是開放式Web應用程序安全項目(Open Web Application Security Project&#xff0…

【Linux網絡命令系列】ping curl telnet三劍客

💝💝💝歡迎來到我的博客,很高興能夠在這里和您見面!希望您在這里可以感受到一份輕松愉快的氛圍,不僅可以獲得有趣的內容和知識,也可以暢所欲言、分享您的想法和見解。 推薦:kwan 的首頁,持續學…

【C++】vector的使用和模擬實現(超級詳解!!!!)

文章目錄 前言1.vector的介紹及使用1.1 vector的介紹1.2 vector的使用1.2.1 vector的定義1.2.2 vector iterator 的使用1.2.3 vector 空間增長問題1.2.3 vector 增刪查改1.2.4 vector 迭代器失效問題。(重點!!!!!!)1.2.5 vector 在OJ中有關的練習題 2.ve…

C++入門和基礎

目錄 文章目錄 前言 一、C關鍵字 二、命名空間 2.1 命名空間的定義 2.2 命名空間的使用 2.3 標準命名空間 三、C輸入&輸出 四、缺省參數 4.1 缺省參數的概念 4.2 缺省參數的分類 五、函數重載 5.1 函數重載的簡介 5.2 函數重載的分類 六、引用 6.1 引用的…

搭建個人IC_EDA服務器(物理機)一:安裝Centos7

1.準備 大于8G的U盤;待裝的電腦,我使用淘汰的在大學時候使用的筆記本;U盤啟動器制作工具:UltralSo;官網下載的在沒有付費的情況下,即使試用期,安裝的時候會有莫名的問題,建議使用這…

【接口測試】常見HTTP面試題

目錄 HTTP GET 和 POST 的區別 GET 和 POST 方法都是安全和冪等的嗎 接口冪等實現方式 說說 post 請求的幾種參數格式是什么樣的? HTTP特性 HTTP(1.1) 的優點有哪些? HTTP(1.1) 的缺點有哪些&#x…

全量知識系統問題及SmartChat給出的答復 之14 解析器+DDD+文法型 之2

Q36. 知識系統中設計的三種文法解析器和設計模式之間的關系 進一步,我想將 知識系統中設計的三種語言(形式語言、人工語言和自然)的文法解析器和DDD中的三種程序類型(領域模型、領域實體和領域服務) 形式語言文法 我…

動態代理總結

Java 代理模式 使用代理對象來代替對真實對象(real object)的訪問,這樣就可以在不修改原目標對象的前提下,提供額外的功能操作,擴展目標對象的功能 靜態代理 靜態代理在編譯時就將接口、實現類、代理類這些都變成了一個個實際的 class 文件…

MQ如何防止消息被重復消費?

被詢問如何防止MQ消息被重復消費時,其實是在考察候選人對消息隊列、分布式系統設計以及容錯機制的理解,通過這些問題,可以全面了解候選人在處理MQ消息重復消費問題時的思考方式、技術能力和實踐經驗,從而評估其是否適合擔任相關崗…

Puzzles

題目鏈接:Submit - Codeforces?????? 解題思路: 題目大概意思就是在一個數組里找n個數里的最大值減最小值的最小值,先排序,然后將第i n - 1項減去第i項與最小值作比較,輸出最小值即可,注意循環結束…