Web緩存雜談

来源:http://www.cnblogs.com/giggle/archive/2016/06/07/5565370.html
-Advertisement-
Play Games

對於網站提高性能,緩存是必不可少的環節。該篇隨筆介紹了緩存以及緩存機制,重點是HTTP緩存機制. ...


一、概述

緩存通俗點,就是將已經得到的‘東東’存放在一個相對於自己而言,儘可能近的地方,以便下次需要時,不會再二筆地跑到起始點(很遠的地方)去獲取,而是就近解決,從而縮短時間和節約金錢(坐車要錢嘛)。Web緩存,也是同樣的道理,說白了,就是當你第一次訪問網址時,將這個東東(representations),如html頁面、圖片、JavaScript文件等,存在一個離你較近的地方,當你下次還需要它時,不用再一次跋山涉水到伺服器(origin servers)去獲取。繼而,web緩存的優勢也就很明顯了:

  1、  減少了網路延遲,加快了頁面響應速度,增強了用戶體驗嘛。(因為我是就近獲取的,路程縮短了,所以響應速度當然比到遙遠的伺服器去獲取快哦);

  2、  減少了網路帶寬消耗嘛。(就近獲取);

  3、  通過緩存,我們都不用到伺服器 (origin servers)去請求了,從而也就相應地減輕了伺服器的壓力。

那web緩存將這些東東放在哪兒呢?下麵我就看看有哪些緩存種類,從而瞭解放在哪吧。

二、Web緩存的種類

--資料庫緩存--:

當web應用關係複雜,數據表蹭蹭蹭往上漲時,可以將查詢後的數據放到記憶體中進行緩存,下次再查詢時,就直接從記憶體緩存中獲取,從而提高響應速度。

--CDN緩存--:

CDN通俗點,就是當我們發送一個web請求時,會先經過它一道手,然後它幫我們計算路徑,去哪得到這些東東(representations)的路徑短且快。這個是網站管理員部署的,所以他們也可以將大家經常訪問的representations放在CDN里,這樣,就響應就更快了。

--代理伺服器緩存--:

代理伺服器緩存,其實跟下麵即將講的瀏覽器緩存性質差不多,差別就是代理伺服器緩存面向的群體更廣,規模更大而已。即,它不只為一個用戶服務,一般為大量用戶提供服務,同一個副本會被重用多次,因此在減少相應時間和帶寬使用方面很有效。

--瀏覽器緩存--:

簡而言之,就是,每個瀏覽器都實現了 HTTP 緩存,我們通過瀏覽器使用HTTP協議與伺服器交互的時候,瀏覽器就會根據一套與伺服器約定的規則進行緩存工作。當我們點擊瀏覽器上‘後退’或者‘前進’按鈕時,顯得特別有用。

三、Web緩存的執行機制

所謂機制就是一些雙方的約定,清晰地告訴對方,什麼時候該做什麼事。web緩存也一樣,你總得告訴我(請求)什麼時候到緩存中去獲取,什麼到伺服器去獲取representations吧。So,也得有一套相應的機制,web 緩存機制分為兩大部分http協議(HTTP1.0和HTTP1.1)和網站管理人員制定的協議。拋開網站內部制定的協議,我們來看看http協議中定義的緩存機制。

By the way,我們可以在HTML文檔中的<head>中通過<meta>來緩存,如下:

<meta http-equiv="Pragma" content="no-cache"/>

但,它只有部分瀏覽器可以用,並且代理伺服器也不會鳥它。(因為meta在html中,代理伺服器幾乎不回去讀它滴)。

--http緩存機制--

1、  Expires

http緩存機制主要在http響應頭中設定,響應頭中相關欄位為Expires、Cache-Control、Last-Modified、If-Modified-Since、Etag。

HTTP 1.0協議中的。簡而言之,就是告訴瀏覽器在約定的這個時間前,可以直接從緩存中獲取資源(representations),而無需跑到伺服器去獲取。

另:Expires因為是對時間設定的,且時間是Greenwich Mean Time (GMT),而不是本地時間,所以對時間要求較高。

2、  Cache-Control

HTTP1.1協議中的,因為有了它,所以可以忽略上面提到的Expires。因為Cache-Control相對於Expires更加具體,細緻。

且,就算同時設置了Cache-Control和Expires,Cache-Control的優先順序也高於Expires。

