利用超市買牛奶來解釋web緩存

翻譯自原文地址:web cachingweb

若是你曾經在超市買過牛奶, 那麼你就能理解服務器端和瀏覽器端的緩存。瀏覽器

若是您是一個互聯網的忠實用戶(您多是),您就能夠從一次又一次的緩存中受益。 可是,你可能不知道它(緩存)是什麼時候或如何在幕後發揮其魔力的。緩存

從開發人員的角度來看, 緩存讓構建高性能 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。

參考web caching

相關文章
相關標籤/搜索