天天看點

前端本地存儲方案,緩存存儲方案

作者:重慶源碼時代

前言:我們來談談什麼是緩存?我們為什麼需要緩存呢?

緩存就是資料交換的緩沖區(稱作Cache),是存貯資料(使用頻繁的資料)的臨時地方。當使用者查詢資料,首先在緩存中尋找,如果找到了則直接執行。如果找不到,則去資料庫中查找。 緩存的本質就是用空間換時間,犧牲資料的實時性,以伺服器記憶體中的資料暫時代替從資料庫讀取最新的資料,減少資料庫IO,減輕伺服器壓力,減少網絡延遲,加快頁面打開速度。

前端緩存分類

前端緩存主要分為:

  • HTTP緩存
  • 浏覽器緩存

http緩存

  • HTTP請求傳輸時用到的緩存,主要在伺服器代碼上設定

浏覽器緩存

  • 浏覽器緩存則主要由前端開發在前端JavaScript上進行設定,對于我們的前端夥伴們,重點了解浏覽器緩存就可以啦!

使用緩存的優勢

正常來說,進行一個資料請求,可以分為發起網絡請求、後端處理、浏覽器響應三個步驟。而浏覽器緩存可以幫助我們在第一和第三步驟中優化性能。 比如說直接使用緩存而不發起請求,或者發起了請求但後端存儲的資料和前端一緻,那麼就沒有必要再将資料回傳回來,這樣就減少了響應資料。同時由于緩存檔案可進行重複利用,極大程度降低伺服器壓力。是以說緩存是性能優化中簡單高效的一種優化方式了。

緩存的過程分析

我們簡單的來看一個網絡請求的圖檔

前端本地存儲方案,緩存存儲方案
通過上圖,我們不難看出,當浏覽器第一次請求,首先會先查找緩存,若查找不到才發起http請求,并且在請求結束之後。我們可将請求結果存儲在浏覽器中,便于下次直接使用緩存資料

那麼浏覽器本地緩存到底有哪些呢?有什麼差別呢?

  • cookie
  • localStorage
  • sessionStorage

1、存儲大小不同

cookie主要用于存儲使用者資訊,存儲空間小,隻有4Kb localStorage、sessionStorage存儲空間較大,目前可以達到5M及以上

2、生命周期(緩存存活的最大時間)

cookie:會設定一個expires(max-age)則cookie會在指定的時間失效,若沒有設定結束時間,則預設為session,關閉浏覽器則失效 localStorage:資料會永久存在,除非後期手動進行清除 sessionStorage:僅存在于會話期間,浏覽器關閉則緩存失效

3、伺服器通訊

cookie:對伺服器發起http請求時,每次都會将資料攜帶在http請求中,過多儲存cookie則帶來性能問題,占用帶寬 localStorage和sessionStorage:資料不是由每個伺服器請求傳遞,而是隻有在請求時使用資料,而不參與伺服器的通訊

4、操作方法

cookie的操作方法較為複雜,需要單獨封裝setCookie、getCookie等方式設定與讀取緩存 localStorage和sessionStorage采用的是統一API進行操作,操作方法如下
getItem(key)擷取緩存
setItem(key,value)設定修改緩存
removeItem(key)移除單個緩存
clear()清空所有緩存           

經過對比,我們不難發現localStorage和sessionStorage相對cookie要優秀許多

舉個栗子:

在注冊登入子產品中,我們點選登入按鈕後請求後端接口,後端驗證賬号後一般會傳回使用者相關資訊,例如使用者名或者token等類型資料,而此類資料需要在項目中多個頁面使用。若每次都去發起http請求,肯定會增加伺服器壓力,那麼最好的方法則是将其通過緩存儲存下來,使用時直接通過浏覽器擷取
前端本地存儲方案,緩存存儲方案

我們通過以下代碼進行登入,當登入成功後将傳回的token采用sessionStorage進行存儲

loginDom.addEventListener('click', function () {
    //非空驗證
    if (!(telDom.value && pwdDom.value)) {
      common.toast('輸入的内容不能為空', false);
      return;
    }
    let postData = {
      account: telDom.value,
      password: pwdDom.value
    }

    // 調用登入接口
    axios.post('/api/user/login', postData).then(function (res) {
      // 判斷登入是否成功
      if (res.data.errno == 0) {
        common.toast('登入成功', true);

        // 将token寫入緩存
        sessionStorage.setItem('token', res.data.data.token);
        location.href = './index.html'
      } else {
        common.toast(res.data.message, false);
        telDom.value = '';
        pwdDom.value = '';
      }
    })           

在浏覽器控制台Application中即可檢視緩存是否存入

前端本地存儲方案,緩存存儲方案

而在後續需要使用的地方,則通過getItem擷取即可

if (sessionStorage.getItem('token')) {
  //擷取出存入的緩存
  let token = sessionStorage.getItem('token');
  axios.defaults.headers.common['Authorization'] = 'Bearer '+token;
}           

繼續閱讀