目錄
强缓存
协商缓存
首頁 web前端 html教學 浏览器缓存,想说爱你不容易_html/css_WEB-ITnose

浏览器缓存,想说爱你不容易_html/css_WEB-ITnose

Jun 24, 2016 am 11:15 AM

  今天小微开店宝在测试环境发布更新的时候,同事问:“为什么我需要手动清理浏览器缓存才能看到变更?难道系统上线后也需要客户自己清理浏览器缓存吗!”看来,这个坑需要我来填了。

什么是浏览器缓存

浏览器缓存(Brower Caching)是浏览器在本地磁盘对用户最近请求过的文档进行存储,当访问者再次访问同一页面时,浏览器就可以直接从本地磁盘加载文档。

浏览器缓存的优点有:

  1. 减少了冗余的数据传输,节省了网费
  2. 减少了服务器的负担,大大提升了网站的性能
  3. 加快了客户端加载网页的速度

在前端开发面试中,浏览器缓存是web性能优化面试题中很重要的一个知识点,从而说明浏览器缓存是提升web性能的一大利器,但是浏览器缓存如果使用不当,也会产生很多问题,正所谓是,想说爱你,并不是很容易的事。所以,结合最近遇到的案例,本文对浏览器缓存相关的知识进行总结归纳,希望对读者有所帮助。

浏览器缓存的分类

浏览器缓存主要有两类:缓存协商和彻底缓存,也有称之为协商缓存和强缓存。

浏览器在第一次请求发生后,再次请求时:

  1. 浏览器会先获取该资源缓存的header信息,根据其中的expires和cahe-control判断是否命中强缓存,若命中则直接从缓存中获取资源,包括缓存的header信息,本次请求不会与服务器进行通信;
  2. 如果没有命中强缓存,浏览器会发送请求到服务器,该请求会携带第一次请求返回的有关缓存的header字段信息(Last-Modified/IF-Modified-Since、Etag/IF-None-Match),由服务器根据请求中的相关header信息来对比结果是否命中协商缓存,若命中,则服务器返回新的响应header信息更新缓存中的对应header信息,但是并不返回资源内容,它会告知浏览器可以直接从缓存获取;否则返回最新的资源内容

强缓存

强缓存是利用http的返回头中的Expires或者Cache-Control两个字段来控制的,用来表示资源的缓存时间。

Expires
该字段是http1.0时的规范,它的值为一个绝对时间的GMT格式的时间字符串,比如Expires:Mon,18 Oct 2066 23:59:59 GMT。这个时间代表着这个资源的失效时间,在此时间之前,即命中缓存。这种方式有一个明显的缺点,由于失效时间是一个绝对时间,所以当服务器与客户端时间偏差较大时,就会导致缓存混乱。

Cache-Control
Cache-Control是http1.1时出现的header信息,主要是利用该字段的max-age值来进行判断,它是一个相对时间,例如Cache-Control:max-age=3600,代表着资源的有效期是3600秒。cache-control除了该字段外,还有下面几个比较常用的设置值:

  • no-cache:不使用本地缓存。需要使用缓存协商,先与服务器确认返回的响应是否被更改,如果之前的响应中存在ETag,那么请求的时候会与服务端验证,如果资源未被更改,则可以避免重新下载。
  • no-store:直接禁止游览器缓存数据,每次用户请求该资源,都会向服务器发送一个请求,每次都会下载完整的资源。
  • public:可以被所有的用户缓存,包括终端用户和CDN等中间代理服务器。
  • private:只能被终端用户的浏览器缓存,不允许CDN等中继缓存服务器对其缓存。
  • Cache-Control与Expires可以在服务端配置同时启用,同时启用的时候Cache-Control优先级高。

    协商缓存

    协商缓存就是由服务器来确定缓存资源是否可用,所以客户端与服务器端要通过某种标识来进行通信,从而让服务器判断请求资源是否可以缓存访问,这主要涉及到下面两组header字段,这两组搭档都是成对出现的,即第一次请求的响应头带上某个字段(Last-Modified或者Etag),则后续请求则会带上对应的请求字段(If-Modified-Since或者If-None-Match),若响应头没有Last-Modified或者Etag字段,则请求头也不会有对应的字段。

    Last-Modify/If-Modify-Since

    浏览器第一次请求一个资源的时候,服务器返回的header中会加上Last-Modify,Last-modify是一个时间标识该资源的最后修改时间,例如Last-Modify: Thu,31 Dec 2037 23:59:59 GMT。

    当浏览器再次请求该资源时,request的请求头中会包含If-Modify-Since,该值为缓存之前返回的Last-Modify。服务器收到If-Modify-Since后,根据资源的最后修改时间判断是否命中缓存。

    如果命中缓存,则返回304,并且不会返回资源内容,并且不会返回Last-Modify。

    ETag/If-None-Match

    与Last-Modify/If-Modify-Since不同的是,Etag/If-None-Match返回的是一个校验码。ETag可以保证每一个资源是唯一的,资源变化都会导致ETag变化。服务器根据浏览器上送的If-None-Match值来判断是否命中缓存。

    与Last-Modified不一样的是,当服务器返回304 Not Modified的响应时,由于ETag重新生成过,response header中还会把这个ETag返回,即使这个ETag跟之前的没有变化。

    为什么要有Etag

    你可能会觉得使用Last-Modified已经足以让浏览器知道本地的缓存副本是否足够新,为什么还需要Etag呢?HTTP1.1中Etag的出现主要是为了解决几个Last-Modified比较难解决的问题:

  • 一些文件也许会周期性的更改,但是他的内容并不改变(仅仅改变的修改时间),这个时候我们并不希望客户端认为这个文件被修改了,而重新GET;
  • 某些文件修改非常频繁,比如在秒以下的时间内进行修改,(比方说1s内修改了N次),If-Modified-Since能检查到的粒度是s级的,这种修改无法判断(或者说UNIX记录MTIME只能精确到秒);
  • 某些服务器不能精确的得到文件的最后修改时间。
  • Last-Modified与ETag是可以一起使用的,服务器会优先验证ETag,一致的情况下,才会继续比对Last-Modified,最后才决定是否返回304。

    强缓存与协商缓存的区别可以用下表来表示:
     |获取资源形式|状态码|发送请求到服务器
    ------|------------|------|----------------
    强缓存|从缓存取 |200(from cache)|否,直接从缓存取
    协商缓存|从缓存取|304(Not Modified)|否,通过服务器来告知缓存是否可用

    用户行为对缓存的影响 用户操作 Expires/Cache-Control Last-Modied/Etag
    地址栏回车 有效 有效
    页面链接跳转 有效 有效
    新开窗口 有效 有效
    前进回退 有效 有效
    F5刷新 无效 有效
    Ctrl+F5强制刷新 无效 无效
    实际问题分析

    如文章开头所属,代码更新到线上后用户浏览器不能自行更新,我们不能要求客户在系统更新后都进行一次缓存清理的操作。

    到底该如何解决呢?

    在资源请求的URL中增加一个参数,比如:js/mian.js?ver=0.7.1。这个参数是一个版本号,每一次部署的时候变更一下,当这个参数变化的时候,强缓存都会失效并重新加载。这样一来,静态资源,部署以后就需要重新加载。这样就比较完美的解决了问题。

    进一步思考

    这样做是不是最完美的呢?很遗憾,不是。

    百度张云龙给出了这样做的弊端,有兴趣可参照下文:
    静态资源版本更新与缓存

    谢谢!

    本網站聲明
    本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

    熱AI工具

    Undresser.AI Undress

    Undresser.AI Undress

    人工智慧驅動的應用程序,用於創建逼真的裸體照片

    AI Clothes Remover

    AI Clothes Remover

    用於從照片中去除衣服的線上人工智慧工具。

    Undress AI Tool

    Undress AI Tool

    免費脫衣圖片

    Clothoff.io

    Clothoff.io

    AI脫衣器

    Video Face Swap

    Video Face Swap

    使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

    熱工具

    記事本++7.3.1

    記事本++7.3.1

    好用且免費的程式碼編輯器

    SublimeText3漢化版

    SublimeText3漢化版

    中文版,非常好用

    禪工作室 13.0.1

    禪工作室 13.0.1

    強大的PHP整合開發環境

    Dreamweaver CS6

    Dreamweaver CS6

    視覺化網頁開發工具

    SublimeText3 Mac版

    SublimeText3 Mac版

    神級程式碼編輯軟體(SublimeText3)

    如何在 Windows 11上顯示所有快取的 DNS 條目 如何在 Windows 11上顯示所有快取的 DNS 條目 May 21, 2023 pm 01:01 PM

    Windows作業系統使用快取來儲存DNS條目。 DNS(網域名稱系統)是用於通訊的網際網路核心技術。特別是用於查找網域的IP位址。當使用者在瀏覽器中鍵入網域名稱時,載入網站時執行的首要任務之一是尋找其IP位址。該過程需要訪問DNS伺服器。通常,網路服務供應商的DNS伺服器會自動使用,但管理員可能會切換到其他DNS伺服器,因為這些伺服器可能更快或提供更好的隱私。如果DNS用於阻止對某些網站的訪問,則切換DNS提供者也可能有助於繞過Internet審查。 Windows使用DNS解

    如何在 Windows 11 上清理快取:詳細的圖片教學 如何在 Windows 11 上清理快取:詳細的圖片教學 Apr 24, 2023 pm 09:37 PM

    什麼是緩存?快取(發音為ka·shay)是一種專門的高速硬體或軟體元件,用於儲存經常要求的資料和指令,這些資料和指令又可用於更快地載入網站、應用程式、服務和系統的其他部分。快取使最常存取的資料隨時可用。快取檔案與快取記憶體不同。快取文件是指經常需要的文件,如PNG、圖標、徽標、著色器等,多個程式可能需要這些文件。這些檔案儲存在您的實體磁碟機空間中,通常是隱藏的。另一方面,高速緩存記憶體是一種比主記憶體和/或RAM更快的記憶體類型。它極大地減少了資料存取時間,因為與RAM相比,它更靠近CPU並且速度

    如何在 Windows 11 中快速清除快取 如何在 Windows 11 中快速清除快取 Apr 13, 2023 pm 05:46 PM

    對於不熟悉這個術語的人來說,清空快取意味著清空它,本文將向您展示如何在 Windows 11 中輕鬆完成。如果您仍然想知道快取檔案是什麼,您應該知道它並不像聽起來那樣技術性。考慮到計算機,快取是將來可能再次需要的非永久文件(或文件)。因此,快取在那個時間到來之前一直是隱藏的,從而保護了內容。快取檔案很重要,但它們也會佔用寶貴的空間。如果您的 SSD 容量有限,這可能是個問題。不過,也有一些好消息。因此,在大多數情況下,可以安全地擦除快取檔案以清理磁碟空間。清除 Windows 11 快取的重要

    如何清除 Safari 快取以優化 Mac 和 iPhone 的效能? 如何清除 Safari 快取以優化 Mac 和 iPhone 的效能? Apr 22, 2023 pm 07:49 PM

    Safari的快取使瀏覽速度更快,但它可能會出錯,它會減慢您的Mac、iPhone或iPad的速度,並且還會佔用大量儲存空間。以下是清除它的方法和時間。與所有網頁瀏覽器一樣,Safari將資料儲存在您的Mac、iPhone和iPad上,其明確目的是加速您的線上生活。您可能擁有ApplePark認為理所當然的那種網路速度,但即便如此,最好將這種速度用於需要的地方。因此,當您重新訪問一個網站時,Safari會盡可能地讓您只需要下載已更改的內容。即使一個新聞網站整天都在更新,基本佈局,頁面的家具

    iPhone 和 iPad:如何清除快取、歷史記錄和 cookie iPhone 和 iPad:如何清除快取、歷史記錄和 cookie Apr 14, 2023 pm 03:37 PM

    如何在Safari和其他應用程式中清除iPhone和iPad上的快取蘋果瀏覽器打開設定向下滑動並點按Safari再次向下滑動並點擊清除歷史記錄和網站數據,再次點擊確認或者,如果您想清除單個網站的資料而不清除整個Safari緩存,請在Safari設定的最底部選擇「進階」>「網站資料」>「編輯」(或從右向左滑動以刪除單一項目)。請記住,從iPhone或iPad刪除的網站資料將從您登入相同iCloud帳戶的其他Apple裝置中刪除,如果它們與Safari同步。清除i

    怎麼清理瀏覽器快取 怎麼清理瀏覽器快取 Jan 09, 2024 pm 05:33 PM

    清理瀏覽器快取的方法:1、手動清理;2、使用瀏覽器設定清理;3、使用第三方工具清理;4、定期清理;5、手動刪除快取檔案;6、使用瀏覽器擴充功能清理;7 、停用瀏覽器快取;8、手動刪除Cookies及Cookie相關檔案。詳細介紹:1、手動清理,開啟瀏覽器,按下鍵盤上的Ctrl+Shift+Delete鍵,在彈出的對話方塊中,選擇「清除瀏覽資料」選項,並選擇要清除的時間範圍等等。

    如何利用瀏覽器快取提升Java網站的存取速度? 如何利用瀏覽器快取提升Java網站的存取速度? Aug 05, 2023 am 10:18 AM

    如何利用瀏覽器快取提升Java網站的存取速度?摘要:瀏覽器快取是提升網站效能的重要手段之一。本文將詳細介紹如何利用瀏覽器快取提升Java網站的存取速度,並附上對應的程式碼範例。一、瀏覽器快取介紹1.1什麼是瀏覽器快取?瀏覽器快取是指瀏覽器在存取一個網頁時,會將該網頁的部分或全部資源(如頁面檔案、圖片、腳本、樣式表等)儲存到本機硬碟或記憶體中,以便下次造訪時可以

    win7瀏覽器快取清除方法介紹 win7瀏覽器快取清除方法介紹 Mar 26, 2024 pm 03:46 PM

    1.以IE瀏覽器為例,在瀏覽器的選單列中點選工具,然後點選【internet選項】;如圖所示:2、在internet選項中,我們可以看到有一個瀏覽記錄的選項,下面有一個複選框,即【退出時刪除瀏覽歷史記錄】,選定之後,在我們關閉瀏覽器的時候,所有的緩存網頁,緩存的文字及圖片音樂視頻等就會全部刪除。當然如果你現在就想刪除,就點擊下面的那個刪除按鈕就可以現在就刪除這些快取檔案了,刪除完成點擊確定;如圖所示:3、瀏覽器的快取現在我們就清理完成了,但是有很多人用的並不是IE瀏覽器,而是其他的瀏覽器,其

    See all articles