HTTP面試題——緩存技術

目錄

HTTP緩存技術有哪些?

什么是強制緩存?

什么是協商緩存?


HTTP緩存技術有哪些?

對于一些具有重復性的HTTP請求,比如每次請求得到的數據都是一樣的,我們可以把這對 請求-響應的數據都緩存在本地,那么下次就直接讀取本地數據,不必通過網絡獲取服務器響應的數據了,這樣對于http1.1的性能是明顯的提升。

對于http緩存有兩種實現方式,分別是強制緩存協商緩存

什么是強制緩存?

強制緩存:指的是只要瀏覽器判斷緩存沒有過期,直接使用瀏覽器的緩存,決定是否使用緩存的主動性在瀏覽器這邊

強緩存是利用下面這兩個http響應頭部(Response Header)字段實現的,都用來表示資源在客戶端的有效期:

Cache-Control,是一個相對時間;

Expires,是一個絕對時間;

Cache-Control和Expires字段同時存在的化,Cache-Control的優先級更高于Expires。

Cache-Control實現強制緩存。具體流程如下:

  1. 當瀏覽器第一次請求訪問服務器資源時,服務器會在這返回這個資源的同時,在Response頭部加上Cache-control,Cache-Control中這是了過期時間大小;
  2. 瀏覽器再次請求訪問服務器中的該資源時,會想通過請求資源的時間與Cache-Control中的過期時間大小,來計算該資源是否過期,如果沒有,則使用該緩存,否則重新請求服務器;
  3. 服務器再次收到請求后,會再次更新Response頭部的Cache-Control。

什么是協商緩存?

當我們在瀏覽器使用開發者工具的時候,你可能會看到過某些請求的響應碼是304,這個是告訴瀏覽器可以使用本地緩存的資源,通常這種通過服務端告知客戶端可以使用緩存的方式被稱為協商緩存。

協商緩存可以基于兩種頭部來實現。

第一種:請求頭部中的If-Modified-since字段與響應頭部中的Last-Modified字段實現,這兩個字段的意思是:

  • 響應頭部中的Last-Modified:表示這個響應資源的最后修改時間;
  • 請求頭部中的If-Modified-Since:當資源過期了,發現響應頭中具有Last-Modified聲明,則再次發起請求的時候帶上Last-Modified的時間,服務器收到請求后發現有If-Modified-Since則與被請求資源的最后修改時間進行對比(Last-Modified),如果最后修改時間比較新,說明資源又被修改過,則返回最新資源,HTTP 200 OK;如果最后修改時間比較舊,說明資源無新修改,響應HTTP 304走緩存。

第二種:頭部中的if-None-Match字段與響應頭部中的ETag字段,這兩個字段的意思是:

  • 響應頭部中Etag:唯一標識響應資源;
  • 請求頭部中的If-None-match:當資源過期時,瀏覽器發現響應頭里有Etag,則再次向服務器發起請求時,會將請求頭If-None-Match值設置為Etag的值。服務器收到請求后進行比對,如果資源沒有變化返回304,如果資源變化了返回200。

第一種實現方式是基于時間實現的,第二種實現方式是基于一個唯一標識實現的,相對來說后者可以更加準確的判斷文件內容是否被修改,避免由于時間篡改導致的不可靠問題。

如果在第一次請求資源的時候,服務端返回的HTTP響應頭部同時有Etag和last-Modified字段,那么客戶端在下一次請i去的時候如果帶上了Etag和Last-Modified字段信息給服務端,這時Etag的優先級更高,也就是服務端會先判斷Etag是否變化了,如果Etag有變化就不用在判斷Last-Modified,如果Etag沒有變化,然后再看last-Modified。

Etag優先級高于Last-Modified的原因:

因為在沒有修改文件內容情況下的最后修改時間也可能發生改變,這導致客戶端認為文件被改動了從新發起請求;

有些文件修改在毫秒級內,if-since-Since能檢查到的粒度是秒級的,

而且協商緩存這兩個字段都需要配合強制緩存中的Cache-Control字段來使用,只有在未能命中強制緩存的時候,才能發起帶有協商緩存字段的請求。

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

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

相關文章

virtual box 不能分配 USB設備 IFX DAS JDS TriBoard TC2X5 V2.0 [0700] 到虛擬電腦 win10

