淺析Web緩存

来源:http://www.cnblogs.com/tongkaiqiang/archive/2017/05/24/6898939.html
-Advertisement-
Play Games

在前端開發中,性能一直都是被大家所重視的一點,然而判斷一個網站的性能最直觀的就是看網頁打開的速度。其中提高網頁反應速度的一個方式就是使用緩存。一個優秀的緩存策略可以縮短網頁請求資源的距離,減少延遲,並且由於緩存文件可以重覆利用,還可以減少帶寬,降低網路負荷。那麼下麵我們就來看看伺服器端緩存的原理。 ...


在前端開發中,性能一直都是被大家所重視的一點,然而判斷一個網站的性能最直觀的就是看網頁打開的速度。其中提高網頁反應速度的一個方式就是使用緩存。一個優秀的緩存策略可以縮短網頁請求資源的距離,減少延遲,並且由於緩存文件可以重覆利用,還可以減少帶寬,降低網路負荷。那麼下麵我們就來看看伺服器端緩存的原理。

緩存分類

web緩存分為很多種,比如資料庫緩存、代理伺服器緩存、還有我們熟悉的CDN緩存,以及瀏覽器緩存。對於太多文字的閱讀其實我是拒絕的,於是就畫了個圖來解釋下。

瀏覽器通過代理伺服器向源伺服器發起請求的原理如下圖:

 

 

瀏覽器先向代理伺服器發起Web請求,再將請求轉發到源伺服器。它屬於共用緩存,所以很多地方都可以使用其緩存資源,因此對於節省流量有很大作用。

瀏覽器緩存是將文件保存在客戶端,在同一個會話過程中會檢查緩存的副本是否足夠新,在後退網頁時,訪問過的資源可以從瀏覽器緩存中拿出使用。通過減少伺服器處理請求的數量,用戶將獲得更快的體驗

下麵我就來著重講下傳說中的瀏覽器緩存。

 

瀏覽器緩存

頁面的緩存狀態是由header決定的,header的參數有四種:

一、Cache-Control

    1、max-age(單位為s)指定設置緩存最大的有效時間,定義的是時間長短。當瀏覽器向伺服器發送請求後,在max-age這段時間里瀏覽器就不會再向伺服器發送請求了。

我們來找個資源看下。比如shang.qq.com上的css資源,max-age=2592000,也就是說緩存有效期為2592000秒(也就是30天)。於是在30天內都會使用這個版本的資源,即使伺服器上的資源發生了變化,瀏覽器也不會得到通知。max-age會覆蓋掉Expires,後面會有討論。

圖片2

 

 

  2、s-maxage(單位為s)同max-age,只用於共用緩存(比如CDN緩存)。

比如,當s-maxage=60時,在這60秒中,即使更新了CDN的內容,瀏覽器也不會進行請求。也就是說max-age用於普通緩存,而s-maxage用於代理緩存。如果存在s-maxage,則會覆蓋掉max-age和Expires header。

    3、public 指定響應會被緩存,並且在多用戶間共用。也就是下圖的意思。如果沒有指定public還是private,則預設為public。

    4、private 響應只作為私有的緩存(見下圖),不能在用戶間共用。如果要求HTTP認證,響應會自動設置為private。

10

    5、no-cache 指定不緩存響應,表明資源不進行緩存,比如,

圖片3

但是設置了no-cache之後並不代表瀏覽器不緩存,而是在緩存前要向伺服器確認資源是否被更改。因此有的時候只設置no-cache防止緩存還是不夠保險,還可以加上private指令,將過期時間設為過去的時間。

    6、no-store 絕對禁止緩存,一看就知道如果用了這個命令當然就是不會進行緩存啦~每次請求資源都要從伺服器重新獲取。

    7、must-revalidate指定如果頁面是過期的,則去伺服器進行獲取。這個指令並不常用,就不做過多的討論了。

二、Expires

        緩存過期時間,用來指定資源到期的時間,是伺服器端的具體的時間點。也就是說,Expires=max-age + 請求時間,需要和Last-modified結合使用。但在上面我們提到過,cache-control的優先順序更高。 Expires是Web伺服器響應消息頭欄位,在響應http請求時告訴瀏覽器在過期時間前瀏覽器可以直接從瀏覽器緩存取數據,而無需再次請求。

11

三、Last-modified 

        伺服器端文件的最後修改時間,需要和cache-control共同使用,是檢查伺服器端資源是否更新的一種方式。當瀏覽器再次進行請求時,會向伺服器傳送If-Modified-Since報頭,詢問Last-Modified時間點之後資源是否被修改過。如果沒有修改,則返回碼為304,使用緩存;如果修改過,則再次去伺服器請求資源,返回碼和首次請求相同為200,資源為伺服器最新資源。

