视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
localstorage实现带过期时间的缓存功能
2020-11-27 21:54:12 责编:小采
文档


前言

一般可以使用cookie,localstorage,sessionStorage来实现浏览器端的数据缓存,减少对服务器的请求。

1.cookie数据存放在本地硬盘中,只要在过期时间之前,都是有效的,即使重启浏览器。但是会在每次HTTP请求中添加到请求头中,如果数据过多,会造成性能问题。

2.sessionStorage保存在浏览器内存中,当关闭页面或者浏览器之后,信息丢失。

3.localstorage也是保存在本地硬盘中,除非主动清除,信息是不会消失的。但是实际使用时我们需要对缓存设置过期时间,本文便是讲解如何为localstorage添加过期时间功能。

这三者仅支持同源(host+port)的数据,不同源的数据不能互相访问到。

localstorage

localstorage支持以下方法

  • 保存数据:localStorage.setItem(key,value);
  • 读取数据:localStorage.getItem(key);
  • 删除单个数据:localStorage.removeItem(key);
  • 删除所有数据:localStorage.clear();
  • 得到某个索引的key:localStorage.key(index);  
  • 需要注意的是,仅支持String类型数据的读取,如果存放的是数值类型,读出来的是字符串类型的,对于存储对象类型的,需要在保存之前JSON化为String类型。

    对于缓存,我们一般有以下方法

    set(key,value,expiredTime);
    get(key);
    remove(key);
    expired(key,expiredTime);
    clear(); 

    实现

    设置缓存

    对于过期时间的实现,除了用于存放原始值的缓存(key),这里添加了两个缓存(key+EXPIRED:TIME)和(key+EXPIRED:START:TIME),一个用于存放过期时间,一个用于存放缓存设置时的时间。

    当读取的时候比较 (过期时间+设置缓存的时间)和当前的时间做对比。如果(过期时间+设置缓存时的时间)大于当前的时间,则说明缓存没过期。

    注意这里使用JSON.stringify对存入的对象JSON化。读取的时候也要转回原始对象。

    "key":{
     //辅助
     "expiredTime": "EXPIRED:TIME",
     "expiredStartTime": "EXPIRED:START:TIME",
     //全局使用
     //用户信息
     "loginUserInfo": "USER:INFO",
     //搜索字段
     "searchString": "SEARCH:STRING",
     },
     /**
     * 设置缓存
     * @param key
     * @param value
     * @param expiredTimeMS 过期时间,单位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());
     }
     },

     读取缓存

    由于读取出来的是时间信息是字符串,需要将其转化为数字再进行比较。

    /**
     * 获取键
     * @param key
     * @returns {*} key存在,返回对象;不存在,返回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;
     }
     },

    移除缓存

    移除缓存时需要把三个键同时移除。

    /**
     * 移除键
     * @param key
     */
     "remove":function (key) {
     localStorage.removeItem(key);
     localStorage.removeItem(key+cache.key.expiredTime);
     localStorage.removeItem(key+cache.key.expiredStartTime);
     },

    其他代码

    /**
     * 对键重新更新过期时间
     * @param key
     * @param expiredTimeMS 过期时间ms
     */
     "expired":function (key,expiredTimeMS) {
    
     if(cache.get(key)!=null){
     localStorage.setItem(key+cache.key.expiredTime,expiredTimeMS);
     }
    
     },
     /**
     * 清除所有缓存
     */
     "clear":function () {
     localStorage.clear();
     }

    总结

    以上所述是小编给大家介绍的localstorage实现带过期时间的缓存功能,希望对大家有所帮助如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

    下载本文
    显示全文
    专题