緩存是怎么工作的?——HTTP權威指南讀書心得(十一)


                                              緩存是怎么工作的       

     WOW,終於過了兩位數了,倍感振奮啊...不過看了看書的頁數,頓覺得路漫漫其修遠兮.......廢話不多說,開始記筆記吧:-D

     今天來說說緩存是怎么工作的。緩存這個詞感覺在平時的工作中出現的頻率那是相當的高啊,動不動這里緩存,哪里緩存,而且緩存與性能一般都是成對出現的。那么來看看緩存是如何工作的吧。

    緩存的作用

     當客戶端發送一個請求的時候,如果經過一個緩存,發現緩存中正好有它請求的數據,那么就直接從緩存中返回這個數據,而不用向服務器索取數據。緩存有很多優點,它減少了冗余數據的傳輸緩解了網絡瓶頸問題,節省了帶寬,降低了對原始服務器的需求,一部分請求不用發送到服務器,緩存直接就搞定了。緩存還能降低距離延遲,如果可以直接從在中國的緩存獲取美國服務器上的數據,無疑降低了非常多的延遲。

     如果許多客戶端同時訪問同一個服務器上的同一個資源,傳統的方式服務器會向每個客戶端你都發送該數據,這個時候網絡上就發送着一大堆一樣的數據,這十分浪費帶寬!如果使用緩存,就可以保留第一條服務器響應的副本,后面的響應可以直接用這個副本解決了,提高了效率。

     緩存還可解決帶寬瓶頸。路徑上最慢的網速是訪問服務器的瓶頸。本地網絡一般速度上都比較好,如果在在網速比較好的本地網絡上有一個緩存,那么就可以直接使用非常快速的本地帶寬進行傳輸。例如我想從美國的一個網頁上下載一個圖片,正常的下載整個鏈路要從中國到美國,中間肯定有比較低速的網絡,而如果在我們附近有一個緩存,那么我們就可以高速的從這個緩存上下載所需要的圖片了。

     緩存還可以作為緩沖器解決瞬間擁塞問題。舉個例子,有個一網站公布了一個勁爆的新聞,導致很多都想去訪問這個網站,那么這個網站可能會在短時間內訪問量暴增,超出它的承受范圍。如果使用了緩存的話,當很多人想要去訪問一個資源的時候,那么就可以在第一次訪問之后直接從緩存上獲取資源,從而分擔了服務器的負載。

     剛才提高的美國和中國緩存的問題。美國和中國是那么遠,至於即使是光速也有些不能抹平,更加上網絡上各種代理路由器,速度就更令人着急了,如果這個時候,有一個離客戶端比較近的緩存,直接從緩存上獲取資源,那么無疑會提高網絡訪問的速度。

   緩存命中問題

     當然緩存不肯能是萬能的,它不可能包含世界上所有的資源,所以有些資源緩存里肯定是沒有的。客戶端可以直接從緩存中獲取資源的情況被稱為緩存命中。

     這里說一下再驗證的問題。什么是再驗證?當一個請求到達緩存的時候,緩存有這個資源的副本,但是他不知道這個副本過沒過期,自己又不能進行決定,所以就向服務器發送驗證請求,檢測這個資源的內容是不是最新的。緩存可以在任意時刻,以任意頻率對副本進行驗證,但是為了節省帶寬,基本上客戶端發起請求的時候才會進行驗證。在進行在驗證的時候,緩存會向服務器發送一個再驗證請求,如果內容沒有變化,服務器則會返回一個304 NOT MODIFIED的響應,這就說明這個副本是暫時新鮮的,就可以返回給客戶端了。這就就叫做再驗證命中或者緩慢命中。如果副本過期,那么服務器就直接返回一個響應報文,報頭為 200 ok,這個響應報文會發回給客戶端。

    速度上,再驗證命中比未命中快一些,畢竟未命中還需要傳輸這個資源。如果服務器上已經刪除了這個對象,那么服務器會返回一個404 NOT FOUND響應,緩存接收到這個響應,也會刪這個資源的副本,同時將響應回送。

    既然有命中和未命中的問題,那么就一定存在命中率的問題咯。緩存的命中率分為字節命中率和文檔命中率。字節命中率表示緩存中所提供的字節在所有傳輸字節的中的比率,文檔命中率是緩存提供的文件的個數在所有傳輸的文件中所占的比例。出現這兩種度量標准是由於有的文件訪問量不大,但是個頭很大,從帶寬上算來,其實這種文件是占據很大比例的,所以這里使用文件命中率就不太科學了。

    客戶端如何判斷一個資源是否從緩存中來的呢?基本上有兩種方法,一種是有的緩存在返回資源時候,會在回送響應中添加VIA首部,表示這是從緩存中返回的。第二種方法使查看返回響應報文的DATE首部,如果這個首部比起現在的時間早很多,那么很有可能這個資源就是由緩存中返回的。(DATE首部記錄的是該響應於服務器產生的時間。)

   緩存的拓補結構

    緩存可以分為公有緩存和私有緩存。大部分的緩存都是公有緩存,由於緩存的工作機制,公有緩存能更有效地提高網絡性能。私有緩存往往會存在於我們經常使用的瀏覽器中,這個用的比較少。

    公有緩存是特殊的共享代理服務器,被稱為緩存代理服務器。它匯聚用戶的請求,在具有副本的時候應答客戶端的請求。只要一個用戶請求過一次,緩存中存在這個資源的副本,那么之后發送到這個緩存上的這個資源的請求,在這個副本沒有過期的時候,就可以直接返回這個副本了。所以公有的緩存可以有效地降低網絡流量。

   代理緩存的層次結構

    網絡中經常出現種種層次結構,同樣緩存也存在層次結構。例如一個二級緩存,靠近客戶端的地方使用小型廉價緩存,更高層次,則逐漸使用更強大的緩存來裝載更多的資源。目標是希望大部分用戶都能在附近的第一級緩存中命中,如果沒有命中,向上尋找較大父級緩存的幫助,如果仍未命中則向原始服務器發出請求。當然如果緩存結構比較深的話,每一個緩存都會有一些性能損耗,多個緩存疊加在一起性能損耗就比較明顯了。

    除了層次緩存結構之外,也存在網狀緩存。這些緩存之間的結構比較復雜,當請求到來的時候,緩存會做出動態的判斷,決定於其他哪個緩存進行通信。網狀緩存需要完成這些功能

  • 根據URL在父緩存或者原始服務器中進行動態選擇
  • 根據URL動態的選擇一個特定的父服務器
  • 前往父緩存之前,在本地緩存中搜索已緩存的副本
  • 允許其他緩存對其緩存的部分內容進行訪問,但不允許因特網流量通過他們的緩存

    緩存之間這些更加復雜的關系允許不同的組織互為對等實體,將它們的緩存連接起來以實現共贏。

   緩存的處理步驟

    對一條HTTP GET報文的基本緩存處理過程包括七個步驟:

  1. 接收:從網絡中接收請求報文
  2. 解析:緩存對報文進行解析,提取出URL和各種首部
  3. 查詢:緩存查看是否有本地副本可以用,如果沒有就獲取一份副本,並將它保存在本地。
  4. 新鮮度檢測:緩存查看已緩存副本是否足夠新鮮,如果不是,就向服務器詢問是否有任何更新
  5. 創建響應:緩存會用新的首部和已緩存的主體來構建一條響應報文。
  6. 發送:緩存通過網絡將響應發送給客戶端
  7. 日志:緩存可選的創建一個日志文件條目來描述這個事務。

    tips:

  • 已緩存對象包含了服務器的響應主體和原始服務器的響應首部,在緩存命中的時候正確返回響應報文,其中有一些元數據如記錄響應報文真實產生時間等。
  • 緩存服務器中的資源有保質期,在這個時間范圍內都認為該資源時新鮮的,不用進行判斷。如果過了保質期,那么就需要向服務器進行再驗證。
  • 緩存會將原來緩存的服務器的響應作為基礎,對其進行改造並生成返回給客戶端的響應。例如可能會向響應中插入新鮮度信息,或者VIA等代理信息等。

    緩存處理GET請求的流程圖:

    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM