HTTP緩存初探

来源:https://www.cnblogs.com/walk1314/archive/2018/09/07/9603386.html
-Advertisement-
Play Games

緩存的作用 用戶訪問一個web頁面的頻率遠高於web頁面更新的頻率,因此多數時候用戶從伺服器獲取的html、js、css以及圖片等內容都是相同的,如果每次訪問都從伺服器獲取這些靜態內容即降低了頁面載入的速度,又占用了多餘的伺服器帶寬,顯然是一件吃力不討好的事,此時就需要緩存了。web緩存大致可以分為 ...


緩存的作用

用戶訪問一個web頁面的頻率遠高於web頁面更新的頻率,因此多數時候用戶從伺服器獲取的html、js、css以及圖片等內容都是相同的,如果每次訪問都從伺服器獲取這些靜態內容即降低了頁面載入的速度,又占用了多餘的伺服器帶寬,顯然是一件吃力不討好的事,此時就需要緩存了。web緩存大致可以分為:資料庫緩存、伺服器端緩存(代理伺服器緩存、CDN緩存)、瀏覽器緩存,瀏覽器緩存也包含很多內容:HTTP緩存、indexDB、cookie、localstorage等,我們只討論HTTP緩存。

HTTP緩存

通過下圖對HTTP緩存有個整體認識:

HTTP報文是瀏覽器和伺服器間通信時發送及響應的數據塊。瀏覽器向伺服器請求數據,發送請求request報文;伺服器向瀏覽器返回數據,返迴響應response報文。而報文信息主要分為兩部分:

  包含屬性的首部報頭header,cookie,緩存信息等與緩存相關的規則信息,均包含在header中;
  包含數據的主體部分body,這是HTTP請求真正想要傳輸的部分。

可以看出,HTTP緩存得以實現主要取決於header中的參數,我們通過分析header中關於緩存的參數,可以瞭解HTTP緩存是怎麼工作的。

HTTP緩存主要分為兩大類:強制緩存、對比緩存。

強制緩存

在沒有緩存數據的情況下,瀏覽器向伺服器請求數據時,伺服器會將數據和緩存規則一併返回,緩存規則信息包含在響應header中;在緩存數據未失效的情況下,可以直接使用緩存數據,對於強制緩存來說,響應header中會有兩個欄位來標明失效規則(Expires/Cache-Control)。

Expires

  Expires值為服務端返回的到期時間,即下一次請求時,請求時間小於服務端返回的到期時間,直接使用緩存數據。不過Expires是HTTP1.0的東西,現在瀏覽器均預設使用HTTP1.1(Cache-Control),所以它的作用基本忽略。

Cache-Control

  Cache-Control常見的取值有private、public、no-cache、max-age,no-store,預設為private。

  private:客戶端可以緩存
  public:客戶端和代理伺服器都可緩存
  max-age=xxx:緩存的內容將在xxx秒後失效
  no-cache:需要使用對比緩存來驗證緩存數據
  no-store:所有內容都不會緩存,強制緩存,對比緩存都不會觸發

對比緩存

 對比緩存,進行比較判斷是否可以使用緩存。當瀏覽器第一次請求數據時,伺服器會將緩存標識與數據一起返回給客戶端,客戶端將二者備份至緩存資料庫中;再次請求數據時,客戶端將備份的緩存標識發送給伺服器,伺服器根據緩存標識進行判斷,成功則返回304狀態碼,通知客戶端可以使用緩存數據,不成功則返回200狀態碼,重新獲取數據。

對比緩存的header中主要有兩種緩存標識,分別在請求header和響應header中。

Last-Modified / If-Modified-Since

Last-Modified(響應header中):伺服器在響應請求時,告知瀏覽器資源的最後修改時間。

