緩存(caching)是將內(nèi)容(網(wǎng)頁、圖片等)存儲在請求者附近的過程,以便這些內(nèi)容加載更快。
- 當(dāng)你加載一個網(wǎng)頁或一個應(yīng)用時,你是在向服務(wù)器請求文件,而這個服務(wù)器可能在物理上是很遠的開發(fā)人員會將內(nèi)容緩存到離你更近的服務(wù)器上,這樣網(wǎng)頁和應(yīng)用的加載速度就會更快因為網(wǎng)頁和應(yīng)用總是在變化,你可以在緩存內(nèi)容上設(shè)置一個計時器來強制其過期稱為CND的專門服務(wù)器網(wǎng)絡(luò)可以讓你在全球范圍內(nèi)輕松緩存內(nèi)容
幾乎你使用的每個網(wǎng)站都以某種或另一種格式被緩存,這是現(xiàn)代web應(yīng)用程序構(gòu)建的重要組成部分(同時,這是計算機科學(xué)學(xué)位沒教你的內(nèi)容)。
拯救大兵延遲
沒有人喜歡網(wǎng)頁速度慢。但是,如果你想想,從你在瀏覽器中輸入gmail.com到你真正看到你的電子郵件之間發(fā)生的所有事情,它發(fā)生得如此之快,幾乎總是在一秒鐘之內(nèi),這完全是一個奇跡。讓我們來看看這個過程到底發(fā)生了什么:
- 客戶端向服務(wù)器發(fā)出請求(例如,你輸入gmail.com)服務(wù)器確定發(fā)送回客戶機的內(nèi)容(查詢數(shù)據(jù)庫等)服務(wù)器將內(nèi)容(網(wǎng)頁,圖像等)發(fā)送給客戶端客戶端瀏覽器呈現(xiàn)頁面和內(nèi)容
這已經(jīng)很多了,我們甚至還沒有涉及到像TCP握手這樣的協(xié)議過程。這些步驟中的每一步都需要時間(通常是幾百毫秒),當(dāng)服務(wù)器離得很遠時,這些步驟會累加起來。仔細想想,你可以將這些“速度問題”分解為兩個核心問題:
- 邏輯:加載一個網(wǎng)頁需要一個步驟位置:服務(wù)器可能非常遠,數(shù)據(jù)傳輸需要時間
緩存可以幫助解決這些問題,它將現(xiàn)成的文件(預(yù)先制作好的網(wǎng)頁、圖片等)存儲在離應(yīng)用最終用戶更近的特殊服務(wù)器上。縮短了內(nèi)容的物理距離,加快了加載時間,而且預(yù)制文件使原來的web服務(wù)器不必再次處理請求邏輯。
源服務(wù)器是應(yīng)用程序或網(wǎng)站用來響應(yīng)請求和構(gòu)建網(wǎng)頁的核心web服務(wù)器。代理服務(wù)器是介于用戶和原始服務(wù)器之間的中間服務(wù)器,負責(zé)緩存等事務(wù)。
從邏輯上講,你可以通過自己建立一個特殊的服務(wù)器(不太常見),或者使用AWS Cloudfront或Cloudflare這樣的服務(wù)來緩存文件。我們將在下面更多地討論這些。
有一點要記?。篘ielsen Norman Group廣泛使用的標準指出,超過1秒的響應(yīng)時間就會開始打斷用戶的思維流,并產(chǎn)生負面的用戶體驗。出于這個原因,公司們投入了大量精力使他們的網(wǎng)站和應(yīng)用盡可能快,這就是緩存如何發(fā)揮作用的背景。
緩存101:RTT、TTL和各種縮略詞你可以把緩存歸入“非常可怕的、使用大量縮寫詞的網(wǎng)絡(luò)技術(shù)和協(xié)議”文件夾。讓我們來解剖一下緩存并定義一些你將會遇到的術(shù)語。
RTT(Round Trip Time):從用戶發(fā)出請求(你在瀏覽器中輸入URL或單擊鏈接)到結(jié)果返回給請求者所花費的總時間。緩存的目標是降低這個值。
TTL(Time to Live):緩存有一個大問題,它們是靜態(tài)的,這意味著如果你改變你的應(yīng)用(一個新功能,一個bug修復(fù),等等),緩存仍然會有舊版本。為了解決這個問題,文件緩存通常攜帶一個TTL(秒、分鐘、小時),你可以定義緩存內(nèi)容在需要刷新之前的持續(xù)時間。
Hits and misses:開發(fā)人員經(jīng)常使用術(shù)語“hit”來表示向服務(wù)器發(fā)出請求并緩存了內(nèi)容(success)。miss是指內(nèi)容沒有被緩存(或者需要刷新),因此你的請求需要一直到源服務(wù)器才能得到滿足。
如果緩存miss,那并不意味著你無法獲得你的網(wǎng)頁,它只是意味著代理服務(wù)器需要將你的請求轉(zhuǎn)發(fā)到源服務(wù)器,獲取結(jié)果,發(fā)送給你,然后緩存它們以備將來使用。
CDN(Content Delivery Network):建立和運行你自己的服務(wù)器只是為了實現(xiàn)一個緩存,這會非常麻煩,有外包的選擇。CDN是一個服務(wù)器網(wǎng)絡(luò)(通常是全球性的),你可以接入并緩存你的內(nèi)容。典型的例子是Cloudflare,但AWS、Google和Azure也有自己的。
Compression and minification:一旦你使用了緩存,你就可以隨意修改你的文件,讓它們更容易在網(wǎng)絡(luò)上發(fā)送。如果你曾經(jīng)解壓縮過文件,那么你對壓縮已經(jīng)很熟悉了,而且許多緩存服務(wù)器默認都啟用了壓縮協(xié)議。開發(fā)人員還將通過刪除注釋、空格、新行和任何人類可讀性所需的東西來縮小他們的代碼。這兩種方法都使文件更小,從而加快了傳輸速度,降低了關(guān)鍵指標RTT。
緩存的類型:服務(wù)器和瀏覽器
典型的緩存設(shè)置包括如何正確地將文件保存在服務(wù)器上,通過TTL處理過期,以及諸如此類的事情。但是服務(wù)器或CDN并不是緩存發(fā)生的唯一地方;在你的筆記本電腦、手機或電腦上,在你的瀏覽器里緩存著大量的數(shù)據(jù)。瀏覽器也會緩存內(nèi)容,特別是當(dāng)你經(jīng)常訪問一個網(wǎng)站的時候。
你的瀏覽器緩存的行為就像一個專門的緩存服務(wù)器,但節(jié)省更多的時間,因為你的請求根本不必離開你的瀏覽器。例如,如果你正在加載某網(wǎng)站的主頁,布局的基本部分,如模板HTML或CSS可能會被緩存。這樣,當(dāng)你重新加載頁面時,就不需要再次獲取所有這些文件。
瀏覽器緩存有助于解釋為什么重新加載頁面會比第一次加載頁面更快,以及為什么有時會出現(xiàn)一個“陳舊”的頁面,你不斷地刷新,但沒有顯示你正在尋找的新內(nèi)容。你也可以隨時清除瀏覽器緩存。