他們分別重新鮮度和校驗值兩個維度來規定瀏覽器是否能夠直接使用緩存中的副本,仍是須要去源服務器獲取更新的版本。css
新鮮度(過時機制):也就是緩存副本有效期。一個緩存副本必須知足如下條件,瀏覽器會認爲它是有效的,足夠新的:
含有完整的過時時間控制頭信息(HTTP協議報頭),而且仍在有效期內;
瀏覽器已經使用過這個緩存副本,而且在一個會話中已經檢查過新鮮度
知足以上兩個狀況的一種,瀏覽器會直接從緩存中獲取副本並渲染。
知足以上兩個狀況的一種,瀏覽器會直接從緩存中獲取副本並渲染。
校驗值(驗證機制):服務器返回資源的時候有時在控制頭信息帶上這個資源的實體標籤Etag(Entity Tag),它能夠用來做爲瀏覽器再次請求過程的校驗標識。如過發現校驗標識不匹配,說明資源已經被修改或過時,瀏覽器需求從新獲取資源內容。
html
頁面緩存是將動態頁面直接生成靜態的頁面放在服務器端,用戶調取相同頁面時,靜態頁面將直接下載到客戶端,再也不須要經過程序的運行和數據庫的訪問,大大節約了服務器的負載。
每次訪問頁面時,會檢測相應的緩存頁面是否存在,若不存在,則鏈接數據庫獲得數據渲染頁面並生成緩存頁面文件,這樣下次訪問的頁面文件就發揮做用了。前端
數據庫的緩存通常由數據庫提供,能夠對錶創建高速緩存。數據庫中,用戶可能屢次執行相同的查詢語句,爲了提升查詢效率,數據庫會在內存劃分一個專門的區域,用來存放用戶最近執行的查詢,這塊區域就是緩存。
數據庫緩存的使用必須在必定的應用環境下:查詢的數據庫表不會常常變更、有大量相同的查詢(如訂單信息查詢)。web
兩種方式各有利弊,直寫緩存方法利用了高速緩存中的數據始終與主存儲器中數據匹配的特色。可是,須要的總線週期卻很是耗時,從而下降性能。回寫緩存能夠維持性能,由於寫入始終是在「爆發」中進行的,於是運行所需的總線週期將大大減小。
兩個CPU,或者CPU與DMA同時共享一塊物理內存時,writer在寫完後,要write back,這樣另外一個reader才能看到它寫入的數據;在writer變爲reader的時候,須要invalidate,不然看不到另外一個 writer寫入的數據。因此在共享的時候,須要同時作writeback和invalidate。算法
網頁傳輸過程當中,圖片會佔用大量的數據量,是影響網站性能的主要因素,所以大部分網站會將圖片存儲從網站中分離出來,假設一個或多個圖片服務器來存儲圖片,將圖片放到一個虛擬目錄中,而網頁上仍然用同一個URL地址指向服務器上的某一個圖片的地址。這樣能夠大大提升網站的性能。數據庫
參考:Web先後端緩存技術
https://blog.csdn.net/yzj5208/article/details/82080868後端
緩存本來是一個硬件的概念:緩存就是數據交換的緩衝區(稱做Cache),當某一硬件要讀取數據時,會首先從緩存中查找須要的數據,若是找到了則直接執行,找不到的話則從內存中找。因爲緩存的運行速度比內存快得多,故緩存的做用就是幫助硬件更快地運行。瀏覽器
在一個Web應用中,應用到緩存的地方有不少,主要有瀏覽器緩存,頁面緩存,服務器緩存,數據庫緩存等。緩存
緩存的做用主要有:服務器
瀏覽器端緩存規則主要在HTTP協議頭和HTML的meta標籤中定義。他們分別重新鮮度和校驗值兩個維度來規定瀏覽器是否能夠直接使用緩存中的副本,仍是須要去源服務器獲取更新的版本。
新鮮度(過時機制):也就是緩存副本有效期。一個緩存副本必須知足如下條件,瀏覽器會認爲它是有效的,足夠新的:
知足以上兩個狀況的一種,瀏覽器會直接從緩存中獲取副本並渲染。
校驗值(驗證機制):服務器返回資源的時候有時在控制頭信息帶上這個資源的實體標籤Etag(Entity Tag),它能夠用來做爲瀏覽器再次請求過程的校驗標識。如過發現校驗標識不匹配,說明資源已經被修改或過時,瀏覽器需求從新獲取資源內容。
使用HTML Meta 標籤,Web開發者能夠在HTML頁面的<head>
節點中加入<meta>
標籤,代碼以下:
<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
上述代碼的做用是告訴瀏覽器當前頁面不被緩存,每次訪問都須要去服務器拉取。使用上很簡單,但只有部分瀏覽器能夠支持,並且全部緩存代理服務器都不支持,由於代理不解析HTML內容自己。而普遍應用的仍是 HTTP頭信息 來控制緩存。
在HTTP請求和響應的消息報頭中,常見的與緩存有關的消息報頭有:
HTTP緩存機制
緩存行爲主要由緩存策略決定,而緩存策略由內容擁有者設置。這些策略主要經過特定的HTTP頭部來清晰地表達。
當一個用戶發起一個靜態資源請求的時候,瀏覽器會經過如下幾步來獲取資源:
用戶操做行爲與緩存的關係
瀏覽器中的操做對緩存的影響:
本地緩存階段
Expires
指定緩存到期GMT的絕對時間,若是設了max-age,max-age就會覆蓋expires。若是expires到期須要從新請求。
Cache-Control
Cache-Control是http 1.1中爲了彌補 Expires 缺陷新加入的。對已緩存的內容進行控制:
其餘相關控制字段
用法舉例: Cache-Control: max-age=3600, must-revalidate
協商緩存階段
Last-Modified & if-modified-since
Last-Modified與If-Modified-Since是一對報文頭,屬於http 1.0。
last-modified是WEB服務器認爲對象的最後修改時間,好比文件的最後修改時間,動態頁面的最後產生時間。
ETag & If-None-Match
ETag與If-None-Match是一對報文,屬於http 1.1。
ETag能夠用來解決這種問題。ETag是一個文件的惟一標誌符。就像一個哈希或者指紋,每一個文件都有一個單獨的標誌,只要這個文件發生了改變,這個標誌就會發生變化。
ETag機制相似於樂觀鎖機制,若是請求報文的ETag與服務器的不一致,則表示該資源已經被修改過,須要發最新的內容給瀏覽器。
同時使用這兩個報文頭,在徹底匹配If-Modified-Since和If-None-Match即檢查完修改時間和Etag以後,如都與服務器的相符,服務器返回304,不然,發送最新內容給瀏覽器。
Etag/lastModified過程以下:
304:經過If-Modified-Since If-Match判斷資源是否修改,如未修改則返回304,發生了一次請求,但請求內容長度爲0,節省了帶寬。 若是有多臺負載均衡的服務器,不一樣服務器計算出的Etag可能不一樣,這樣就會形成資源的重複加載。
Etag 主要爲了解決 Last-Modified 沒法解決的一些問題:
一、一些文件也許會週期性的更改,可是他的內容並不改變(僅僅改變的修改時間),這個時候咱們並不但願客戶端認爲這個文件被修改了,而從新GET;
二、某些文件修改很是頻繁,好比在秒如下的時間內進行修改,(比方說1s內修改了N次),If-Modified-Since能檢查到的粒度是s級的,這種修改沒法判斷(或者說UNIX記錄MTIME只能精確到秒);
三、某些服務器不能精確的獲得文件的最後修改時間。
其餘標籤
Content-Length:儘管並無在緩存中明確涉及,Content-Length頭部在設置緩存策略時很重要。某些軟件若是不提早獲知內容的大小以留出足夠空間,則會拒絕緩存該內容。
Vary:緩存系統一般使用請求的主機和路徑做爲存儲該資源的鍵。當判斷一個請求是不是請求一樣內容時,Vary頭部能夠被用來提醒緩存系統須要注意另外一個附加頭部。它一般被用來告訴緩存系統一樣注意Accept-Encoding頭部,以便緩存系統可以區分壓縮和未壓縮的內容。
總結
瀏覽器第一次請求時:
瀏覽器再次請求時:
Question: 設置了一個月才過時的緩存,若是服務器端更新了css代碼,要怎麼讓用戶更新緩存呢?
頁面緩存是將動態頁面直接生成靜態的頁面放在服務器端,用戶調取相同頁面時,靜態頁面將直接下載到客戶端,再也不須要經過程序的運行和數據庫的訪問,大大節約了服務器的負載。每次訪問頁面時,會檢測相應的緩存頁面是否存在,若不存在,則鏈接數據庫獲得數據渲染頁面並生成緩存頁面文件,這樣下次訪問的頁面文件就發揮做用了。
MemCache的緩存策略:(visio不能用了,本身畫的,略醜慎看)
數據庫的緩存通常由數據庫提供,能夠對錶創建高速緩存。數據庫中,用戶可能屢次執行相同的查詢語句,爲了提升查詢效率,數據庫會在內存劃分一個專門的區域,用來存放用戶最近執行的查詢,這塊區域就是緩存。
數據庫緩存的使用必須在必定的應用環境下:查詢的數據庫表不會常常變更、有大量相同的查詢(如訂單信息查詢)。
PS:這個緩存策略也能夠用在前端,好比訂單信息不變的狀況下,能夠在前端設置一個對象,保存請求的地址、參數、結果,第一次請求時會保存請求的地址、參數和結果,再次請求時,若是請求的地址、參數同樣,則查詢該對象直接返回請求的結果。
緩存的同步指的是寫命中緩存的時候,若是保持緩存與磁盤上數據一致性的問題。通常有兩種方案:
直寫式WT(Write Through)
:當CPU要將數據寫入內存時,除了更新緩衝內存上的數據外,也將數據寫在磁盤中以維持主存與緩衝內存的一致性,當要寫入內存的數據多起來的話,速度天然就慢了下來。回寫式WB(Write Back)
:當CPU要將數據寫入內存時,只會先更新緩衝內存上的數據,隨後再讓緩衝內存在總線不塞車的時候才把數據寫回磁盤,因此速度會快得多。兩種方式各有利弊,直寫緩存方法利用了高速緩存中的數據始終與主存儲器中數據匹配的特色。可是,須要的總線週期卻很是耗時,從而下降性能。回寫緩存能夠維持性能,由於寫入始終是在「爆發」中進行的,於是運行所需的總線週期將大大減小。
兩個CPU,或者CPU與DMA同時共享一塊物理內存時,writer在寫完後,要write back,這樣另外一個reader才能看到它寫入的數據;在writer變爲reader的時候,須要invalidate,不然看不到另外一個 writer寫入的數據。因此在共享的時候,須要同時作writeback和invalidate。
圖片的預加載
爲了防止圖片在須要的時候才加載,而付出的時間開銷,能夠將圖片進行預加載。代碼以下:
<html> <script> var img = new Image(); image.src = "b.jpg"; </script> <body> <img src="a.jpg" alt="pic" onmouseover="this.src='b.jpg'"> </body> </html>
網頁傳輸過程當中,圖片會佔用大量的數據量,是影響網站性能的主要因素,所以大部分網站會將圖片存儲從網站中分離出來,假設一個或多個圖片服務器來存儲圖片,將圖片放到一個虛擬目錄中,而網頁上仍然用同一個URL地址指向服務器上的某一個圖片的地址。這樣能夠大大提升網站的性能。
轉自:https://blog.csdn.net/LeeSirbupt/article/details/54409931