翻譯自原文地址:web caching
如果你曾經在超市買過牛奶, 那麼你就能理解伺服器端和瀏覽器端的快取。
如果您是一個網際網路的忠實使用者(您可能是),您就可以從一次又一次的快取中受益。 但是,你可能不知道它(快取)是何時或如何在幕後發揮其魔力的。
從開發人員的角度來看, 快取讓構建高效能 web 應用和 web 伺服器變得要容易得多。開發人員無需不斷優化被數千個請求壓得喘不過氣來的伺服器, 而是可以實現快取協議, 使工作變得更輕鬆。
由於快取可能會在載入頁面的1秒和2秒之間產生影響, 因此會讓人感覺有些...... 不足。但是, 如果您想要處理大量的使用者, 這是很有必要的。
在過去的 web 應用中使用快取後, 我意識到必須有更好的方法來解釋它, 而不僅僅是遍歷術語。我注意到它與從農場到冰箱的牛奶路徑非常吻合, 所以我想這將是一個更好的解釋方式。
為了理解本指南, 您只需瞭解 web 伺服器的基礎知識。讓我們一起學習它!
如果沒有快取, 網際網路會是什麼樣子?
在進入快取之前, 讓我們想想如果沒有快取, 網際網路會是什麼樣子。試想一下, 你生活在17世紀或19世紀的農村地區。你擁有一個農場, 沒有製冷裝置。你的農場裡有幾頭奶牛, 但它們的牛奶幾乎沒有那麼值錢, 因為它很快就會變質。
有些群體仍然無法獲得製冷裝置。他們要麼直接喝奶牛乳房中的原奶, 要麼將牛奶與穀物混合, 讓它發酵。這很有趣有趣。
無論如何, 你想把你的牛奶賣給你村裡的其他人。但是, 他們喝牛奶的時間將非常有限。假設你的一隻奶牛每天能生產一加侖牛奶。但是, 如果有太多的人出現在你的農場尋找牛奶, 你需要讓一些人先回家, 讓他們等到第二天。
另外, 你甚至不能考慮增加更多的奶牛和擴大你的操作, 因為你有如此有限的分佈。你有一些明確的限制那就是隻有你村裡的其他成員才能買到你的牛奶。
如果沒有快取, 您將受到伺服器計算能力的限制。快取用於載入靜態資產, 例如:- Images
- CSS
- Static HTML files
- JavaScript files
預設情況下, 伺服器必須為每個傳入請求提交新的響應。但是, 載入頁面的請求實際上可能意味著4個單獨的請求——來自上面的每一個類別。當您考慮到較大的影像檔案時, 您的伺服器可能會被世界各地的使用者壓得喘不過氣來。然後, 使用者在等待頁面載入時將遇到緩慢的載入時間。
理想情況下, 您希望通過儲存對常見請求的響應來緩解伺服器上的需求。您的伺服器不需要處理每個新的單個請求, 而是您的快取可以提供即時響應。您可以隨時為更多的伺服器付費, 但這可能導致無法控制的費用。
什麼是伺服器端快取?
返回到我們的農場方案。知道什麼會讓一個成功的奶牛場更容易經營嗎?
一個帶冷藏的超市!
這樣, 人們就不需要出現在你的農場, 馬上消耗牛奶。你將能夠保持它安全地儲存幾個星期的時間。
超市消除了你農場的很多壓力, 因為你的奶牛不會被期望實時生產。超市將處理這個需求。你只需要保持奶牛每天的生產力。更好的是, 周圍所有村莊的居民現在都可以從你的農場購買牛奶, 因為牛奶永遠可以在冰箱裡買到。
就像超市一樣, 伺服器端快取將處理熱門請求, 並更快、更可靠地交付內容。
在上圖中, 我使用了術語快取代理。快取代理是儲存用於響應公共請求的靜態檔案的伺服器。快取代理將攔截常見請求並快速傳遞響應。它可以防止這些請求給您的主 web 伺服器帶來壓力。
你可能有很多問題, 比如,
- 是什麼決定了 "流行" 的請求?
- 代理將快取響應多長時間?
這也就像超市裡的牛奶一樣。超市經理需要決定他們會持有你的牛奶多久, 然後再把它扔掉。快取代理通過快取命中率 (可通過快取伺服器提供的內容百分比) 來衡量其成功與否。
什麼是內容分發網路?
到目前為止, 有一家雜貨店在賣你的牛奶。雖然這是一個很大的進步, 但你仍然沒有辦法把牛奶送到這家當地商店範圍以外的人那裡。如果你想擴大你的操作, 你需要新增更多的商店。
所以, 假設你開始向更多的超市分發牛奶。現在, 您可以在更大的地理範圍內滿足客戶。這類似於內容交付網路或 cdn。cdn 是位於世界各地的一系列代理伺服器 (如我們上面所述)。
作為終端使用者, 您可能會感覺到高速網際網路允許大多數網站快速載入。然而, 這只是因為他們使用 cdn 來快速傳輸靜態檔案!
如果您位於英國, 並且您正在嘗試載入快取在弗吉尼亞伺服器中的檔案, 您將遇到一些延遲, 因為原始訊號只能沿著數千英里的傳輸。在英國的本地快取代理將允許站點載入速度更快。
因此, 您的伺服器可以將靜態檔案的副本傳送到 cdn 網路中的每個代理伺服器, 並且它們可以處理本地請求, 直到這些資源不再 "全新"。一些常見的 cdn 提供商包括 rackspace、akamai 和 amazon web services。
那麼瀏覽器快取呢?
現在, 全國各地 (或全世界) 的人們都可以從你的農場帶回冷牛奶。只有一個問題--他們沒有辦法把它存放在自己的家裡。你的顧客買牛奶後, 還需要很快喝, 然後再回到雜貨店買更多的牛奶。所以, 這個系統仍然不能很好地服務於客戶。
解決方法是什麼?一臺冰箱!
有了冰箱, 你可以把牛奶存放在當地, 避免回超市。在快取術語中, 我們討論的是一個完全獨立的位置來儲存靜態資產, 因為它位於客戶端, 或位於與瀏覽器相同的計算機上。我們的代理伺服器位於遠端位置。
這對於你可能經常訪問的臉譜或亞馬遜等網站來說是很好的。這對他們的伺服器成本也很有好處, 因為他們可以減少需要處理的請求數量。
有一件重要的事情需要注意--我們並不是說牛奶神奇地到達你的冰箱!您仍然需要發出到達伺服器或代理伺服器的初始請求。之後, 您可以在本地快取某些檔案。
您的瀏覽器如何知道何時從伺服器請求新檔案?否則, 您將永遠不會遇到這些本地檔案的更新版本。
嗯, 就像牛奶生產商在他們的牛奶包裝上放一個日期一樣, 伺服器會在 http 響應標頭中新增某種識別符號。實際上有4個單獨的 http 快取系統。上面顯示的方案與 "到期日期" 方法非常相似。其他一些方法仍然要求您的瀏覽器在傳送快取的檔案之前與伺服器進行檢查。
何時開始使用快取
假設您正在構建第一個 web 應用。在您擁有數千個使用者之前, 您可能無需擔心快取協議, 因為伺服器成本仍然很低。但是, 當你進行擴充套件時, 如果你希望你的應用快速載入, 則需要實現快取。
例如, heroku 是部署第一個 web 應用的一個很好的工具。但是, 它要求您使用單獨的服務來實現快取, 如 amazon 的 cloudfront 或 cloudflare。這需要更多的時間來學習。
在瀏覽器方面, 當您嘗試使用新的靜態資源重新載入頁面時, 您可能經歷過快取, 但頁面根本不會更改。無論您重新整理頁面多少次, 都不會有任何更改。
這通常是因為瀏覽器端的一些快取協議。要繞過瀏覽器的快取並從伺服器請求新資產, 您可以在 mac 上使用 cmd + shift + r, 也可以在 pc 上使用 ctrl + shift + r。