產(chǎn)品日常思考—頁(yè)面緩存問(wèn)題(轉(zhuǎn)載)

———— / BEGIN / ————

緩存瞪慧,在互聯(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)流程是:

用戶的請(qǐng)求從界面(瀏覽器或App界面)到網(wǎng)絡(luò)傳送梗脾、應(yīng)用服務(wù)再到存儲(chǔ)(數(shù)據(jù)庫(kù)或文件系統(tǒng)),然后返回到界面呈現(xiàn)內(nèi)容盹靴。

隨著內(nèi)容信息越來(lái)越復(fù)雜炸茧,用戶數(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ù)也是有限的(文件的讀寫也是有限的)自赔。

如何能夠有效利用有限的資源來(lái)提供盡可能大的吞吐量妈嘹?

一個(gè)有效的辦法就是引入緩存,每個(gè)環(huán)節(jié)中請(qǐng)求可以從緩存中直接獲取目標(biāo)數(shù)據(jù)并返回绍妨,從而減少計(jì)算量润脸,有效提升響應(yīng)速度,讓有限的資源服務(wù)更多的用戶他去。

一毙驯、計(jì)算機(jī)緩存

計(jì)算機(jī)的緩存往往使用的是RAM(斷電就掉的非永久儲(chǔ)存),所以在用完后還是會(huì)把文件送到硬盤等存儲(chǔ)器里永久存儲(chǔ)灾测。

計(jì)算機(jī)里最大的緩存是內(nèi)存條爆价,最快的是CPU上鑲嵌的L1和L2緩存,顯卡的顯存是給顯卡運(yù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ú)需等待癣缅。

二、WEB瀏覽器緩存

下面我們進(jìn)入正題勘畔。

瀏覽器會(huì)緩存它瀏覽過(guò)的「資源」(包括網(wǎng)頁(yè)所灸,圖片等)丽惶,如果資源在保質(zhì)期內(nèi)炫七,那下次同樣的請(qǐng)求直接用緩存。

過(guò)期之后钾唬,會(huì)帶上資源上次的修改時(shí)間万哪,由服務(wù)器來(lái)判斷是否失效,失效的話就會(huì)給瀏覽器返回新的數(shù)據(jù)并繼續(xù)緩存下來(lái)抡秆。

瀏覽器的緩存奕巍,存在用戶電腦的硬盤上,用戶每次使用瀏覽器讀取緩存時(shí)先將硬盤上的緩存數(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ù)必須滿足以下條件拖叙,瀏覽器會(huì)認(rèn)為它是有效的氓润,足夠新的:

含有完整的過(guò)期時(shí)間控制頭信息(HTTP協(xié)議報(bào)文頭),并且仍在有效期內(nèi)

瀏覽器已經(jīng)使用過(guò)這個(gè)緩存數(shù)據(jù)薯鳍,并且在上一次會(huì)話中(也就是用戶上一次訪問(wèn)該數(shù)據(jù)時(shí))已經(jīng)檢查過(guò)其新鮮度

滿足以上兩個(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緩存機(jī)制

當(dāng)用戶通過(guò)瀏覽器發(fā)起一個(gè)數(shù)據(jù)請(qǐng)求的時(shí)候,瀏覽器會(huì)通過(guò)以下幾步來(lái)獲取數(shù)據(jù):

本地緩存階段:先在本地查找該數(shù)據(jù)抵怎,如果有發(fā)現(xiàn)該數(shù)據(jù)奋救,而且該數(shù)據(jù)還沒(méi)有過(guò)期,就使用此數(shù)據(jù)反惕,不會(huì)發(fā)送http請(qǐng)求到服務(wù)器

協(xié)商緩存階段:如果在本地緩存找到對(duì)應(yīng)的數(shù)據(jù)尝艘,但是不知道該數(shù)據(jù)是否過(guò)期,則發(fā)一個(gè)HTTP請(qǐng)求到服務(wù)器姿染,然后服務(wù)器判斷這個(gè)請(qǐng)求背亥,如果請(qǐng)求的數(shù)據(jù)在服務(wù)器上沒(méi)有改動(dòng)過(guò)或過(guò)期,則返回304狀態(tài)碼(可以理解為服務(wù)器給瀏覽器的暗號(hào))悬赏,讓瀏覽器在本地找到該數(shù)據(jù)

緩存失敗階段:當(dāng)服務(wù)器發(fā)現(xiàn)請(qǐng)求的資源已經(jīng)修改過(guò)狡汉,或者這是一個(gè)新的請(qǐng)求,服務(wù)器則返回該數(shù)據(jù)闽颇,并且返回200狀態(tài)碼盾戴, 此過(guò)程的前提是指找到該數(shù)據(jù),如果服務(wù)器上沒(méi)有數(shù)據(jù)兵多,則返回404(這個(gè)大家多見過(guò)吧尖啡,就是平時(shí)見到404頁(yè)面時(shí)的狀態(tài)碼)

瀏覽器中的操作對(duì)緩存的影響:

強(qiáng)制刷新:當(dāng)按下ctrl+F5來(lái)刷新頁(yè)面的時(shí)候,瀏覽器將繞過(guò)各種緩存(本地緩存和協(xié)商緩存)剩膘, 直接讓服務(wù)器返回最新數(shù)據(jù)

普通刷新:當(dāng)按下F5或者點(diǎn)擊刷新按鈕來(lái)刷新頁(yè)面的時(shí)候衅斩,瀏覽器將繞過(guò)本地緩存發(fā)送請(qǐng)求給服務(wù)器,此時(shí)協(xié)商緩存是有效的

回車或跳轉(zhuǎn):當(dāng)在地址欄上輸入回車或者按下跳轉(zhuǎn)按鈕的時(shí)候怠褐,所有緩存都生效


瀏覽器緩存機(jī)制

四畏梆、安卓、iOS緩存機(jī)制

APP上的緩存機(jī)制和瀏覽器緩存的原理類似奈懒,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ī)中的硬盤的角色达皿,用于存儲(chǔ)操作系統(tǒng)和應(yīng)用程序的存儲(chǔ)介質(zhì)天吓。

iOS的本地緩存數(shù)據(jù)存在磁盤存儲(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盤或者移動(dòng)硬盤)功能汤功。所以物邑,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ù)的可以先查詢本地緩存的數(shù)據(jù)中餐茵,最新的一條數(shù)據(jù)的id值科阎,通過(guò)網(wǎng)絡(luò)請(qǐng)求,把這個(gè)id值發(fā)給服務(wù)端忿族,服務(wù)端會(huì)根據(jù)這個(gè)id在后臺(tái)服務(wù)器中查詢是否有比這個(gè)id值更大(更新)的數(shù)據(jù)存在锣笨,如果有就把新的數(shù)據(jù)返回給前端APP。

五道批、數(shù)據(jù)庫(kù)緩存

數(shù)據(jù)庫(kù)的緩存機(jī)制分為兩個(gè)層面错英。

1. 由數(shù)據(jù)庫(kù)提供,可以對(duì)數(shù)據(jù)表建立的高速緩存隆豹。

數(shù)據(jù)庫(kù)的數(shù)據(jù)臨時(shí)保存在一個(gè)位置上椭岩,再次同樣的請(qǐng)求直接把這個(gè)數(shù)據(jù)返回去,而不需要再次去查詢各種表取數(shù)據(jù)了噪伊,減少了查數(shù)據(jù)庫(kù)的時(shí)間簿煌,提升效率氮唯。

并不是所有的歷史記錄都緩存起來(lái)鉴吹,要有策略,比如只緩存兩個(gè)月的數(shù)據(jù)惩琉,并且兩個(gè)月之前有請(qǐng)求過(guò)之后不再請(qǐng)求該數(shù)據(jù)的時(shí)候就會(huì)回收豆励,就是把這條記錄抹掉,就近多次請(qǐng)求的才會(huì)保存瞒渠。

時(shí)間過(guò)長(zhǎng)良蒸、使用率不高的優(yōu)先清除,要不然緩存太多就失去了緩存的本質(zhì)和意義伍玖。

2. 在數(shù)據(jù)庫(kù)中嫩痰,數(shù)據(jù)都是存放在磁盤中的。

雖然數(shù)據(jù)庫(kù)層做了對(duì)應(yīng)的緩存窍箍,但這種數(shù)據(jù)庫(kù)層次的緩存一般針對(duì)的是查詢內(nèi)容串纺,一般只有表中數(shù)據(jù)沒(méi)有變更的時(shí)候丽旅,數(shù)據(jù)庫(kù)對(duì)應(yīng)的緩存才發(fā)揮了作用。

有時(shí)并不能減少業(yè)務(wù)系統(tǒng)對(duì)數(shù)據(jù)庫(kù)產(chǎn)生的增纺棺、刪榄笙、查、改產(chǎn)生的龐大壓力祷蝌。此時(shí)茅撞,一般的做法是在數(shù)據(jù)庫(kù)與業(yè)務(wù)服務(wù)器之間增加一個(gè)緩存服務(wù)器,比如我們熟悉的redis巨朦。

客戶端第一次請(qǐng)求的數(shù)據(jù)從數(shù)據(jù)庫(kù)拿出后就放到了redis中米丘,數(shù)據(jù)不過(guò)期或不更改的前提下,下一次的請(qǐng)求都從redis中直接拿數(shù)據(jù)糊啡,這樣做極大的緩解了數(shù)據(jù)庫(kù)的壓力蠕蚜。

服務(wù)器緩存

六、業(yè)務(wù)服務(wù)器緩存

業(yè)務(wù)服務(wù)器緩存是將動(dòng)態(tài)頁(yè)面直接生成靜態(tài)的頁(yè)面放在服務(wù)器上的硬盤里悔橄,用戶調(diào)取相同頁(yè)面時(shí)靶累,靜態(tài)頁(yè)面將直接下載到客戶端,不再需要通過(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è)小例子:

用戶A訪問(wèn)a頁(yè)面侧到,服務(wù)器解析a頁(yè)面返回給用戶A,同時(shí)在服務(wù)器內(nèi)存上做一個(gè)映射淤击,把a(bǔ)頁(yè)面緩存在服務(wù)器的硬盤上匠抗。用戶B訪問(wèn)a頁(yè)面,服務(wù)器直接根據(jù)內(nèi)存上的映射找到相應(yīng)的頁(yè)面緩存污抬,直接返回給用戶B汞贸。

這樣做減少了服務(wù)器對(duì)同以頁(yè)面的重復(fù)解析。

七印机、代理服務(wù)器緩存

代理服務(wù)器是客戶端和業(yè)務(wù)服務(wù)器之間的中間服務(wù)器矢腻,客戶端先向這個(gè)中間服務(wù)器發(fā)起請(qǐng)求,經(jīng)過(guò)處理后射赛,再將請(qǐng)求轉(zhuǎn)發(fā)到業(yè)務(wù)服務(wù)器多柑。代理服務(wù)器緩存的運(yùn)作原理跟瀏覽器的運(yùn)作原理差不多,只是規(guī)模更大楣责。

可以把它理解為一個(gè)共享緩存竣灌,不只為一個(gè)用戶服務(wù)诫隅,一般為大量用戶提供服務(wù),因此在減少相應(yīng)時(shí)間和帶寬使用方面很有效帐偎,同一個(gè)緩存數(shù)據(jù)會(huì)被重復(fù)使用多次逐纬。

以上,就是關(guān)于緩存機(jī)制的簡(jiǎn)單總結(jié)削樊。

產(chǎn)品汪們豁生,再涉及項(xiàng)目中的緩存機(jī)制時(shí),就不怕被程序猿們懟了漫贞!

———— / END / ————

作者:流年甸箱,互聯(lián)網(wǎng)產(chǎn)品設(shè)計(jì)師,4年互聯(lián)網(wǎng)產(chǎn)品設(shè)計(jì)經(jīng)驗(yàn)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末迅脐,一起剝皮案震驚了整個(gè)濱河市芍殖,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌谴蔑,老刑警劉巖豌骏,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異隐锭,居然都是意外死亡窃躲,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門钦睡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)蒂窒,“玉大人,你說(shuō)我怎么就攤上這事荞怒∪髯粒” “怎么了?”我有些...
    開封第一講書人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵褐桌,是天一觀的道長(zhǎng)衰抑。 經(jīng)常有香客問(wèn)我,道長(zhǎng)撩嚼,這世上最難降的妖魔是什么停士? 我笑而不...
    開封第一講書人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任挖帘,我火速辦了婚禮完丽,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘拇舀。我一直安慰自己逻族,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開白布骄崩。 她就那樣靜靜地躺著聘鳞,像睡著了一般薄辅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上抠璃,一...
    開封第一講書人閱讀 51,688評(píng)論 1 305
  • 那天站楚,我揣著相機(jī)與錄音,去河邊找鬼搏嗡。 笑死窿春,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的采盒。 我是一名探鬼主播旧乞,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼磅氨!你這毒婦竟也來(lái)了尺栖?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤烦租,失蹤者是張志新(化名)和其女友劉穎延赌,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體叉橱,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡皮胡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了赏迟。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片屡贺。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖锌杀,靈堂內(nèi)的尸體忽然破棺而出甩栈,到底是詐尸還是另有隱情,我是刑警寧澤糕再,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布量没,位于F島的核電站,受9級(jí)特大地震影響突想,放射性物質(zhì)發(fā)生泄漏殴蹄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一猾担、第九天 我趴在偏房一處隱蔽的房頂上張望袭灯。 院中可真熱鬧,春花似錦绑嘹、人聲如沸稽荧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)姨丈。三九已至畅卓,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蟋恬,已是汗流浹背翁潘。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留歼争,地道東北人唐础。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像矾飞,于是被迫代替她去往敵國(guó)和親一膨。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容