http緩存提高性能

来源:http://www.cnblogs.com/beidan/archive/2016/12/10/cache.html
-Advertisement-
Play Games

秋招也算是正式結束了,現在整理一下筆記,當作鞏固一下知識,也希望這個對大家有幫助 http 緩存 和 cdn 緩存可以說是面試必問的問題,竟然是必問的問題,那就總結全面一點~ http緩存機制 秋招也算是正式結束了,現在整理一下筆記,當作鞏固一下知識,也希望這個對大家有幫助 http 緩存 和 cd ...


秋招也算是正式結束了,現在整理一下筆記,當作鞏固一下知識,也希望這個對大家有幫助

http 緩存 和 cdn 緩存可以說是面試必問的問題,竟然是必問的問題,那就總結全面一點~

 

http緩存機制

緩存分為服務端側(server side,比如 Nginx、Apache)和客戶端側(client side,比如 web browser)。

服務端緩存又分為 代理伺服器緩存 和 反向代理伺服器緩存(也叫網關緩存,比如 Nginx反向代理、Squid等),其實廣泛使用的 CDN 也是一種服務端緩存,目的都是讓用戶的請求走”捷徑“,並且都是緩存圖片、文件等靜態資源。

瀏覽器緩存控制機制有兩種:HTML Meta標簽 vs. HTTP頭信息

<META HTTP-EQUIV="Pragma" CONTENT="no-cache">

上述代碼的作用是告訴瀏覽器當前頁面不被緩存,每次訪問都需要去伺服器拉取。使用上很簡單,但只有部分瀏覽器可以支持,而且所有緩存代理伺服器都不支持,因為代理不解析HTML內容本身。

 

 


 

expires和cache control 都是指明資源的緩存有效期,如果有效,就(200 from cache)

  • expires :   http1.0,伺服器響應消息頭欄位,在響應http請求時告訴瀏覽器在過期時間前可以直接從瀏覽器緩存存取數據(200 from cache),而無需再次請求,現在預設瀏覽器都是預設使用http 1.1,所以它的作用基本忽略。

缺點:返回的到期時間是伺服器端的時間,如果客戶端和伺服器的時間相差很大,誤差就很大。所以,在http 1.1開始,就使用cache-control:max-age 秒替代

<meta http-equiv="Cache-Control" content="max-age=7200" />
<meta http-equiv="Expires" content="Mon, 20 Jul 2009 23:00:00 GMT" />

 

  • cache-control  : http 1.1 ,與expires作用一致,都是指明資源的緩存有效期。不過cache-control選擇更多,設置更細緻,如果同時設置的話,優先順序高於expires 

Public指示響應可被任何緩存區緩存。 

Private指示對於單個用戶的整個或部分響應消息,不能被共用緩存處理。這允許伺服器僅僅描述當用戶的部分響應消息,此響應消息對於其他用戶的請求無效。 

no-cache指示請求或響應消息不能緩存,該選項並不是說可以設置”不緩存“,容易望文生義~ 

no-store用於防止重要的信息被無意的發佈。在請求消息中發送將使得請求和響應消息都不使用緩存,完全不存下來。 

max-age指示客戶機可以接收生存期不大於指定時間(以秒為單位)的響應。 

min-fresh指示客戶機可以接收響應時間小於當前時間加上指定時間的響應。 

max-stale指示客戶機可以接收超出超時期間的響應消息。如果指定max-stale消息的值,那麼客戶機可以接收超出超時期指定值之內的響應消息。

 

last-modified和Etag    判斷之後(304 協商緩存)

  • last-modified指這個響應資源的最後修改時間。

當資源過期時(max-age/expires),發現資源具有Last-Modified聲明,則再次向web伺服器請求時帶上頭 If-Modified-Since,表示請求時間。web伺服器收到請求後發現有頭If-Modified-Since 則與被請求資源的最後修改時間進行比對。若最後修改時間較新,說明資源又被改動過,則響應整片資源內容(寫在響應消息包體內),HTTP 200;若最後修改時間較舊,說明資源無新修改,則響應HTTP 304 (協商緩存)。If-Modified-Since能檢查到的粒度是s級的

  • Etag :http 1.1,Last-Modified與ETag一起使用時,伺服器會優先驗證ETag。Etag僅僅是一個和文件相關的標記,可以是一個版本標記,比如說v1.0.0或者說"2e681a-6-5d044840"這麼一串看起來 很神秘的編碼。伺服器判斷發送過來的Etag和計算出來的Etag匹配,因此If-None-Match為False,不返回200,返回304

用戶操作行為與緩存

img

瀏覽器中的操作對緩存的影響:

  • 強制刷新 – 當按下ctrl+F5來刷新頁面的時候, 瀏覽器將繞過各種緩存(本地緩存和協商緩存), 直接讓伺服器返回最新的資源;
  • 普通刷新 – 當按下F5來刷新頁面的時候,瀏覽器將繞過本地緩蹲來發送請求到伺服器, 此時, 協商緩存是有效的
  • 回車或轉向 – 當在地址欄上輸入回車或者按下跳轉按鈕的時候, 所有緩存都生效

 


