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 相关文章推荐
jQuery源码分析之Event事件分析
Jun 07 Javascript
基于jquery的滚动鼠标放大缩小图片效果
Oct 27 Javascript
jquery插件unobtrusive实现片段式加载
Jun 15 Javascript
js焦点文字滚动效果代码分享
Aug 25 Javascript
jquery实现仿Flash的横向滑动菜单效果代码
Sep 17 Javascript
jQuery实现图片预加载效果
Nov 27 Javascript
angular.js指令中的controller、compile与link函数的不同之处
May 10 Javascript
vue绑定设置属性的多种方式(5)
Aug 16 Javascript
对于input 框限定输入值为浮点型的js代码
Sep 25 Javascript
nuxt+axios实现打包后动态修改请求地址的方法
Apr 22 Javascript
原生JS实现京东查看商品点击放大
Dec 21 Javascript
使用 JavaScript 制作页面效果
Apr 21 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
Discuz 5.0 中读取纯真IP数据库函数分析
2007/03/16 PHP
PHP 变量定义和变量替换的方法
2009/07/30 PHP
Linux下将excel数据导入到mssql数据库中的方法
2010/02/08 PHP
php实现mysql数据库操作类分享
2014/02/14 PHP
php实现读取内存顺序号
2015/03/29 PHP
vmware linux系统安装最新的php7图解
2019/04/14 PHP
javascript当onmousedown、onmouseup、onclick同时应用于同一个标签节点Element
2010/01/05 Javascript
document.getElementById为空或不是对象的解决方法
2010/01/24 Javascript
用dtree实现树形菜单 dtree使用说明
2011/10/17 Javascript
js获取当前月的第一天和最后一天的小例子
2013/11/18 Javascript
捕获和分析JavaScript Error的方法
2014/03/25 Javascript
javascript的BOM汇总
2015/07/16 Javascript
JS实现上下左右对称的九九乘法表
2016/02/22 Javascript
jQuery解决input元素的blur事件和其他非表单元素的click事件冲突问题
2016/08/15 Javascript
基于jQuery的select下拉框选择触发事件实例分析
2016/11/18 Javascript
jQuery纵向导航菜单效果实现方法
2016/12/19 Javascript
基于jQuery Easyui实现登陆框界面
2017/07/10 jQuery
vuejs父子组件之间数据交互详解
2017/08/09 Javascript
详解ES6 Promise对象then方法链式调用
2018/10/20 Javascript
详解vue实现坐标拾取器功能示例
2020/11/18 Vue.js
python+selenium识别验证码并登录的示例代码
2017/12/21 Python
css3实现简单的白云飘动背景特效
2020/10/28 HTML / CSS
美国班级戒指、帽子和礼服、毕业产品、年鉴:Balfour
2018/11/01 全球购物
获取邓白氏信用报告:Dun & Bradstreet
2019/01/22 全球购物
璀璨的珍珠、密钉和个性化珠宝:Lily & Roo
2021/01/21 全球购物
幼儿园园长自我鉴定
2013/10/22 职场文书
企业总经理职责
2014/02/02 职场文书
文化活动实施方案
2014/03/28 职场文书
不拖欠农民工工资承诺书
2014/03/31 职场文书
服务型党组织建设典型材料
2014/05/07 职场文书
药店收银员岗位职责
2015/04/07 职场文书
学校标语口号大全
2015/12/26 职场文书
MySQL 5.7常见数据类型
2021/07/15 MySQL
聊聊Lombok中的@Builder注解使用教程
2021/11/17 Java/Android
JVM之方法返回地址详解
2022/02/28 Java/Android
win10忘记pin密码登录不了怎么办?win10忘记pin密码登不进去的解决方法
2022/07/07 数码科技