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