讓商業(yè)變得更智能

什么是緩存機制,解析本地緩存和服務(wù)器緩存
緩存機制,成都軟件開(kāi)發(fā)公司

緩存,在互聯(lián)網(wǎng)產(chǎn)品中可以簡(jiǎn)單理解為:第一次請求數據放到存儲器中,下次顯示該頁(yè)面先把上次保存的數據顯示出來(lái),同時(shí)去請求數據,請求完成刷新顯示新數據,并將其再緩存起來(lái)。

當今互聯(lián)網(wǎng)應用(網(wǎng)站或App)的整體實(shí)現流程是:用戶(hù)的請求從界面(瀏覽器或App界面)到網(wǎng)絡(luò )傳送、應用服務(wù)再到存儲(數據庫或文件系統),然后返回到界面呈現內容。

隨著(zhù)內容信息越來(lái)越復雜,用戶(hù)數和訪(fǎng)問(wèn)量越來(lái)越大,我們的應用需要支撐更多的并發(fā)量,同時(shí)應用服務(wù)器和數據庫服務(wù)器所做的計算也越來(lái)越多。但是往往我們的應用服務(wù)器資源是有限的,數據庫每秒能接受的請求次數也是有限的(文件的讀寫(xiě)也是有限的),如何能夠有效利用有限的資源來(lái)提供盡可能大的吞吐量?一個(gè)有效的辦法就是引入緩存,每個(gè)環(huán)節中請求可以從緩存中直接獲取目標數據并返回,從而減少計算量,有效提升響應速度,讓有限的資源服務(wù)更多的用戶(hù)。

計算機緩存

計算機的緩存往往使用的是RAM(斷電就掉的非永久儲存),所以在用完后還是會(huì )把文件送到硬盤(pán)等存儲器里永久存儲。計算機里最大的緩存是內存條,最快的是CPU上鑲嵌的L1和L2緩存,顯卡的顯存是給顯卡運算芯片用的緩存,硬盤(pán)上也有16M或者32M的緩存。

其工作原理是當CPU要讀取數據時(shí),首先從CPU緩存中查找,找到就立即讀取并送給CPU處理;如果沒(méi)有找到,就從速率相對較慢的內存中讀取并送給CPU處理,同時(shí)把這個(gè)數據所在的數據區塊調入緩存中,可以使以后對整塊數據的讀取都從緩存中進(jìn)行,不必再調用內存。這樣的讀取機制CPU讀取緩存的命中率非常高,也就是說(shuō)CPU下一次要讀取的數據90%都在CPU緩存中,只有大約10%需要從內存讀取。這大大節省了CPU直接讀取內存的時(shí)間,也使CPU讀取數據時(shí)基本無(wú)需等待。

WEB瀏覽器緩存

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

瀏覽器會(huì )緩存它瀏覽過(guò)的「資源」(包括網(wǎng)頁(yè),圖片等),如果資源在保質(zhì)期內,那下次同樣的請求直接用緩存。過(guò)期之后,會(huì )帶上資源上次的修改時(shí)間,由服務(wù)器來(lái)判斷是否失效,失效的話(huà)就會(huì )給瀏覽器返回新的數據并繼續緩存下來(lái)。

瀏覽器的緩存,存在用戶(hù)電腦的硬盤(pán)上,用戶(hù)每次使用瀏覽器讀取緩存時(shí)先將硬盤(pán)上的緩存數據加載到內存中,再讀取給瀏覽器。

瀏覽器端緩存的規則主要在HTTP協(xié)議頭和HTML的meta標簽中定義。他們分別從新鮮度和校驗值兩個(gè)維度來(lái)規定瀏覽器是直接使用緩存中的數據,還是需要去源服務(wù)器獲取更新的版本。

新鮮度(過(guò)期機制):緩存數據保質(zhì)期。緩存數據必須滿(mǎn)足以下條件,瀏覽器會(huì )認為它是有效的,足夠新的:

  • 含有完整的過(guò)期時(shí)間控制頭信息(HTTP協(xié)議報文頭),并且仍在有效期內
  • 瀏覽器已經(jīng)使用過(guò)這個(gè)緩存數據,并且在上一次會(huì )話(huà)中(也就是用戶(hù)上一次訪(fǎng)問(wèn)該數據時(shí))已經(jīng)檢查過(guò)其新鮮度

