緩存,在互聯(lián)網(wǎng)產(chǎn)品中可以簡(jiǎn)單理解為:第一次請(qǐng)求數(shù)據(jù)放到存儲(chǔ)器中,下次顯示該頁(yè)面先把上次保存的數(shù)據(jù)顯示出來(lái),同時(shí)去請(qǐng)求數(shù)據(jù),請(qǐng)求完成刷新顯示新數(shù)據(jù),并將其再緩存起來(lái)。
當(dāng)今互聯(lián)網(wǎng)應(yīng)用(網(wǎng)站或App)的整體實(shí)現(xiàn)流程是:用戶(hù)的請(qǐng)求從界面(瀏覽器或App界面)到網(wǎng)絡(luò)傳送、應(yīng)用服務(wù)再到存儲(chǔ)(數(shù)據(jù)庫(kù)或文件系統(tǒng)),然后返回到界面呈現(xiàn)內(nèi)容。
隨著內(nèi)容信息越來(lái)越復(fù)雜,用戶(hù)數(shù)和訪問(wèn)量越來(lái)越大,我們的應(yīng)用需要支撐更多的并發(fā)量,同時(shí)應(yīng)用服務(wù)器和數(shù)據(jù)庫(kù)服務(wù)器所做的計(jì)算也越來(lái)越多。但是往往我們的應(yīng)用服務(wù)器資源是有限的,數(shù)據(jù)庫(kù)每秒能接受的請(qǐng)求次數(shù)也是有限的(文件的讀寫(xiě)也是有限的),如何能夠有效利用有限的資源來(lái)提供盡可能大的吞吐量?一個(gè)有效的辦法就是引入緩存,每個(gè)環(huán)節(jié)中請(qǐng)求可以從緩存中直接獲取目標(biāo)數(shù)據(jù)并返回,從而減少計(jì)算量,有效提升響應(yīng)速度,讓有限的資源服務(wù)更多的用戶(hù)。
計(jì)算機(jī)的緩存往往使用的是RAM(斷電就掉的非永久儲(chǔ)存),所以在用完后還是會(huì)把文件送到硬盤(pán)等存儲(chǔ)器里永久存儲(chǔ)。計(jì)算機(jī)里最大的緩存是內(nèi)存條,最快的是CPU上鑲嵌的L1和L2緩存,顯卡的顯存是給顯卡運(yùn)算芯片用的緩存,硬盤(pán)上也有16M或者32M的緩存。
其工作原理是當(dāng)CPU要讀取數(shù)據(jù)時(shí),首先從CPU緩存中查找,找到就立即讀取并送給CPU處理;如果沒(méi)有找到,就從速率相對(duì)較慢的內(nèi)存中讀取并送給CPU處理,同時(shí)把這個(gè)數(shù)據(jù)所在的數(shù)據(jù)區(qū)塊調(diào)入緩存中,可以使以后對(duì)整塊數(shù)據(jù)的讀取都從緩存中進(jìn)行,不必再調(diào)用內(nèi)存。這樣的讀取機(jī)制CPU讀取緩存的命中率非常高,也就是說(shuō)CPU下一次要讀取的數(shù)據(jù)90%都在CPU緩存中,只有大約10%需要從內(nèi)存讀取。這大大節(jié)省了CPU直接讀取內(nèi)存的時(shí)間,也使CPU讀取數(shù)據(jù)時(shí)基本無(wú)需等待。
下面我們進(jìn)入正題。
瀏覽器會(huì)緩存它瀏覽過(guò)的「資源」(包括網(wǎng)頁(yè),圖片等),如果資源在保質(zhì)期內(nèi),那下次同樣的請(qǐng)求直接用緩存。過(guò)期之后,會(huì)帶上資源上次的修改時(shí)間,由服務(wù)器來(lái)判斷是否失效,失效的話就會(huì)給瀏覽器返回新的數(shù)據(jù)并繼續(xù)緩存下來(lái)。
瀏覽器的緩存,存在用戶(hù)電腦的硬盤(pán)上,用戶(hù)每次使用瀏覽器讀取緩存時(shí)先將硬盤(pán)上的緩存數(shù)據(jù)加載到內(nèi)存中,再讀取給瀏覽器。
瀏覽器端緩存的規(guī)則主要在HTTP協(xié)議頭和HTML的meta標(biāo)簽中定義。他們分別從新鮮度和校驗(yàn)值兩個(gè)維度來(lái)規(guī)定瀏覽器是直接使用緩存中的數(shù)據(jù),還是需要去源服務(wù)器獲取更新的版本。
新鮮度(過(guò)期機(jī)制):緩存數(shù)據(jù)保質(zhì)期。緩存數(shù)據(jù)必須滿(mǎn)足以下條件,瀏覽器會(huì)認(rèn)為它是有效的,足夠新的:
滿(mǎn)足以上兩個(gè)情況的一種,瀏覽器會(huì)直接從緩存中獲取緩存數(shù)據(jù)并渲染給瀏覽器。
校驗(yàn)值(驗(yàn)證機(jī)制):服務(wù)器返回?cái)?shù)據(jù)的時(shí)候有時(shí)在頭信息中帶上這個(gè)資源的實(shí)體標(biāo)簽,它可以用來(lái)作為瀏覽器再次請(qǐng)求過(guò)程的校驗(yàn)標(biāo)識(shí)。如過(guò)發(fā)現(xiàn)校驗(yàn)標(biāo)識(shí)不匹配,說(shuō)明數(shù)據(jù)已經(jīng)被修改或過(guò)期,瀏覽器需要重新獲取數(shù)據(jù)內(nèi)容。
還記得HTTP協(xié)議嗎?在這篇文章中有對(duì)HTTP協(xié)議的簡(jiǎn)單介紹:淺析前后端數(shù)據(jù)交互
當(dāng)用戶(hù)通過(guò)瀏覽器發(fā)起一個(gè)數(shù)據(jù)請(qǐng)求的時(shí)候,瀏覽器會(huì)通過(guò)以下幾步來(lái)獲取數(shù)據(jù):
瀏覽器緩存機(jī)制
APP上的緩存機(jī)制和瀏覽器緩存的原理類(lèi)似,APP與服務(wù)器交互的協(xié)議同樣是大多基于HTTP(S)。
先普及下基礎(chǔ)知識(shí):手機(jī)內(nèi)存包括運(yùn)行內(nèi)存和內(nèi)部存儲(chǔ)。運(yùn)行內(nèi)存是用來(lái)運(yùn)行程序的,不能用來(lái)永久存儲(chǔ)數(shù)據(jù),手機(jī)一旦關(guān)機(jī)或殺死進(jìn)程,在內(nèi)存中的所有數(shù)據(jù)都將會(huì)丟失。內(nèi)部存儲(chǔ)相當(dāng)于計(jì)算機(jī)中的硬盤(pán)的角色,用于存儲(chǔ)操作系統(tǒng)和應(yīng)用程序的存儲(chǔ)介質(zhì)。
iOS的本地緩存數(shù)據(jù)存在磁盤(pán)存儲(chǔ)(內(nèi)部存儲(chǔ))中,由于Android手機(jī)通常將內(nèi)部存儲(chǔ)器固定在芯上,所以一般無(wú)法更換內(nèi)部存儲(chǔ)器的。 為了增強(qiáng)Android手機(jī)的存儲(chǔ)能力,很多Android手機(jī)都支持?jǐn)U展的SD卡(相當(dāng)于計(jì)算機(jī)的U盤(pán)或者移動(dòng)硬盤(pán))功能。所以,Android手機(jī)存儲(chǔ)緩存是可以選擇數(shù)據(jù)存儲(chǔ)位置的。
APP端存儲(chǔ)數(shù)據(jù)的時(shí)候,會(huì)存儲(chǔ)很多字段內(nèi)容,一般情況下后臺(tái)會(huì)給每條數(shù)據(jù)設(shè)定一個(gè)獨(dú)立的id值,那么前端在請(qǐng)求數(shù)據(jù)的可以先查詢(xún)本地緩存的數(shù)據(jù)中,最新的一條數(shù)據(jù)的id值,通過(guò)網(wǎng)絡(luò)請(qǐng)求,把這個(gè)id值發(fā)給服務(wù)端,服務(wù)端會(huì)根據(jù)這個(gè)id在后臺(tái)服務(wù)器中查詢(xún)是否有比這個(gè)id值更大(更新)的數(shù)據(jù)存在,如果有就把新的數(shù)據(jù)返回給前端APP。
數(shù)據(jù)庫(kù)的緩存機(jī)制分為兩個(gè)層面。
業(yè)務(wù)服務(wù)器緩存是將動(dòng)態(tài)頁(yè)面直接生成靜態(tài)的頁(yè)面放在服務(wù)器上的硬盤(pán)里,用戶(hù)調(diào)取相同頁(yè)面時(shí),靜態(tài)頁(yè)面將直接下載到客戶(hù)端,不再需要通過(guò)程序的運(yùn)行和數(shù)據(jù)庫(kù)的訪問(wèn),大大節(jié)約了服務(wù)器的負(fù)載。
每次訪問(wèn)頁(yè)面時(shí),會(huì)檢測(cè)相應(yīng)的緩存頁(yè)面是否存在,若不存在,則連接數(shù)據(jù)庫(kù)得到數(shù)據(jù)渲染頁(yè)面并生成緩存頁(yè)面文件,這樣下次訪問(wèn)的頁(yè)面文件就能發(fā)揮作用了。
舉一個(gè)小例子:
用戶(hù)A訪問(wèn)a頁(yè)面,服務(wù)器解析a頁(yè)面返回給用戶(hù)A,同時(shí)在服務(wù)器內(nèi)存上做一個(gè)映射,把a(bǔ)頁(yè)面緩存在服務(wù)器的硬盤(pán)上。用戶(hù)B訪問(wèn)a頁(yè)面,服務(wù)器直接根據(jù)內(nèi)存上的映射找到相應(yīng)的頁(yè)面緩存,直接返回給用戶(hù)B。這樣做減少了服務(wù)器對(duì)同以頁(yè)面的重復(fù)解析。
代理服務(wù)器是客戶(hù)端和業(yè)務(wù)服務(wù)器之間的中間服務(wù)器,客戶(hù)端先向這個(gè)中間服務(wù)器發(fā)起請(qǐng)求,經(jīng)過(guò)處理后,再將請(qǐng)求轉(zhuǎn)發(fā)到業(yè)務(wù)服務(wù)器。代理服務(wù)器緩存的運(yùn)作原理跟瀏覽器的運(yùn)作原理差不多,只是規(guī)模更大??梢园阉斫鉃橐粋€(gè)共享緩存,不只為一個(gè)用戶(hù)服務(wù),一般為大量用戶(hù)提供服務(wù),因此在減少相應(yīng)時(shí)間和帶寬使用方面很有效,同一個(gè)緩存數(shù)據(jù)會(huì)被重復(fù)使用多次。以上,就是關(guān)于緩存機(jī)制的簡(jiǎn)單總結(jié)。
來(lái)源:人人都是產(chǎn)品經(jīng)理,成都軟件開(kāi)發(fā)公司