常見的5中緩存策略
http://www.reibang.com/p/207130233e60
緩存策略的分類
1)基于訪問的時間:此類算法按各緩存項被訪問時間來組織緩存隊列知允,決定替換對象睬魂。如LRU光坝。
2)基于訪問頻率:此類算法用緩存項的被訪問頻率來組織緩存忠蝗。如LFU、LRU2翔冀、2Q铐然、LIRS涝滴。
3)訪問時間與頻率兼顧:通過兼顧訪問時間和頻率。使得數據模式在變化時緩存策略仍有較好性能鲤拿。如FBR假褪、LRUF、ALRFU近顷。多數此類算法具有一個可調或自適應參數生音,通過該參數的調節(jié)使緩存策略在基于訪問時間與頻率間取得一個平衡。
4)基于訪問模式:某些應用有較明確的數據訪問特點窒升,進而產生與其相適應的緩存策略缀遍。如專用的VoD系統設計的A&L緩存策略,同時適應隨機饱须、順序兩種訪問模式的SARC策略域醇。
https://blog.csdn.net/qq_39283195/article/details/94328205
web緩存策略
瀏覽器緩存
瀏覽器緩存機制有四個方面,它們按照獲取資源時請求的優(yōu)先級依次排列如下:
1.Memory Cache
MemoryCache,是指存在內存中的緩存譬挚。從優(yōu)先級上來說锅铅,它是瀏覽器最先嘗試去命中的一種緩存。從效率上來說殴瘦,它是響應速度最快的一種緩存狠角。不過當頁面關閉時,內存里的數據也就沒有了蚪腋。資源存不存內存丰歌,瀏覽器秉承的是“節(jié)約原則”。我們發(fā)現屉凯,Base64格式的圖片立帖,幾乎永遠可以被塞進 memory cache,這可以視作瀏覽器為節(jié)省渲染開銷的“自保行為”悠砚;此外晓勇,體積不大的 JS、CSS 文件灌旧,也有較大地被寫入內存的幾率——相比之下绑咱,較大的 JS、CSS 文件就沒有這個待遇了枢泰,內存資源是有限的描融,它們往往被直接甩進磁盤。
2.Service Worker Cache
Service Worker 是一種獨立于主線程之外的 Javascript 線程衡蚂。它可以幫我們實現離線緩存窿克、消息推送和網絡代理等功能。通常我們如果要使用 Service Worker 基本就是以下幾個步驟:
首先我們需要在頁面的 JavaScript 主線程中注冊 Service Worker毛甲。注冊成功后后臺開始安裝步驟年叮, 通常在安裝的過程中需要緩存一些靜態(tài)資源。安裝成功后開始激活 Service Worker玻募;激活成功后 Service Worker 可以控制頁面了(監(jiān)聽 fetch 和 message 事件)只损,但是只針對在成功注冊了 Service Worker 后打開的頁面。在頁面發(fā)起 http 請求時七咧,service worker 可以通過 fetch 事件攔截請求改执,并且給出自己的響應。頁面和 serviceWorker 之間可以通過 posetMessage() 方法發(fā)送消息坑雅,發(fā)送的消息可以通過 message 事件接收到辈挂。Service Worker 必須以 https 協議為前提。
3.HTTP Cache
HTTP 緩存分為強緩存和協商緩存裹粤。優(yōu)先級較高的是強緩存终蒂,在命中強緩存失敗的情況下蜂林,才會走協商緩存。
強緩存
指的是向瀏覽器緩存查找該請求的結果拇泣,并根據該結果的緩存規(guī)則來決定是否使用該緩存結果的過程噪叙。強緩存是利用http響應頭中的Expires和Cache-Control兩個字段來控制的。
Expires——實現強緩存霉翔,過去我們一直用expires睁蕾。在服務器的響應頭里,會將過期時間寫入 expires 字段债朵;那么子眶,當我們試圖再次向服務器請求資源時,瀏覽器就會先對比本地時間和 expires 的時間序芦,如果本地時間小于 expires 設定的過期時間臭杰,就直接去緩存中取這個資源。不過expires依賴于本地時間谚中,如果服務端和客戶端的時間設置不同渴杆,那么expires 將無法達到我們的預期。
Cache-Control——考慮到 expires 的局限性宪塔,HTTP1.1 新增了 Cache-Control 字段來完成 expires 的任務磁奖。當 Cache-Control 與 expires 同時出現時,我們以 Cache-Control 為準某筐。Cache-Control 包含以下幾個值:
(1)max-age:會等于一個時間長度(以秒為單位)
(2)public 與 private:如果我們?yōu)橘Y源設置了 public比搭,那么它既可以被瀏覽器緩存,也可以被代理服務器緩存(也就是多個用戶可以共享這個緩存)来吩;如果我們設置了 private敢辩,則該資源只能被瀏覽器緩存蔽莱。
(3)no-store 與 no-cache:如果我們?yōu)橘Y源設置了 no-cache弟疆,瀏覽器會對響應進行緩存,但是需要到服務器去確認這個緩存是否能用盗冷。即走我們下文即將講解的協商緩存的路線怠苔。如果設置了no-store,所有內容都不會被緩存仪糖,即不使用強制緩存柑司,也不使用協商緩存
協商緩存
協商緩存指的是強制緩存失效后,瀏覽器向服務器詢問緩存的相關信息锅劝,進而判斷是重新發(fā)起請求還是從本地拿緩存的過程攒驰。如果服務端提示緩存資源未改動(Not Modified),資源會被重定向到瀏覽器緩存故爵,這種情況下網絡請求對應的狀態(tài)碼是 304玻粪。
4.Push Cache
Push Cache 是指 HTTP2 在 server push 階段存在的緩存。
服務器緩存
CDN
CDN (Content Delivery Network,即內容分發(fā)網絡)指的是一組分布在各個地區(qū)的服務器劲室。這些服務器存儲著數據的副本伦仍,因此服務器可以根據哪些服務器與用戶距離最近,來滿足數據的請求很洋。 CDN 提供快速服務充蓝,較少受高流量影響。
CDN 的核心點有兩個喉磁,一個是緩存谓苟,一個是回源。
“緩存”就是說我們把資源 copy 一份到 CDN 服務器上這個過程线定,“回源”就是說 CDN 發(fā)現自己沒有這個資源(一般是緩存的數據過期了)娜谊,轉頭向根服務器(或者它的上層服務器)去要這個資源的過程。
CDN 往往被用來存放靜態(tài)資源斤讥,就是像 JS纱皆、CSS、圖片等不需要業(yè)務服務器進行計算即得的資源芭商。
HTML5緩存
Web Storage
Web Storage 是 HTML5 專門為瀏覽器存儲而提供的數據存儲機制派草。存儲容量可以達到 5-10M 之間。它又分為 Local Storage 與 Session Storage铛楣。
?Local Storage 與 Session Storage 的區(qū)別
兩者的區(qū)別在于生命周期與作用域的不同近迁。
生命周期:存儲在Local Storage的數據是永遠不會過期的,使其消失的唯一辦法是手動刪除簸州;而 Session Storage 是臨時性的本地存儲鉴竭,當會話結束(頁面被關閉)時,存儲內容也隨之被釋放岸浑。
作用域:Local Storage搏存、Session Storage 和 Cookie 都遵循同源策略。但 Session Storage 特別的一點在于矢洲,即便是相同域名下的兩個頁面璧眠,只要它們不在同一個瀏覽器窗口中打開,那么它們的 Session Storage 內容便無法共享读虏。
應用場景
Local Storage 的特點之一是持久责静,有時我們更傾向于用它來存儲一些內容穩(wěn)定的資源。比如圖片內容豐富的電商網站會用它來存儲 Base64 格式的圖片字符串盖桥,有的網站還會用它存儲一些不經常更新的 CSS灾螃、JS 等靜態(tài)資源。
Session Storage 更適合用來存儲生命周期和它同步的會話級別的信息揩徊。這些信息只適用于當前會話腰鬼,當你開啟新的會話時藐握,它也需要相應的更新或釋放。比如微博的 Session Storage 就主要是存儲你本次會話的瀏覽足跡垃喊。
IndexDB
IndexDB 是一個運行在瀏覽器上的非關系型數據庫猾普。
參考文章: