前端存儲(強緩存、協商緩存、cookies、sessionStorage、localStorage)

一、前景介紹

1.1緩存是什麼?數據存儲是什麼?

緩存是代理服務器或客戶端磁盤內保存的一個資源副本。

當我們向服務器請求資源後,會根據情況將資源 copy 一份副本存在本地,以方便下次讀取。

它與本地存儲 localStorage 、cookie 等不同,本地存儲更多是數據記錄,存儲量較小,爲了本地操作方便。

而緩存更多是爲了減少資源請求,多用於存儲文件,存儲量相對較大。

前端緩存兩步:在“請求”和“響應”中進行。

在“請求”步驟中,瀏覽器也可以通過存儲結果的方式直接使用資源,直接省去了發送請求;

而“響應”步驟需要瀏覽器和服務器共同配合,通過減少響應內容來縮短傳輸時間

前端的數據存儲:通過把數據存儲在瀏覽器中,用戶不必每次都向服務器請求獲取同一個信息。

在離線時,使用本地存儲的數據而不是向遠端服務器上請求數據

客戶端存儲可以通過這些技術來實現:cookie、Web Storage、IndexedDB、userData。

1.2你的緩存的印象有哪些?

電視劇離線緩存、瀏覽器的搜索緩存、網頁的數據圖片緩存

1.3緩存、數據存儲的作用是什麼?

通過緩存,使用資源副本,大大減少獲取資源時間

減少請求時間,減少http請求個數

可以大幅度的降低網絡請求,減少流量的消耗

減少了冗餘的數據傳輸,節省了網費

減少了服務器的負擔,大大提升了網站的性能

存儲用戶信息,提升用戶體驗能夠減少網絡帶寬消耗、

減少延遲與網絡阻塞,同時降低服務器壓力,提高服務器性能

業務流程需要,簡化用戶操作,提升用戶體驗

二、使用介紹

在這裏插入圖片描述
2.1瀏覽器緩存

強緩存(expires\Cache-Control):

定義:強制緩存就是向瀏覽器緩存查找該請求結果,並根據該結果的緩存規則來決定是否使用該緩存結果的過程

當客戶端請求後,會先訪問緩存數據庫看緩存是否存在。如果存在則直接返回;不存在則請求真的服務器,響應後再寫入緩存數據庫。

如果考慮使用緩存來優化網頁性能的話,強緩存應該是首先被考慮的。

強緩存是利用http的返回頭中的Expires或者Cache-Control兩個字段來控制的,用來表示資源的緩存時間。

expires字段:這是 HTTP 1.0 的字段,表示緩存到期時間,是一個絕對的時間 (當前時間+緩存時間),

Cache-Control字段:HTTP1.1新增字段,它是一個相對時間,主要是利用該字段的max-age值來進行判斷,例如Cache-Control:max-age=3600,代表着資源的有效期是3600秒。

下面幾個比較常用的設置值:

no-cache:不使用本地緩存。需要使用緩存協商,先與服務器確認返回的響應是否被更改,如果之前的響應中存在ETag,那麼請求的時候會與服務端驗證,如果資源未被更改,則可以避免重新下載。

no-store:直接禁止遊覽器緩存數據,每次用戶請求該資源,都會向服務器發送一個請求,每次都會下載完整的資源。

public:可以被所有的用戶緩存,包括終端用戶和CDN等中間代理服務器。

private:只能被終端用戶的瀏覽器緩存,不允許CDN等中繼緩存服務器對其緩存。

優先級:cache-control -> expires

協商緩存(Last-Modified & If-Modified-Since\Etag & If-None-Match):

定義:協商緩存就是強制緩存失效後,瀏覽器攜帶緩存標識向服務器發起請求,由服務器根據緩存標識決定是否使用緩存的過程

協商緩存就是由服務器來確定緩存資源是否可用,客戶端與服務器端要通過某種標識來進行通信,從而讓服務器判斷請求資源是否可以緩存訪問

服務器通過 Last-Modified 字段告知客戶端,資源最後一次被修改的時間,客戶端會自己對這個時間進行比對

如果相等則表示未修改,響應 304;反之,則表示修改了,響應 200 狀態碼,並返回數據(如果資源更新的速度是秒以下單位,這個緩存就會失效,因爲時間單位是秒)

Etag 存儲的是文件的特殊標識(一般都是 hash 生成的),服務器存儲着文件的 Etag 字段,之後的流程和 Last-Modified 一致

