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 相关文章推荐
Js 刷新框架页的代码
Apr 13 Javascript
myEvent.js javascript跨浏览器事件框架
Oct 24 Javascript
jQuery实现渐变弹出层和弹出菜单的方法
Feb 20 Javascript
jQuery中slideUp 和 slideDown 的点击事件
Feb 26 Javascript
Javascript aop(面向切面编程)之around(环绕)分析
May 01 Javascript
关于session和cookie的简单理解
Jun 08 Javascript
浅谈jQuery hover(over, out)事件函数
Dec 03 Javascript
通过vue写一个瀑布流插件代码实例
Sep 07 Javascript
微信小程序页面调用自定义组件内的事件详解
Sep 12 Javascript
Vue组件通信入门之Provide和Inject机制
Dec 29 Javascript
Vue 实现创建全局组件,并且使用Vue.use() 载入方式
Aug 11 Javascript
vue 使用class创建和清除水印的示例代码
Dec 25 Vue.js
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
PHP实现手机归属地查询API接口实现代码
2012/08/27 PHP
深入理解require与require_once与include以及include_once的区别
2013/06/05 PHP
thinkphp 一个页面使用2次分页的实现方法
2013/07/15 PHP
php中filter函数验证、过滤用户输入的数据
2014/01/13 PHP
从零开始学YII2框架(四)扩展插件yii2-kartikgii
2014/08/20 PHP
PHP结合jquery ajax实现上传多张图片,并限制图片大小操作示例
2019/03/01 PHP
TP5框架实现上传多张图片的方法分析
2020/03/29 PHP
一直复略了的一个问题,关于表单重复提交
2007/02/15 Javascript
js event事件的传递与冒泡处理
2009/12/06 Javascript
javascript工具库代码
2012/03/29 Javascript
JavaScript程序开发之JS代码放置的位置
2016/01/15 Javascript
JavaScript判断数组重复内容的两种方法(推荐)
2016/06/06 Javascript
浅谈json取值(对象和数组)
2016/06/24 Javascript
js获取上传文件的绝对路径实现方法
2016/08/02 Javascript
jQuery Autocomplete简介_动力节点Java学院整理
2017/07/17 jQuery
vue2.0在table中实现全选和反选的示例代码
2017/11/04 Javascript
Angular整合zTree的示例代码
2018/01/24 Javascript
详解jQuery获取特殊属性的值以及设置内容
2018/11/14 jQuery
详解VUE里子组件如何获取父组件动态变化的值
2018/12/26 Javascript
JS实现排行榜文字向上滚动轮播效果
2019/11/26 Javascript
[49:54]Ti4 循环赛第三日 LGD vs Titan
2014/07/12 DOTA
[00:37]食人魔魔法师轮盘吉兆顺应全新至宝将拥有额外款式
2019/12/19 DOTA
Python实现删除Android工程中的冗余字符串
2015/01/19 Python
微信跳一跳游戏python脚本
2020/04/01 Python
浅析python表达式4+0.5值的数据类型
2020/02/26 Python
python使用smtplib模块发送邮件
2020/12/17 Python
美国伴娘礼服商店:Evening Collective
2019/10/07 全球购物
利物浦足球俱乐部官方商店(美国):Liverpool FC US
2019/10/09 全球购物
UNIX命令速查表
2012/03/10 面试题
酒吧副总经理岗位职责
2013/12/10 职场文书
入党积极分子介绍信
2014/01/17 职场文书
投资意向书范本
2014/04/01 职场文书
建材投资建议书
2014/05/16 职场文书
感恩母亲节活动总结
2015/02/10 职场文书
2016年小学生新年寄语
2015/08/18 职场文书
spring 项目实现限流方法示例
2022/07/15 Java/Android