下麵就來看看,Cache-Control響應頭中常用欄位的具體含義:

  (1)、max-age:用來設置資源(representations)可以被緩存多長時間,單位為秒;

  (2)、s-maxage:和max-age是一樣的,不過它只針對代理伺服器緩存而言;

  (3)、public:指示響應可被任何緩存區緩存;

  (4)、private:只能針對個人用戶,而不能被代理伺服器緩存;

  (5)、no-cache:強制客戶端直接向伺服器發送請求,也就是說每次請求都必須向伺服器發送。伺服器接收到請求,然後判斷資源是否變更,是則返回新內容,否則返回304,未變更。這個很容易讓人產生誤解,使人誤以為是響應不被緩存。實際上Cache-Control: no-cache是會被緩存的,只不過每次在向客戶端(瀏覽器)提供響應數據時,緩存都要向伺服器評估緩存響應的有效性。

  (6)、no-store:禁止一切緩存(這個才是響應不被緩存的意思)。

3、  Etag & If-None-Match

Etag是屬於HTTP 1.1屬性,它是由伺服器生成返回給後端,當你第一次發起HTTP請求時,伺服器會返回一個Etag,併在你再一次發起同一個請求時,客服端會同時發送一個If-None-Match,而它的內容就是Etag的值。最後,伺服器會比對這個客服端發送過來的Etag是否與伺服器的相同,如果相同,就If-None-Match的值為false,返回304繼續使用本地緩存,否則就200。說白了,Etag就是伺服器生成的一個標記而已。且Etag的優先順序高於Last-Modified。

4、  Last-Modified & If-Modified-Since

Last-Modified與Etag類似。不過Last-Modified表示響應資源在伺服器最後修改時間而已。與Etag相比,不足為:

  (1)、Last-Modified標註的最後修改只能精確到秒級,如果某些文件在1秒鐘以內,被修改多次的話,它將不能準確標註文件的修改時間;

  (2)、如果某些文件會被定期生成,當有時內容並沒有任何變化,但Last-Modified卻改變了,導致文件沒法使用緩存;

  (3)、有可能存在伺服器沒有準確獲取文件修改時間,或者與代理伺服器時間不一致等情形。

然而,Etag是伺服器自動生成或者由開發者生成的對應資源在伺服器端的唯一標識符,能夠更加準確的控制緩存。

四、擴展閱讀

[1]、"Caching Tutorial" 


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

-Advertisement-
Play Games
更多相關文章
  • 繼續瞭解controller基類。 ...
  • Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the following properties: Integers in each row are sorted i ...
  • 面向對象的概念經常會有一些特別的搭配,如:面向對象的分析、面向對象的設計、以及我們下麵講到的面向對象的編程實現。 在我們編程的時候,經常會需要描述一些有特性的東西,這些特性是外在的或者可以表現的。 而我們在編程的時候,需要根據這種東西的特性對其操作,也就是“抽象成一個類”的過程。 C++對於類內的成 ...
  • RandomAccessFile RandomAccessFile是用來訪問那些保存數據記錄的文件的,你就可以用seek( )方法來訪問記錄,併進行讀寫了。這些記錄的大小不必相同;但是其大小和位置必須是可知的。但是該類僅限於操作文件。 RandomAccessFile不屬於InputStream和O ...
  • 在處理大文件時,如果利用普通的FileInputStream 或者FileOutputStream 抑或RandomAccessFile 來進行頻繁的讀寫操作,都將導致進程因頻繁讀寫外存而降低速度.如下為一個對比實驗。 [java] view plain copy package test; imp ...
  • 新建項目: Next next next 新建項目後,MyEclipse會自動從遠程倉庫中下載支持包,需要幾分鐘左右時間。 項目結構圖: HelloWorld.java public class HelloWorld { public String say(){ return "Hello Worl ...
  • Java消息服務指的是兩個應用程式之間進行非同步通信的API,它為標準消息協議和消息服務提供了一組通用介面,包括創建、發送、讀取消息等,用於支持JAVA應用程式開發。在J2EE中,當兩個應用程式使用JMS進行通信時,它們之間並不是直接相連的,而是通過一個共同的消息收發服務連接起來,可以達到解耦的效果, ...
  • var id=‘123’; $.ajax({ url:’http://www.xxx.com/ajax', type:'post', dataType: "json", data:{wurl:w_url,murl:m_url}, async : turn, error:function(){ }, ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...