localstorage實(shí)現(xiàn)帶過期時(shí)間的緩存功能
前言
一般可以使用cookie,localstorage,sessionStorage來實(shí)現(xiàn)瀏覽器端的數(shù)據(jù)緩存,減少對(duì)服務(wù)器的請(qǐng)求。
1.cookie數(shù)據(jù)存放在本地硬盤中,只要在過期時(shí)間之前,都是有效的,即使重啟瀏覽器。但是會(huì)在每次HTTP請(qǐng)求中添加到請(qǐng)求頭中,如果數(shù)據(jù)過多,會(huì)造成性能問題。
2.sessionStorage保存在瀏覽器內(nèi)存中,當(dāng)關(guān)閉頁面或者瀏覽器之后,信息丟失。
3.localstorage也是保存在本地硬盤中,除非主動(dòng)清除,信息是不會(huì)消失的。但是實(shí)際使用時(shí)我們需要對(duì)緩存設(shè)置過期時(shí)間,本文便是講解如何為localstorage添加過期時(shí)間功能。
這三者僅支持同源(host+port)的數(shù)據(jù),不同源的數(shù)據(jù)不能互相訪問到。
localstorage
localstorage支持以下方法
- 保存數(shù)據(jù):localStorage.setItem(key,value);
- 讀取數(shù)據(jù):localStorage.getItem(key);
- 刪除單個(gè)數(shù)據(jù):localStorage.removeItem(key);
- 刪除所有數(shù)據(jù):localStorage.clear();
- 得到某個(gè)索引的key:localStorage.key(index);
需要注意的是,僅支持String類型數(shù)據(jù)的讀取,如果存放的是數(shù)值類型,讀出來的是字符串類型的,對(duì)于存儲(chǔ)對(duì)象類型的,需要在保存之前JSON化為String類型。
對(duì)于緩存,我們一般有以下方法
set(key,value,expiredTime); get(key); remove(key); expired(key,expiredTime); clear();
實(shí)現(xiàn)
設(shè)置緩存
對(duì)于過期時(shí)間的實(shí)現(xiàn),除了用于存放原始值的緩存(key),這里添加了兩個(gè)緩存(key+EXPIRED:TIME)和(key+EXPIRED:START:TIME),一個(gè)用于存放過期時(shí)間,一個(gè)用于存放緩存設(shè)置時(shí)的時(shí)間。
當(dāng)讀取的時(shí)候比較 (過期時(shí)間+設(shè)置緩存的時(shí)間)和當(dāng)前的時(shí)間做對(duì)比。如果(過期時(shí)間+設(shè)置緩存時(shí)的時(shí)間)大于當(dāng)前的時(shí)間,則說明緩存沒過期。
注意這里使用JSON.stringify
對(duì)存入的對(duì)象JSON化。讀取的時(shí)候也要轉(zhuǎn)回原始對(duì)象。
"key":{ //輔助 "expiredTime": "EXPIRED:TIME", "expiredStartTime": "EXPIRED:START:TIME", //全局使用 //用戶信息 "loginUserInfo": "USER:INFO", //搜索字段 "searchString": "SEARCH:STRING", }, /** * 設(shè)置緩存 * @param key * @param value * @param expiredTimeMS 過期時(shí)間,單位ms */ "set":function (key,value,expiredTimeMS) { if((expiredTimeMS == 0 ) || (expiredTimeMS == null)){ localStorage.setItem(key,value); } else { localStorage.setItem(key,JSON.stringify(value)); localStorage.setItem(key+cache.key.expiredTime,expiredTimeMS); localStorage.setItem(key+cache.key.expiredStartTime,new Date().getTime()); } },
讀取緩存
由于讀取出來的是時(shí)間信息是字符串,需要將其轉(zhuǎn)化為數(shù)字再進(jìn)行比較。
/** * 獲取鍵 * @param key * @returns {*} key存在,返回對(duì)象;不存在,返回null */ "get":function (key) { var expiredTimeMS = localStorage.getItem(key+cache.key.expiredTime); var expiredStartTime = localStorage.getItem(key+cache.key.expiredStartTime); var curTime = new Date().getTime(); var sum = Number(expiredStartTime) + Number(expiredTimeMS); if((sum) > curTime){ console.log("cache-緩存["+key+"]存在!"); return JSON.parse(localStorage.getItem(key)); } else { console.log("cache-緩存["+key+"]不存在!"); return null; } },
移除緩存
移除緩存時(shí)需要把三個(gè)鍵同時(shí)移除。
/** * 移除鍵 * @param key */ "remove":function (key) { localStorage.removeItem(key); localStorage.removeItem(key+cache.key.expiredTime); localStorage.removeItem(key+cache.key.expiredStartTime); },
其他代碼
/** * 對(duì)鍵重新更新過期時(shí)間 * @param key * @param expiredTimeMS 過期時(shí)間ms */ "expired":function (key,expiredTimeMS) { if(cache.get(key)!=null){ localStorage.setItem(key+cache.key.expiredTime,expiredTimeMS); } }, /** * 清除所有緩存 */ "clear":function () { localStorage.clear(); }
總結(jié)
以上所述是小編給大家介紹的localstorage實(shí)現(xiàn)帶過期時(shí)間的緩存功能,希望對(duì)大家有所幫助如果大家有任何疑問歡迎給我留言,小編會(huì)及時(shí)回復(fù)大家的!
相關(guān)文章
簡(jiǎn)單實(shí)用的反饋表單無刷新提交帶驗(yàn)證
表單無刷新提交帶驗(yàn)證,非常適用于反饋,具體的實(shí)現(xiàn)如下包含各個(gè)功能代碼,喜歡的朋友可以參考下2013-11-11深入理解JavaScript系列(9) 根本沒有“JSON對(duì)象”這回事!
寫這篇文章的目的是經(jīng)常看到開發(fā)人員說:把字符串轉(zhuǎn)化為JSON對(duì)象,把JSON對(duì)象轉(zhuǎn)化成字符串等類似的話題,所以把之前收藏的一篇老外的文章整理翻譯了一下,供大家討論,如有錯(cuò)誤,請(qǐng)大家指出,多謝2012-01-01限制復(fù)選框最多選擇項(xiàng)的實(shí)現(xiàn)代碼
下面小編就為大家?guī)硪黄拗茝?fù)選框最多選擇項(xiàng)的實(shí)現(xiàn)代碼。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-05-05js+CSS實(shí)現(xiàn)模擬華麗的select控件下拉菜單效果
這篇文章主要介紹了js+CSS模擬select控件下拉菜單效果,通過javascript鼠標(biāo)事件結(jié)合css控制實(shí)現(xiàn)select下拉菜單效果,整體效果華麗美觀,需要的朋友可以參考下2015-09-09JavaScript實(shí)現(xiàn)連連看連線算法
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)連連看連線算法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-01-01驗(yàn)證javascript中Object和Function的關(guān)系的三段簡(jiǎn)單代碼
今天重溫經(jīng)典書籍。這一次看的是博客園李戰(zhàn)老師寫的<<悟透JavaScript>>,也是被樓豬翻看最多的技術(shù)書籍之一。2010-06-06JavaScript為事件句柄綁定監(jiān)聽函數(shù)實(shí)例詳解
這篇文章主要介紹了JavaScript為事件句柄綁定監(jiān)聽函數(shù)的方法,結(jié)合實(shí)例詳細(xì)分析了常見的事件句柄綁定監(jiān)聽函數(shù)的實(shí)現(xiàn)技巧,并實(shí)例講解了跨瀏覽器的實(shí)現(xiàn)方法,需要的朋友可以參考下2015-12-12JXTree對(duì)象,讀取外部xml文件數(shù)據(jù),生成樹的函數(shù)
JXTree對(duì)象,讀取外部xml文件數(shù)據(jù),生成樹的函數(shù)...2007-04-04