Last-Modified與ETag是可以一起使用的,服務器會優先驗證ETag,一致的情況下,纔會繼續比對Last-Modified,最後才決定是否返回304。

優先級: ETag -> Last-Modified

熟悉完強緩存和協商緩存,下面兩張圖帶你更加深刻理解
在這裏插入圖片描述
在這裏插入圖片描述

2.2 本地緩存

Cookie:

  • 第一個功能就是用於解決http無狀態的缺點,在客戶端存儲會話信息,記錄用戶的狀態

  • 第二個功能也就是我們現在也經常使用cookie在客戶端存儲一些其它的數據,可以設置使用範圍、增刪改查作用

//增改:
Cookies.set("token", res1.data.result.token, {
expires: 7,
path: "/",
domain: "101hr.com"
});
//刪除對應項
Cookies.remove("token", { path: "/", domain: "101hr.com" });
//查
Cookies.get("menuClick")

Web Storage:

  • 是一種在客戶端存儲數據的一種機制,主要的目的是爲了克服由cookie帶來的一些限制

  • 當數據需要被嚴格控制在客戶端上時,無須將數據在客戶端和服務器之間來回的進行傳送,並且可以存儲大量的跨會話的數據

  • Web Storage包含了兩種對象的定義,sessionStorage和localStorage

  • sessionStorage只能存儲字符串類型數據,無法直接存儲數組類型和JSON對象

  • 所以可以JSON.stringify()方法轉換成字符串,再存儲到sessionstorage中,使用的時候再使用JSON.parse()轉化回來

//sessionStorage和localStorage的使用方式是相近的
//增改
localStorage.setItem('redirect_uri',res.data.result.redirect_uri)
//存儲數組和對象類型
localStorage.setItem('redirect_uri',JSON.stringify(res.data.result.redirect_uri))
sessionStorage.setItem('redirect_uri',res.data.result.redirect_uri) 
//查
localStorage.getItem('redirect_uri’)
JSON.parse(localStorage.getItem('redirect_uri’))
//刪
localStorage.removeItem('redirect_uri’)
//清空storage數據
localStorage.clear() 

vuex:

  • vuex是一個專爲vue.js應用程序開發的狀態管理器

  • 它採用集中式存儲管理應用的所有組件的狀態,並且以相 應的規則保證狀態以一種可以預測的方式發生變化,採用單向數據流的方式更加快的定位到位置

  • 數據保存在Vuex的state字段內,任何頁面組件都可以通過$store.state.變量名稱去讀取數據

  • 修改state數據,顯示地提交mutations,使用this.$store.commit方法來執行mutations

  • 頁面刷新數據恢復,故結合keep-alive、web Storage來使用

import Vue from 'vue'

import Vuex from 'vuex'

Vue.use(Vuex)

const state = {

  name: 'yan',

  age: 23,

  obj: [{ bookname: '荒誕', num: 20 }, { bookname: '行爲學', num: 30 }, { bookname: '荒誕行爲學', num: 40 }]

}

const mutations = {

  changename (state, name) {

    state.name = name

  },

  changeage (state) {

    state.age++

  }

}

const getters = {

  checkObj (state) {

    return state.obj.filter(res => { return res.num > 25 })

  }

}

// 異步觸發

const actions = {

  changeage (context) {

    context.commit('changeage')

  }

}

const store = new Vuex.Store({

  //  vuex的配置

  state, mutations, getters, actions

})

//使用文件

changName () {

      // vuex通過commit提交修改

      this.$store.commit('changename', 'yanjiazhen')

      this.$store.commit('changeage')

      // getter獲取計算內容

      this.obj = this.$store.getters.checkObj

} 

想要更加深入學習vuex可以查看這篇文章

https://blog.csdn.net/weixin_44258964/article/details/105853865

三、比較

3.1 用戶行爲對緩存、數據存儲的影響
在這裏插入圖片描述

3.2 關於數據保存

  • http緩存的是保存在本地

  • cookie數據始終在同源的http請求中攜帶(即使不需要),即cookie可在瀏覽器和服務器間來回傳遞

  • sessionStorage和localStorage不會自動把數據發送給服務器,僅在本地保存

  • vuex保存在內存中

3.3 應用

(1)保存用戶登錄狀態、全局變量設置(token、用戶信息)

(2)跟蹤用戶行爲。

(3)vuex適合中大型單頁面應用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章