前端Http協議緩存初解

[TOC]

簡介

用戶獲取網絡資源,需要通過非常長的網絡去服務器上請求資源,另外服務端為了應對大量的用戶請求而不斷的提升硬件性能與帶寬。這對用戶與服務端都非常的不友好。而緩存就是為了解決用戶請求速度與釋放服務器壓力而生的。

為什么我會寫Http緩存,因為下面介紹的緩存都是通過Http定義的。瀏覽器緩存則是另外的如:SessionStorage,LocalStorage(個人見解)。

緩存的判斷規則

1. 過期機制

過期機制就是瀏覽器根據緩存的有效期進行判斷,如果在有效期內就使用緩存,否則就拋棄這個緩存。

一個緩存副本必須滿足以下條件,瀏覽器會認為它是有效的,足夠新的:

    1. 含有完整的過期時間控制頭信息(HTTP協議報頭),并且仍在有效期內;

    2. 瀏覽器已經使用過這個緩存副本,并且在一個會話中已經檢查過新鮮度;

2. 驗證機制

瀏覽器帶上本地緩存副本的驗證信息提交給服務器(Last-Modified,ETag),由服務器決定是否采用這個緩存。

客戶端請求的時候帶上Last-Modified,服務器進行驗證返回If-Modified-Since來確定資源是否是有效緩存。
另外在控制頭信息帶上這個資源的實體標簽Etag(Entity Tag),它可以用來作為瀏覽器再次請求過程的校驗標識。如過發現校驗標識不匹配,說明資源已經被修改或過期,瀏覽器需求重新獲取資源內容。

緩存來源

1. from disk cache

此資源是從磁盤當中取出的,也是在已經在之前的某個時間加載過該資源,不會請求服務器但是此資源不會隨著該頁面的關閉而釋放掉,因為是存在硬盤當中的,下次打開仍會from disk cache。

2. from memory cache

字面理解是從內存中,其實也是字面的含義,這個資源是直接從內存中拿到的,不會請求服務器一般已經加載過該資源且緩存在了內存當中,當關閉該頁面時,此資源就被內存釋放掉了,再次重新打開相同頁面時不會出現from memory cache的情況。

3. 請求來源

當http狀態為200是實實在在從瀏覽器獲取的資源,當http狀態為304時該數字是與服務端通信報文的大小,并不是該資源本身的大小,該資源是從本地獲取的。

緩存類型

強緩存

1. Expires

服務器發送給客戶端一個UTC時間(如 expires: Thu, 19 Nov 2019 08:52:00 GMT),瀏覽器接收到了這個頭,就會為這個資源標記一個過期時間,在下次的請求時候判斷未過期會直接使用這個資源緩存。來源會標記為from disk cache

瀏覽器在取到這個緩存資源的時候,會用客戶機的時間與之對比,如果還在有效期內,則直接使用這個緩存,不進行網絡請求。否則會進入其他緩存依據判斷。

而這個機制會有一個問題,就是,緩存資源是否過期依賴客戶機時間。客戶機可以通過修改當前時間來使這個緩存資源失效

2. Cache-Control

HTTP/1.1定義的 Cache-Control 頭用來區分對緩存機制的支持情況, 請求頭和響應頭都支持這個屬性。通過它提供的不同的值來定義緩存策略。

2.1 max-age

示例:

Cache-Control: max-age=100

這個示例表示,這個緩存資源在本次請求后的100秒之后都有效。瀏覽器會直接返回from disk cache,不進行網絡資源請求。

2.2 no-cache

示例:

Cache-Control: no-cache

這個示例表示,這個緩存資源不進行強緩存校驗,需要通過服務端的協商緩存判斷是否啟用。

協商緩存

1. Last-Modified,If-Modified-Since

當客戶端訪問資源時,服務器會將資源最后修改時間通過 Last-Modified 標識由服務器發往客戶端,客戶端記錄修改時間,再次請求本地存在的緩存資源時,客戶端會通過 If-Modified-Since 頭將先前服務器端發過來的最后修改時間戳發送回去,服務器端通過這個時間戳判斷客戶端的頁面是否是最新的,如果不是最新的,則返回新的內容,如果是最新的,則返回304告訴客戶端其本地緩存資源是最新的。

2. ETag

服務器為一個資源生成一個唯一的id值,一旦資源在服務端發生了改變則會重新生成一個tag,客戶端請求資源時,帶上了這個etag,如果不一致,服務端將會發送最新的資源給用戶,否則重定向304直接使用緩存資源。

瀏覽器緩存判斷流程

Alt text

參考文章

https://www.yodfz.com/detail/...
https://www.cnblogs.com/slly/...
https://blog.csdn.net/qq_3205...
https://blog.csdn.net/charlen...
https://segmentfault.com/a/11...
http://www.cnblogs.com/li0803...
https://developer.mozilla.org...
https://blog.csdn.net/alan199...

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

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

相關文章

詳解java訪問修飾符

*************************************優雅的分割線 ********************************** 分享一波:程序員賺外快-必看的巔峰干貨 如果以上內容對你覺得有用,并想獲取更多的賺錢方式和免費的技術教程 請關注微信公眾號:HB荷包 一個能讓你學習技術和賺錢方法的公眾號,持續更…

educoder 二進制數據的位運算_二進制與位運算實用操作匯總(基礎篇)

位運算是最高效而且占用內存最少的算法操作,但也是最難看懂的操作。然而,關于位運算的用法,筆者查了許多資料,似乎都沒有找到詳細而系統的講解資料。筆者對位運算的操作相當感興趣,因此斗膽嘗試對位運算來一個的總結。…

企業為什么要做SEO,它的重要性有哪些?

對于SEO工作而言,我們知道一個網站做SEO的基礎訴求就是讓用戶和搜索引擎更好的理解網站內容,雖然隨著搜索引擎算法技術的迭代,目前SEO面臨更大的挑戰與競爭,但基于搜索營銷,它目前仍然顯得十分重要。 那么&#xff0…

白話說編程之java線程

白話說編程之java線程線程和進程:進程:線程:線程和進程的區別:詳解多線程:并發為什么使用并發并發的執行原理并行線程的五種狀態:創建狀態:就緒狀態:運行狀態:阻塞狀態:死…

powerdesigner顯示工具面板_photoshop教程-畫筆工具預設與選項設置

定義畫筆預設在打開的“畫筆”面板中,單擊左側的“畫筆筆尖形狀”名稱,可顯示筆尖形狀圖案。單擊“畫筆”面板左側其他不同的選項名稱,在右側就會顯示其對應的調節項。只單擊不同選項前面的方框,可使此選項有效,但右側…

C#屬性的聲明和使用演示源碼片段

工作閑暇時間,將代碼過程重要的一些代碼做個收藏,如下代碼是關于C#屬性的聲明和使用演示片段的代碼,應該對碼農有一些好處。 using System; class Person {private string myName "N/A";private int myAge 0;public string Name{g…

深入理解== 和 equals 的區別

深入理解 和 equals 的本質區別簡介區別:圖解:注意點:源碼分析:總結分享一波:程序員賺外快-必看的巔峰干貨簡介 初學者常常被" “和‘equals ’所折磨,為什么,因為他們的大概意思相同,都是…

rsem比對_RSEM方法比對和表達量計算

分析模塊,封裝了Trinity程序包中的“align_and_estimate_abundance.pl”腳本,進行原始數據與轉錄本序列的比對和表達量計算。其中,核心程序為,Bowtie或Bowtie2進行原始數據與轉錄本序列的比對,RSEM根據比對結果進行表達…

java sleep和wait區別

