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 相关文章推荐
对textarea框的代码调试,而且功能上使用非常方便,酷
Jun 30 Javascript
JavaScript 常用函数库详解
Oct 21 Javascript
JavaScript继承方式实例
Oct 29 Javascript
Jquery对select的增、删、改、查操作
Feb 06 Javascript
jQuery实现高亮显示的方法
Mar 10 Javascript
基于JavaScript怎么实现让歌词滚动播放
Nov 03 Javascript
微信小程序开发之大转盘 仿天猫超市抽奖实例
Dec 08 Javascript
node.js中http模块和url模块的简单介绍
Oct 06 Javascript
JQuery通过后台获取数据遍历到前台的方法
Aug 13 jQuery
vue-router实现嵌套路由的讲解
Jan 19 Javascript
js实现随机div颜色位置 类似满天星效果
Oct 24 Javascript
JavaScript实现多个物体同时运动
Mar 12 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
yiic命令时提示“php.exe”不是内部或外部命令的解决方法
2014/12/18 PHP
php启用sphinx全文搜索的实现方法
2014/12/24 PHP
PHP中时间加减函数strtotime用法分析
2017/04/26 PHP
PHP程序员简单的开展服务治理架构操作详解(二)
2020/05/14 PHP
利用javascript移动div层-javascript 拖动层
2009/03/22 Javascript
js中将具有数字属性名的对象转换为数组
2011/03/06 Javascript
JS通过分析userAgent属性来判断浏览器的类型及版本
2014/03/28 Javascript
深入理解JQuery循环绑定事件
2016/06/02 Javascript
深入浅出 jQuery中的事件机制
2016/08/23 Javascript
微信小程序 引用其他js文件实现代码
2017/02/22 Javascript
详解如何将 Vue-cli 改造成支持多页面的 history 模式
2017/11/20 Javascript
layui实现多图片上传并限制上传的图片数量
2019/09/26 Javascript
在Vuex中Mutations修改状态操作
2020/07/24 Javascript
vue实现滚动鼠标滚轮切换页面
2020/12/13 Vue.js
[37:21]完美世界DOTA2联赛PWL S2 Inki vs Magma 第二场 11.22
2020/11/24 DOTA
[04:16]完美世界DOTA2联赛PWL S2 集锦第一期
2020/11/23 DOTA
Python 装饰器实现DRY(不重复代码)原则
2018/03/05 Python
Python使用numpy产生正态分布随机数的向量或矩阵操作示例
2018/08/22 Python
python面试题Python2.x和Python3.x的区别
2019/05/28 Python
Python OrderedDict的使用案例解析
2019/10/25 Python
keras 多gpu并行运行案例
2020/06/10 Python
python与idea的集成的实现
2020/11/20 Python
HTML5 History API 实现无刷新跳转
2016/01/11 HTML / CSS
HTML实现代码雨源码及效果示例
2020/02/25 HTML / CSS
Russell Stover巧克力官方网站:美国领先的精美巧克力制造商
2016/11/27 全球购物
汽车专业毕业生自荐信
2013/11/03 职场文书
秘书岗位职责
2013/11/18 职场文书
初一家长会邀请函
2014/01/31 职场文书
办公设备采购方案
2014/03/16 职场文书
说明书怎么写
2014/05/06 职场文书
信用社竞聘演讲稿
2014/05/16 职场文书
优秀应届毕业生自荐书
2014/06/29 职场文书
担保书范本
2015/01/20 职场文书
检讨书模板
2015/01/29 职场文书
国庆节慰问信
2015/02/15 职场文书
任命书格式范文
2015/09/22 职场文书