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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...