VirtualBox: Failed to attach the USB device to the virtual machine – Bytefreaks.net ISSUE: virtual box 不能分配 USB設備 IFX DAS JDS TriBoard TC2X5 V2.0 [0700] 到虛擬電腦 win10. USB device IFX DAS JDS TriBoard TC2X5 V2.0 with UUID {91680aeb-e1…

Deepoc大模型重構核工業智能基座:混合增強架構與安全增強決策技術?

面向復雜系統的高可靠AI賦能體系構建 Deepoc大模型通過多維度技術突破&#xff0c;顯著提升核工業知識處理與決策可靠性。經核能行業驗證&#xff0c;其生成內容可驗證性提升68%&#xff0c;關鍵參數失真率<0.3%&#xff0c;形成覆蓋核能全鏈條的定制化方案&#xff0c;使企…

第12章:冰箱里的CT掃描儀——計算機視覺如何洞穿食材的“生命密碼“

第11章:冰箱里的CT掃描儀——計算機視覺如何成為食材健康的"超級診斷官" “糟了!冰箱里草莓長出了白色絨毛,雞胸肉滲出了可疑的粉紅色液體!” 這揭示了廚房生存的更基本挑戰:如何像經驗豐富的主廚一樣,一眼洞穿食材的健康密碼? 本章將揭示計算機視覺技術如何賦…

虛幻基礎:窗口——重定向

能幫到你的話&#xff0c;就給個贊吧 &#x1f618; 文章目錄 重定向&#xff1a;給骨架添加兼容骨架。使得不同模型間復用動畫資源 重定向&#xff1a;給骨架添加兼容骨架。使得不同模型間復用動畫資源

CSS 逐幀動畫

CSS 逐幀動畫實現指南 逐幀動畫(frame-by-frame animation)是一種通過快速連續顯示一系列靜態圖像來創造運動效果的技術。以下是使用CSS實現逐幀動畫的幾種方法。 1. 使用 steps() 計時函數 這是實現逐幀動畫最常用的方法&#xff0c;通過animation-timing-function的steps(…

高版本IDEA如何開發低版本jdk項目

問題描述 我這個人比較喜歡新的東西&#xff0c;比如使用idea的時候&#xff0c;我就喜歡最新版本。 但是有個問題&#xff0c;最新版本的idea好像不支持jdk1.6&#xff0c;導致我無法去用新版本idea開發項目。 直到有一天&#xff0c;idea給了我一個提示如下&#xff0c;之…

Java設計模式->責任鏈模式的介紹

目錄 1、責任鏈模式概念 1.1、定義介紹 1.2、流程圖 1.3、優缺點 2、實現 3、應用場景 3.1、Springmvc流程 3.2、mybatis的執行流程 3.3、Spring的過濾器和攔截器 3.4、sentinel限流熔斷 3.5、aop的加載和使用 4、舉例 前言 是一種 行為型設計模式&#xff0c;它通…

【Bluedroid】藍牙啟動之 btm_acl_device_down 流程源碼解析

本文詳細分析Android藍牙協議棧在設備故障時的處理流程。當藍牙設備發生硬件故障或系統異常時,協議棧通過btm_acl_device_down觸發多層次的資源清理和狀態重置,包括ACL連接終止、L2CAP通道釋放、SCO連接清理、BLE拓撲更新、設備數據庫重置等關鍵操作,確保系統安全恢復。 一、…

隨記:WebMvcConfigurationSupport 和WebMvcConfigurer 的區別

WebMvcConfigurationSupport &#xff08;抽象類&#xff09; 他是一個完整的 MVC 配置基類&#xff0c;他會禁用所有自動配置。默認靜態資源映射也沒有了。默認消息轉換器&#xff08;json、xml&#xff09;也沒有了。錯誤處理頁默認的error也沒有了。 WebMvcConfigurer &am…

npm run dev報錯

1. 引言 1.1 什么是npm run dev npm run dev 是一個在 Node.js 項目中常用的命令&#xff0c;它允許開發者運行一個預定義的腳本&#xff0c;通常用于啟動開發服務器或者執行開發環境的構建任務。這個命令是通過 package.json 文件中的 scripts 部分定義的&#xff0c;例如&…

Kotlin環境搭建與基礎語法入門

目標&#xff1a;完成開發環境配置&#xff0c;編寫第一個Kotlin程序&#xff0c;理解變量、數據類型和基本輸出。 1. 環境搭建 步驟1&#xff1a;安裝JDK 下載并安裝 JDK 17&#xff08;Kotlin兼容性最佳版本&#xff09;。 配置環境變量 JAVA_HOME&#xff0c;并在終端驗證…

CLion開發Qt桌面程序_git的簡單使用_小團體

OS&#xff1a;Windows Qt&#xff1a;6.8.1&#xff08;6.x&#xff09; Eg&#xff1a;學生信息管理系統 前言 Qt Creator編寫代碼不是太方便&#xff0c;使用CLion編寫代碼或許是個不錯的主意&#xff0c;CLion在此處主要是用于后端和測試的開發&#xff0c;界面方面還是…

C語言專題:8.函數指針(Function Pointer)

? 在 C 語言中&#xff0c;函數也是一種“對象”&#xff0c;它在內存中有地址。因此可以定義指向函數的指針&#xff0c;用于動態調用、回調處理、構建函數表等。 掌握函數指針是理解 C 語言“底層抽象”與“模塊化編程”的關鍵。 一、函數指針的基本概念 ? 函數指針是一個變…

快速傅里葉變換(FFT)是什么?

快速傅里葉變換(FFT)是什么&#xff1f; 快速傅里葉變換&#xff08;FFT&#xff09; 本質上是一種極其高效的算法&#xff0c;用來計算**離散傅里葉變換&#xff08;DFT&#xff09;**及其逆變換。它是數字信號處理、科學計算和工程應用中最重要的算法之一。 要理解 FFT&…

EEG分類 - Theta 頻帶 power

在EEG&#xff08;腦電圖&#xff09;信號處理的背景下&#xff0c;theta波段功率&#xff08;Theta Band Power&#xff09;是一個重要的特征&#xff0c;廣泛應用于認知、神經科學和臨床監測等領域。接下來&#xff0c;我將詳細介紹theta波段功率的定義、特性、計算方法以及在…

蒼穹外賣day3--公共字段填充+新增菜品

1.公共字段填充 1.1 問題分析 在新增員工或者新增菜品分類時需要設置創建時間、創建人、修改時間、修改人等字段&#xff0c;在編輯員工或者編輯菜品分類時需要設置修改時間、修改人等字段。這些字段屬于公共字段&#xff0c;也就是也就是在我們的系統中很多表中都會有這些字段…

每次選擇都是成本

概述 我們每個人都在做選擇&#xff0c;而且無時無刻不在做選擇。 有的人有的選&#xff0c;而有的人卻沒得選。 因此從側面來說&#xff0c;有的選反而更是一種幸福。 我們學習的目的就是為了讓我們自己在未來能有更好地選擇&#xff0c;也可以底氣十足地選擇不去做什么&a…

AI in CSR Writing: Revolutionizing Clinical Trial Reports

一、AI在CSR撰寫中的實際應用 1.1 自動化數據整合與報告生成 1.1.1 數據提取與匯總 AI自動從EDC、實驗室系統、安全數據庫提取數據,生成統計圖表和表格,如人口統計學、療效終點、安全性事件表,減少人工操作。 1.1.2 動態報告生成 基于預設模板,AI自動填充數據結果,如自動…

《Java反射到底該不該用?性能、靈活性與可維護性三者博弈》

大家好呀&#xff01;今天我們要聊一個Java中超級強大但也需要謹慎使用的特性——反射機制(Reflection) &#x1f3ad;。我會用最通俗易懂的方式&#xff0c;帶大家徹底搞懂這個"程序界的魔術師"&#xff01; 一、什么是Java反射&#xff1f;&#x1f914; 想象一下…

從Java API調用者到架構思考:我的Elasticsearch認知升級之路

前言&#xff1a;我的Elasticsearch學習歷程 作為一名Java開發者&#xff0c;記得第一次使用ES的Java High Level REST Client時&#xff0c;我被它強大的搜索能力所震撼&#xff0c;但也為復雜的集群調優所困擾。經過多個項目的實戰積累和系統性學習&#xff0c;我終于建立了對…