為什么80%的碼農都做不了架構師?>>> 關于sleep和wait區別解析: sleep只是釋放CPU資源,并不釋放資源鎖對象,wait是會釋放掉資源鎖對象。 比如,有個鎖對象object,線程1和線程2都會鎖住object對象…

u8轉完看不到菜單_web網頁有錯誤,無法看到操作菜單-用友U8

文章摘要:本文提供在用友U8V8.51erp軟件財務會計管理的WEB財務模塊中客戶在使用WEB功能時,沒有使用默認的設置,是將WEB功能設置在自己的網站上面,訪問WEB功能沒有問題,界面出來了,輸入用戶名、密碼、選擇帳…

.Net Core 項目引用本地類庫方式(二)

上篇文章有詳細的介紹.Net Core 項目中引用本地類庫通過打包,然后Nugety引用方式,這里再介紹一種引用包的方式 轉載于:https://www.cnblogs.com/wangshitou/p/10283800.html

深入理解equals和hashCode關系和區別

深入理解equals和hashCode關系和區別直入主題:區別:1.他們判斷對象相同的方式不一樣:2.他們判斷對象是否相等的準確率不一樣:改寫equals時總是要改寫hashcode分享一波:程序員賺外快-必看的巔峰干貨為什么要說equals和hashCode這兩…

lol韓服游戲內設置_韓服LOL進去了還不能玩?教你如何玩韓服!

領取免費韓服LOL安全號,百度搜索韓服LOL微博關注即可!上圖錯誤為常識性錯誤,LOL韓服游戲的安裝文件路徑有中文所導致的錯誤 解決方法:將安裝路徑里的中文改成英文即可 舉例 包含中文漢字的文件夾都是錯誤的 Program FilesLOL韓服 …

Jdk 和 jre 的 關系和區別

Jdk 和 jre 的 關系和區別 區別: JDK:是Java Development Kit 的簡稱–>翻譯過來就是:Java 開發工具包。是程序員使用java語言編寫java程序所需的開發工具包,是提供給程序員使用的。 JRE:是Java Runtime Environm…

OpenCV-Python入門教程7-PyQt編寫GUI界面

前面一直都是使用命令行運行代碼,不夠人性化。這篇用Python編寫一個GUI界面,使用PyQt5編寫圖像處理程序。包括:打開、關閉攝像頭,捕獲圖片,讀取本地圖片,灰度化和Otsu自動閾值分割的功能。 使用Qt Designer…

spark 廣播變量大數據_大數據處理 | Spark集群搭建及基本使用

點擊藍字關注我前面用了一篇文章詳細的介紹了集群HDFS文件系統的搭建,HDFS文件系統只是一個用于存儲數據的系統,它主要是用來服務于大數據計算框架,例如MapReduce、Spark,本文就接著上一篇文章來詳細介紹一下Spark集群的搭建及Spa…

如何將本地項目上傳到gitee

*************************************優雅的分割線 ********************************** 分享一波:程序員賺外快-必看的巔峰干貨 如果以上內容對你覺得有用,并想獲取更多的賺錢方式和免費的技術教程 請關注微信公眾號:HB荷包 一個能讓你學習技術和賺錢方法的公眾號,持續更…

oracle dg 備庫未設置convert參數導致ORA-01111,ORA-01110

2019獨角獸企業重金招聘Python工程師標準>>> 查看trace 文件: MRP0: Background Managed Standby Recovery process started (amls) started logmerger process Sun Jan 20 07:55:53 2019 Managed Standby Recovery starting Real Time Apply MRP0: Back…

git回退歷史版本無法上傳_Git系列教程(二):版本庫中添加文件、版本回退

Git系列教程(一):簡介、安裝、配置我們學習了分布式和版本控制系統的概念、Git具有的8個功能以及如何在Windows上安裝Git、進行相關配置并創建版本庫。Git版本庫中添加文件Git 的工作就是創建和保存你的項目的快照及與之后的快照進行對比。我們編寫一個readme.txt文…