CDN (Content Delivery Network,內容分髮網絡)

CDN部署靜態內容:指 JavaScript、CSS、圖片、圖標、Flash 等,不包括頁面html。

--CDN是什麼?

CDN是一組分佈在多個不同地理位置的Web伺服器,用於更加有效地向用戶發佈內容。在優化性能時, 會根據距離的遠近來選擇。

1.將靜態資源緩存到離用戶很近的相同網路運營商的CDN節點上。

優點:如果應用程式web伺服器離用戶更近,那麼一個http請求的響應時間將縮短,另一方面,如果組件web伺服器離用戶更近,則多個http請求的響應時間將縮短

不同地區的用戶會訪問到離自己最近的相同網路線路上的CDN節點,當請求達到CDN節點後,節點會判斷自己的內容緩存是否有效,一個地區內只要有一個用戶先載入資源,在CDN中建立了緩存,該地區的其他後續用戶都能因此而受益。

不同地區的用戶訪問同一個功能變數名稱卻能得到不同CDN節點的IP地址,這要依賴於CDN服務商提供的智能功能變數名稱解析服務,瀏覽器發起功能變數名稱查詢時,這種智能DNS服務會根據用戶IP計算並返回離它最近的同網路CDN節點IP,引導瀏覽器與此節點建立連接以獲取資源。

 

2.載入靜態資源使用與頁面不同的功能變數名稱[不是用獨立的二級或三級功能變數名稱,而是用獨立的一級功能變數名稱]

原理:當瀏覽器向伺服器請求一個靜態資源時,會先發送同功能變數名稱下的 cookie,伺服器對於這些 cookie 不會做任何處理。因此它們只是在毫無意義的消耗帶寬。所以你應該確保對於靜態內容的請求是無coockie的請求。

靜態資源和主頁面不同域,這樣載入資源的http請求就不會帶上主頁面種的cookie等數據,減少了數據傳輸量。節省流量,提升上傳效率

 

3.動靜分離,減少核心伺服器的壓力

 

4.併發限制

原理:瀏覽器對同一個功能變數名稱下的請求有併發的限制,(ie6為2個,其他為6個)

設置單獨功能變數名稱伺服器,可以提升請求併發數,也就是令瀏覽器並行下載更多資源,提高站點性能。

 

5.方便復用--放在另一個伺服器上,可以方便全局內其他產品的使用。

利於客戶端的緩存,比如你打開了taobao.com,緩存了t.js文件,那麼再打開tmall的時候,由於請求的是同一文件,就不用再下載了

 

 

 

 

 

 

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

-Advertisement-
Play Games
更多相關文章
  • 想給訂閱號做一個網頁,如果進入後發現沒關註微信公眾號就提示關註。但是微信對訂閱號做了限制,無論是否認證都是不能網頁授權獲取用戶信息的,這就給網頁內直接判斷用戶是否關註該訂閱號造成了困難。 解決這個問題通過另一個網站授權或認證的服務號間接完成以下以認證的服務號為例說明下如何在網頁中判斷訂閱號是否被關註 ...
  • 一、獲取內聯樣式 在這種情況下,獲取和設置樣式只靠style屬性就可以,因為element.style屬性返回的是類似數組的一組樣式屬性及對應值,因此訪問具體樣式的時候可以採取兩種方式即“ele.style.屬性名稱”和“ele.style['屬性名稱']”。但是,要註意的是,針對css樣式里bac ...
  • 眼看就要期末了,我的專業課也迎來了第二次的期末作業 《網上購物系統》。雖然老師的意圖是在鍛煉我們後臺的能力,但是想著還是不利用網上的模板,準備自己寫,以來別人寫的靜態頁看不懂,再著可以鍛煉自己做網頁的能力。所以趁有點小進展就想分享自己的作業進展狀態。下麵是我頁面運行的截圖。 可能粘貼的圖片沒有任何的 ...
  • BFC 在上一篇文章中, "清除浮動方法解析" ,我們談及了一些使用css屬性解決浮動帶來的影響。但是在解決浮動帶來的影響的方法中,如果細心思考,會產生如下疑問: 為什麼 可以清除浮動帶來的影響? 能否用其他css屬性清除浮動帶來的影響? 種種的疑問,會讓你覺得CSS真的不容易精通,說精通過於高大上 ...
  • ...
  • layer至今仍作為layui的代表作,她的受眾廣泛並非偶然,而是這五年多的堅持,不斷完善和維護、不斷建設和提升社區服務,使得猿們紛紛自發傳播,乃至於成為今天的Layui最強勁的源動力。目前,layer已成為國內最多人使用的web彈層組件,GitHub自然Stars3000+,官網累計下載量達20w ...
  • OS Node.js提供了一些基本的底層操作系統的模塊 "OS" . API ...
  • 關於調試 當我們只專註於前端的時候,我們習慣性F12,這會給我們帶來安全與舒心的感覺。 但是當我們使用NodeJs來開發後臺的時候,我想噩夢來了。 但是也別泰國擔心,NodeJs的調試是很不方便!這是肯定的。 但是還好,我們有 "node inspector" 來幫助我們解決一部分的調試問題,但是對 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...