滿(mǎn)足以上兩個(gè)情況的一種,瀏覽器會(huì )直接從緩存中獲取緩存數據并渲染給瀏覽器。

校驗值(驗證機制):服務(wù)器返回數據的時(shí)候有時(shí)在頭信息中帶上這個(gè)資源的實(shí)體標簽,它可以用來(lái)作為瀏覽器再次請求過(guò)程的校驗標識。如過(guò)發(fā)現校驗標識不匹配,說(shuō)明數據已經(jīng)被修改或過(guò)期,瀏覽器需要重新獲取數據內容。

HTTP緩存機制

還記得HTTP協(xié)議嗎?在這篇文章中有對HTTP協(xié)議的簡(jiǎn)單介紹:淺析前后端數據交互

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

  • 本地緩存階段:先在本地查找該數據,如果有發(fā)現該數據,而且該數據還沒(méi)有過(guò)期,就使用此數據,不會(huì )發(fā)送http請求到服務(wù)器
  • 協(xié)商緩存階段:如果在本地緩存找到對應的數據,但是不知道該數據是否過(guò)期,則發(fā)一個(gè)HTTP請求到服務(wù)器,然后服務(wù)器判斷這個(gè)請求,如果請求的數據在服務(wù)器上沒(méi)有改動(dòng)過(guò)或過(guò)期,則返回304狀態(tài)碼(可以理解為服務(wù)器給瀏覽器的暗號),讓瀏覽器在本地找到該數據
  • 緩存失敗階段:當服務(wù)器發(fā)現請求的資源已經(jīng)修改過(guò),或者這是一個(gè)新的請求,服務(wù)器則返回該數據,并且返回200狀態(tài)碼, 此過(guò)程的前提是指找到該數據,如果服務(wù)器上沒(méi)有數據,則返回404(這個(gè)大家多見(jiàn)過(guò)吧,就是平時(shí)見(jiàn)到404頁(yè)面時(shí)的狀態(tài)碼)

瀏覽器中的操作對緩存的影響

  • 強制刷新:當按下ctrl+F5來(lái)刷新頁(yè)面的時(shí)候,瀏覽器將繞過(guò)各種緩存(本地緩存和協(xié)商緩存), 直接讓服務(wù)器返回最新數據
  • 普通刷新:當按下F5或者點(diǎn)擊刷新按鈕來(lái)刷新頁(yè)面的時(shí)候,瀏覽器將繞過(guò)本地緩存發(fā)送請求給服務(wù)器,此時(shí)協(xié)商緩存是有效的
  • 回車(chē)或跳轉:當在地址欄上輸入回車(chē)或者按下跳轉按鈕的時(shí)候,所有緩存都生效

瀏覽器緩存機制

安卓、iOS緩存機制

APP上的緩存機制和瀏覽器緩存的原理類(lèi)似,APP與服務(wù)器交互的協(xié)議同樣是大多基于HTTP(S)。

先普及下基礎知識:手機內存包括運行內存和內部存儲。運行內存是用來(lái)運行程序的,不能用來(lái)永久存儲數據,手機一旦關(guān)機或殺死進(jìn)程,在內存中的所有數據都將會(huì )丟失。內部存儲相當于計算機中的硬盤(pán)的角色,用于存儲操作系統和應用程序的存儲介質(zhì)。

iOS的本地緩存數據存在磁盤(pán)存儲(內部存儲)中,由于A(yíng)ndroid手機通常將內部存儲器固定在芯上,所以一般無(wú)法更換內部存儲器的。 為了增強Android手機的存儲能力,很多Android手機都支持擴展的SD卡(相當于計算機的U盤(pán)或者移動(dòng)硬盤(pán))功能。所以,Android手機存儲緩存是可以選擇數據存儲位置的。

APP端存儲數據的時(shí)候,會(huì )存儲很多字段內容,一般情況下后臺會(huì )給每條數據設定一個(gè)獨立的id值,那么前端在請求數據的可以先查詢(xún)本地緩存的數據中,最新的一條數據的id值,通過(guò)網(wǎng)絡(luò )請求,把這個(gè)id值發(fā)給服務(wù)端,服務(wù)端會(huì )根據這個(gè)id在后臺服務(wù)器中查詢(xún)是否有比這個(gè)id值更大(更新)的數據存在,如果有就把新的數據返回給前端APP。

數據庫緩存

數據庫的緩存機制分為兩個(gè)層面。

  1. 由數據庫提供,可以對數據表建立的高速緩存。數據庫的數據臨時(shí)保存在一個(gè)位置上,再次同樣的請求直接把這個(gè)數據返回去,而不需要再次去查詢(xún)各種表取數據了,減少了查數據庫的時(shí)間,提升效率。并不是所有的歷史記錄都緩存起來(lái),要有策略,比如只緩存兩個(gè)月的數據,并且兩個(gè)月之前有請求過(guò)之后不再請求該數據的時(shí)候就會(huì )回收,就是把這條記錄抹掉,就近多次請求的才會(huì )保存。時(shí)間過(guò)長(cháng)、使用率不高的優(yōu)先清除,要不然緩存太多就失去了緩存的本質(zhì)和意義。
  2. 在數據庫中,數據都是存放在磁盤(pán)中的。雖然數據庫層做了對應的緩存,但這種數據庫層次的緩存一般針對的是查詢(xún)內容,一般只有表中數據沒(méi)有變更的時(shí)候,數據庫對應的緩存才發(fā)揮了作用。有時(shí)并不能減少業(yè)務(wù)系統對數據庫產(chǎn)生的增、刪、查、改產(chǎn)生的龐大壓力。此時(shí),一般的做法是在數據庫與業(yè)務(wù)服務(wù)器之間增加一個(gè)緩存服務(wù)器,比如我們熟悉的redis。客戶(hù)端第一次請求的數據從數據庫拿出后就放到了redis中,數據不過(guò)期或不更改的前提下,下一次的請求都從redis中直接拿數據,這樣做極大的緩解了數據庫的壓力。

服務(wù)器緩存

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

業(yè)務(wù)服務(wù)器緩存是將動(dòng)態(tài)頁(yè)面直接生成靜態(tài)的頁(yè)面放在服務(wù)器上的硬盤(pán)里,用戶(hù)調取相同頁(yè)面時(shí),靜態(tài)頁(yè)面將直接下載到客戶(hù)端,不再需要通過(guò)程序的運行和數據庫的訪(fǎng)問(wèn),大大節約了服務(wù)器的負載。

每次訪(fǎng)問(wèn)頁(yè)面時(shí),會(huì )檢測相應的緩存頁(yè)面是否存在,若不存在,則連接數據庫得到數據渲染頁(yè)面并生成緩存頁(yè)面文件,這樣下次訪(fǎng)問(wèn)的頁(yè)面文件就能發(fā)揮作用了。

舉一個(gè)小例子:

用戶(hù)A訪(fǎng)問(wèn)a頁(yè)面,服務(wù)器解析a頁(yè)面返回給用戶(hù)A,同時(shí)在服務(wù)器內存上做一個(gè)映射,把a頁(yè)面緩存在服務(wù)器的硬盤(pán)上。用戶(hù)B訪(fǎng)問(wèn)a頁(yè)面,服務(wù)器直接根據內存上的映射找到相應的頁(yè)面緩存,直接返回給用戶(hù)B。這樣做減少了服務(wù)器對同以頁(yè)面的重復解析。

代理服務(wù)器緩存

代理服務(wù)器是客戶(hù)端和業(yè)務(wù)服務(wù)器之間的中間服務(wù)器,客戶(hù)端先向這個(gè)中間服務(wù)器發(fā)起請求,經(jīng)過(guò)處理后,再將請求轉發(fā)到業(yè)務(wù)服務(wù)器。代理服務(wù)器緩存的運作原理跟瀏覽器的運作原理差不多,只是規模更大??梢园阉斫鉃橐粋€(gè)共享緩存,不只為一個(gè)用戶(hù)服務(wù),一般為大量用戶(hù)提供服務(wù),因此在減少相應時(shí)間和帶寬使用方面很有效,同一個(gè)緩存數據會(huì )被重復使用多次。以上,就是關(guān)于緩存機制的簡(jiǎn)單總結。

來(lái)源:人人都是產(chǎn)品經(jīng)理,成都軟件開(kāi)發(fā)公司

緩存機制,成都軟件開(kāi)發(fā)公司
亚洲一区二区中文字幕无_日本啪啪一区免费完整视频_91caop国产在线_中文字幕欧美日本亚洲