如下圖,最後修改時間為2014年12月19日星期五2點50分47秒

圖片4

四、ETag

        根據實體內容生成一段hash字元串,標識資源的狀態,由服務端產生。瀏覽器會將這串字元串傳回伺服器,驗證資源是否已經修改,如果沒有修改,過程如下:

12

使用ETag可以解決Last-modified存在的一些問題:

    a、某些伺服器不能精確得到資源的最後修改時間,這樣就無法通過最後修改時間判斷資源是否更新 

    b、如果資源修改非常頻繁,在秒以下的時間內進行修改,而Last-modified只能精確到秒 

    c、一些資源的最後修改時間改變了,但是內容沒改變,使用ETag就認為資源還是沒有修改的。

 

使用緩存流程

還是用圖說話,下麵是我所總結的從瀏覽器請求到展示資源的過程:

圖片6

  

cache-control指令使用

說了那麼多cache-control的指令,那麼如何選擇使用哪些指令呢?我還是不說話==

圖片5

 

額外的

除了開頭提到的那麼多緩存方式以外,還有一種我們都熟悉的緩存方式,LocalStorage和sessionStorage(好像是兩種23333)。

LocalStorage是一種本地存儲的公共資源,功能變數名稱下很多應用共用這份資源會有風險;LocalStorage是以頁面功能變數名稱劃分的,如果有多個等價功能變數名稱之間的LocalStorage不互通,則會造成緩存多份浪費。

LocalStorage在PC上的相容性不太好,而且當網路速度快、協商緩存響應快時使用localStorage的速度比不上304。並且不能緩存css文件。而移動端由於網速慢,使用localStorage要快於304。

 

在html中載入一個png圖,首次載入的時候時間如下圖,

圖片7

然而將圖片使用了LocalStorage存儲後,再次刷新後載入時間為0。

圖片8

而相對LocalStorage來說,SessionStorage的數據只存儲到特定的會話中,不屬於持久化的存儲,所以關閉瀏覽器會清除數據。和localstorage具有相同的方法。

 

在前端開發中緩存是必不可少的,那麼使用怎樣的緩存方式更高效、讓我們項目的性能更優,還是需要我們仔細斟酌。

原創文章轉載請註明:

轉載自AlloyTeam:http://www.alloyteam.com/2016/03/discussion-on-web-caching/


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

-Advertisement-
Play Games
更多相關文章
  • 更新時間: 2016-3-25 HTML Doctype作用?標準模式與相容模式各有什麼區別? (1)、<!DOCTYPE>聲明位於位於HTML文檔中的第一行,處於 <html> 標簽之前。告知瀏覽器的解析器用什麼文檔標準解析這個文檔。DOCTYPE不存在或格式不正確會導致文檔以相容模式呈現。 (2 ...
  • 設置input寬高,邊框大小顏色,背景顏色,字體顏色,字體大小,背景圖片,去除藍色邊框。 input{width:80px ;height:30px;border:1px solid red;color:red;font-size:18px;background:url(圖片路徑) no-repea ...
  • 1、將div的滾動條滾動到最底端 ...
  • js的功能非常強大,那麼現在我們就用js裡面的for迴圈來輸出一個原汁原味的九九乘法表; <script type="text/javascript"> document.write('<table border="1" bgcolor="#ccc" width="80%" cellpadding= ...
  • transform的作用 transform 屬性向元素應用 2D 或 3D 轉換。該屬性允許我們對元素進行旋轉、縮放、移動或傾斜。(w3cschool) transform的相容性 transform的相容性還是比較樂觀的。IE9以下不相容,IE9支持代替的-ms-transform屬性不過只支持 ...
  • 學了點dom,寫個輪播練練手,這是本人大體寫的樣子,一些細節功能還待完善。 ...
  • //這隻是一個大概的演示了工廠模式的原理, //這個是Car的構造函數 function Car(){ this.type='car';//為Car定義了一個屬性type下麵要用 } //在Car的原型上添加了一個方法say用來輸出列印一句話 Car.prototype.say=function()... ...
  • JavaScript很了不起。很容易學習它的一部分,但是完整地(甚至是充分地)學習它可就難太多了。當開發者們遭遇困惑時,他們經常責備這門語言而不是自己對它理解的匱乏。這些書的目的就是要修正這些情況,極大地鞏固這門語言中你現在可以,而且應當,深刻懂得的東西。 註意:這本書中的許多例子都假定運行在現代化 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...