localstorage实现带过期时间的缓存功能


Posted in Javascript onJune 28, 2019

前言

一般可以使用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实现带过期时间的缓存功能,希望对大家有所帮助如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

Javascript 相关文章推荐
解析prototype,JQuery中跳出each循环的方法
Dec 12 Javascript
jquery scroll()区分横向纵向滚动条的方法
Apr 04 Javascript
使用JavaScript获取地址栏参数的方法
Dec 19 Javascript
JavaScript三元运算符的多种使用技巧
Apr 16 Javascript
jQuery内容折叠效果插件用法实例分析(附demo源码)
Apr 28 Javascript
js正则表达式replace替换变量方法
May 21 Javascript
一个仿微博登陆邮箱提示框js开发案例
Jul 28 Javascript
使用jQuery的ajax方法向服务器发出get和post请求的方法
Jan 13 Javascript
Vue组件Draggable实现拖拽功能
Dec 01 Javascript
微信小程序如何自定义table组件
Jun 29 Javascript
详解如何在Javascript和Sass之间共享变量
Nov 13 Javascript
利用uni-app生成微信小程序的踩坑记录
Apr 05 Javascript
vue分页器组件编写方法详解
Jun 28 #Javascript
Vue分页器实现原理详解
Jun 28 #Javascript
vue实现分页栏效果
Jun 28 #Javascript
js实现简单分页导航栏效果
Jun 28 #Javascript
elementUi vue el-radio 监听选中变化的实例代码
Jun 28 #Javascript
vue实现Excel文件的上传与下载功能的两种方式
Jun 28 #Javascript
开发中常用的25个JavaScript单行代码(小结)
Jun 28 #Javascript
You might like
让你的WINDOWS同时支持MYSQL4,MYSQL4.1,MYSQL5X
2006/12/06 PHP
php伪静态之APACHE篇
2014/06/02 PHP
PHP动态编译出现Cannot find autoconf的解决方法
2014/11/05 PHP
php实现短信发送代码
2015/07/05 PHP
Thinkphp自定义代码生成工具及用法说明(附下载地址)
2016/05/27 PHP
微信公众号开发客服接口实例代码
2016/10/21 PHP
PHP使用gearman进行异步的邮件或短信发送操作详解
2020/02/27 PHP
javascript 类型判断代码分析
2010/03/28 Javascript
javascript中处理时间戳为日期格式的方法
2014/01/02 Javascript
SeaJS入门教程系列之完整示例(三)
2014/03/03 Javascript
使用jquery.validate自定义方法实现"手机号码或者固话至少填写一个"的逻辑验证
2014/09/01 Javascript
javascript判断并获取注册表中可信任站点的方法
2015/06/01 Javascript
jQuery获取URL请求参数的方法
2015/07/18 Javascript
Vue使用mixins实现压缩图片代码
2018/03/14 Javascript
vue实现分页的三种效果
2020/06/23 Javascript
Vue项目配置跨域访问和代理proxy设置方式
2020/09/08 Javascript
matlab中实现矩阵删除一行或一列的方法
2018/04/04 Python
对pytorch网络层结构的数组化详解
2018/12/08 Python
BP神经网络原理及Python实现代码
2018/12/18 Python
Python openpyxl模块原理及用法解析
2020/01/19 Python
python判断一个变量是否已经设置的方法
2020/08/13 Python
Pycharm自动添加文件头注释和函数注释参数的方法
2020/10/23 Python
Python ellipsis 的用法详解
2020/11/20 Python
Python3.9最新版下载与安装图文教程详解(Windows系统为例)
2020/11/28 Python
Python扫描端口的实现
2021/01/25 Python
css3中仿放大镜效果的几种方式原理解析
2020/12/03 HTML / CSS
Zooplus葡萄牙:欧洲领先的网上宠物商店
2018/07/01 全球购物
美国家居装饰店:Pier 1
2019/09/04 全球购物
后勤自我鉴定
2013/10/13 职场文书
元旦联欢会感言
2014/03/04 职场文书
法人授权委托书
2014/04/03 职场文书
2015年父亲节活动总结
2015/02/12 职场文书
金陵十三钗观后感
2015/06/04 职场文书
2015年暑期社会实践方案
2015/07/14 职场文书
护士业务学习心得体会
2016/01/25 职场文书
Python利用Turtle绘制哆啦A梦和小猪佩奇
2022/04/04 Python