If-Modified-Since(請求header中):再次請求伺服器時,通過此欄位通知伺服器上次請求時伺服器返回的資源最後修改時間。
  伺服器收到請求後發現有頭If-Modified-Since 則與被請求資源的最後修改時間進行比對,若資源的最後修改時間大於If-Modified-Since,則返回狀態碼200,重新返回資源;若資源的最後修改時間小於或等於If-Modified-Since,則響應狀態碼304,告知瀏覽器繼續使用所保存的cache。

Etag / If-None-Match(優先順序高於Last-Modified/If-Modified-Since)

Etag(響應header中):伺服器響應請求時,告訴瀏覽器當前資源在伺服器的唯一標識(生成規則由伺服器決定)。
If-None-Match(請求header中):再次請求伺服器時,通過此欄位告知伺服器瀏覽器緩存數據的唯一標識。
    伺服器收到請求後發現有If-None-Match,則與被請求資源的唯一標識進行比對,不同,返回狀態碼200,重新返回資源;相同,返回狀態碼304,告知瀏覽器繼續使用所保存的cache。

註意:強制緩存如果生效,則不需要再和伺服器發生交互,而對比緩存不管是否生效,都需要與服務端發生交互;如果兩類緩存規則同時存在,強制緩存優先順序高於對比緩存


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • "磨刀不費砍材工",在熟悉了MAC 和 Xcode 快捷鍵後一定可以幫助我們更快捷方便的開發程式 MAC 快捷鍵: command + Q = 退出應用程式 command + control + Eject =重啟 command + W = 關閉視窗 command + option + Eje ...
  • CDN 全稱:Content Delivery Network或Content Ddistribute Network,即內容分髮網絡,通過在網路各處放置節點伺服器所構成的在現有的互聯網基礎之上的一層智能虛擬網路,實時地根據網路流量和各節點的連接、負載狀況以及到用戶的距離和響應時間等綜合信息,將用戶 ...
  • 雲盤鏈接 鏈接: 密碼: 通過本文無法把本文中的實驗進行成功,請聯繫作者本人,作者會錄製視頻發送給您 如果大家有比較好的技術分享平臺或者博客平臺等歡迎分享,感謝。 不得不吐槽博客園的編輯器真心用不太習慣。建議大家下載完成可以使用 typora編輯器進行閱讀。 少於150不讓發送 如果轉載請把本文鏈接 ...
  • 1、查看磁碟分區UUID: [root@rac01 ~]# blkid /dev/sdb1: UUID="6bba92c4-0b25-4cc4-9442-ca87c563720a" TYPE="xfs" /dev/sda1: UUID="21b2b922-fcb7-461f-bdc6-3bd9225 ...
  • 使用情景: 之前電腦安裝了windows 7/ fedora 28 雙系統,由於特殊原因,需要刪除 windows 系統。在格式化硬碟後,我們還需要跟新 grub2 的啟動條目;刪除grub 啟動的界面的 windows7 選項。 解決方法: grub 硬碟啟動選項由 /boot/grub2/gru ...
  • 升級了Mac 10.13.4 後應用軟體各種不適配,最近更新了一個應用版本,在去安全設置裡面 信任應用的時候,發現“任何來源”這個選項不見了!不見了!WTF! 接下來,我們就打開終端,然後輸入以下命令: 輸入後,會讓你輸入電腦的密碼,輸入就可以(屏幕上不會顯示,但你真的輸入了,Linux和Unix核 ...
  • 原創作者:http://www.cnblogs.com/jerome-rong/archive/2013/02/19/2916608.html Java RunTime Environment (JRE) or Java Development Kit (JDK) must be available ...
  • 雖然不怎麼用Ubuntu來看文檔,但是偶爾還是需要看一下的。而Ubuntu自帶的打開PDF的軟體真的看著很難受,裝一個跨平臺的福昕好了。 首先,下載。可以官網下載:福昕官網 不過晚上不知道網路抽風還是什麼問題,下載賊慢。選擇了參考博客里提供的wget命令下載。 然後解壓縮: 然後修改許可權,並運行: ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...