CDN快取小結

2021-08-10 01:19:21 字數 3130 閱讀 4426

首先,cdn可以理解為乙個普通快取,如**快取或者說邊緣快取,即便不關心使用者的具體地理位置,也應該考慮使用cdn的**快取來提高使用者體驗。

簡單而言,**快取會快取你**的一些頁面,通過快取來傳輸靜態內容非常的快。

乙個簡單的例子:

假設你有乙個帶有開始頁面的部落格,這裡面列出了所有近期的部落格列表。完成這一過程,php 指令碼要從資料庫中獲取到最近的文章實體,並且將它們轉換成 html 結果頁並返回給使用者。

因此,對於一次請求或者訪問包含了:一次php執行+一組資料庫的查詢,對於1000次請求揮著訪問就包含了:1000次php執行+1000組資料庫的查詢,每一次php執行都要進行cpu,記憶體和

i/o操作,對於資料庫也是一樣的。

當cpu 和記憶體訪問到達極限的時候,訪問就會出現問題,速度會開始變得非常的慢,甚至出現不能訪問的情況,即便可以利用硬體來突破這一瓶頸,但是其工程會變得非常複雜,所以這時就會需要在中間加一層**快取,來減少資源對你的限制。

拿前面的例子來講,使用**快取只有第一次請求需要執行 php 指令碼、查詢資料庫和生成 html 結果頁。所有後面過來的請求都會從這個快取中取內容,讀取快取幾乎和直接讀取記憶體一樣快。這意味著,上面的線性規模瓶頸的問題解決了!100 個使用者或者1000 個使用者都沒關係,依然只有 1 次 php 執行、1 次資料庫查詢和 1 次的結果頁生成。

實際上cdn的型別也有所不同,起分為『pull cdn』和『push cdn』兩種,顧名思義,『push cdn』表示你要給cdn提供相應的內容,但是『pull cdn』則表示如何從cdn中取內容。

* pull cdn如何起作用的呢?*

我們來做個例子,假設你有乙個可訪問的**,url 是 在這樣的場景下,網域名稱fooer.com 會被放到 pull cdn 伺服器中,而不是你的**伺服器中。cdn 作為你**伺服器的乙個**。

還有乙個不被公開的網域名稱指向實際的**伺服器。在這個例子中假設它是 direct.fooer.com,實際**伺服器叫做

這個 cdn 將會接受所有的請求。如果它的快取中有結果的話將會直接返回給使用者,否則會將這個請求託管給你實際的**伺服器,然後把返回的結果快取起來為以後的請求做儲備,同時將結果返回給使用者。

最簡單的pull cdn的執行過程如下:

絕大多數的 pull cdn 採用以「每頁」快取形式解決動態內容的問題。為了達到這樣的效果,乙個簡單的方法是 htpp 響應快取頭。

關於http快取頭,新版最常見的就是 etag 和 cache-control 這兩個標籤,但是舊版還支援expires,pragma 和 age等多個便簽,不過這些都是作為向後相容來使用的。

etag:

etag:它是文件版本的識別符號。通常是內容的 md5 值,不過它也可以包含其他內容,代表的是文件的版本/日期,如: 1.0 或者 2017-10-30。這裡注意一點是,它必須用雙引號括起來,如:etag: 「d3b0756geyg42sd3edec49eaa6238ad5ff00」。

二次驗證:etag 的實際應用:二次驗證。我們暫時不考慮前面**+源的架構模式,只考慮簡單的客戶端-伺服器模式。

假設客戶端請求了 接著服務端返回如下的內容:

在響應裡面,有兩個有意思的頭標識:乙個是 etag,內容的 md5值,乙個是 last-modified,這是 hello.txt 檔案最後一次被修改的時間。

這裡就是二次驗證起作用的地方:當客戶端在很短的時間內再次訪問上面的 url,客戶端瀏覽器會使用 if-* 請求頭。如 if-none-match 檢查 etag 的內容是否有改變。也就是說,如果 etag 發生變化,客戶端接收到的乙個完整的新響應;如果 etag 沒變化,客戶端接收到的是乙個表明內容沒變化的標識。

如果 etag 沒有改變,那麼服務端將會返回:

正如上面所展示的,這次伺服器的響應裡面不是 200 ok,而是304 not modified,這就是說它略過包體部分,讓客戶端直接去自己的快取裡拿資料。在這個例子中,包體內容是 the body,比較小,效果不明顯。可是想象一下如果是很大的內容呢,或者是很複雜的動態生成內容呢,價值就很大了。

我們都知道,你最想快取起來的是內容,生成內容的代價是最大的,所以 etag 頭是更好的選擇。

cache-control頭

cache-control 既可以用於請求頭,也可以用於響應頭,其次它控制著兩個快取:本地快取(私有快取)和共享快取。

cache-control 有幾種屬性:

示例如下:

cache

-control: public

max-age

=3600

//本地快取和 cdn 快取均快取 1 小時;

cache

-control: private immutable

//不能快取在 cdn,只能快取在本地。並且一旦被快取了,則不能被更新;

cache

-control: no-cache

//不能快取。如果一定要快取的話,確保對其進行了二次驗證;

cache

-control: public

max-age

=3600 s-maxage

=7200

//本地快取 1 小時,cdn 上快取 2 小時;

cache

-control: public

max-age

=3600 proxy-revalidate

//本地和 cdn 均快取 1 小時。但是如果 cdn 收到請求,則儘管已經快取了 1 小時,還是要檢查源中文件是否已經被改變。

CDN快取小結

1.為什麼使用cdn?首先,cdn可以理解為乙個普通快取,如 快取或者說邊緣快取,即便不關心使用者的具體地理位置,也應該考慮使用cdn的 快取來提高使用者體驗。簡單而言,快取會快取你 的一些頁面,通過快取來傳輸靜態內容非常的快。乙個簡單的例子 假設你有乙個帶有開始頁面的部落格,這裡面列出了所有近期的...

快取之CDN快取

對於一些使用者訪問量巨大的 而言,如果所有使用者都去伺服器請求資料,伺服器會很快崩潰,並且在不同網路以及不同地區的使用者,請求伺服器的速度也不一樣。為了提高這部分使用者的訪問速度,cdn 中又提出了新的網路架構,即建立一些最接近使用者網路的邊緣伺服器,然後將檔案快取在這些邊緣伺服器 節點 上,這就是...

cdn 快取現象

如圖所示,我在阿里雲物件儲存oss系統中相應的路徑上傳了截圖中的檔案內容,過了一會兒發現這個monaco editor原始碼檔案,不能直接使用,能直接使用的是另外乙個打包過的檔案,內容為 在阿里雲物件儲存系統中刪除舊的檔案內容以後,上傳新的檔案內容,在瀏覽器中通過 網域名稱訪問這個路徑的檔案,發現檔...