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提交参数创建form表单在FireFox中遇到的问题
Jan 16 Javascript
验证手机号码的JS方法分享
Sep 10 Javascript
js转义字符介绍
Nov 05 Javascript
使用JavaScript获取电池状态的方法
May 03 Javascript
jQuery绑定事件on()与弹窗的简要概述
Apr 27 Javascript
微信小程序上滑加载下拉刷新(onscrollLower)分批加载数据(二)
May 11 Javascript
vue单个组件实现无限层级多选菜单功能
Apr 10 Javascript
Vue表单输入绑定的示例代码
Nov 01 Javascript
webpack4.x CommonJS模块化浅析
Nov 09 Javascript
详解VUE里子组件如何获取父组件动态变化的值
Dec 26 Javascript
js判断鼠标移入移出方向的方法
Jun 24 Javascript
js+html+css实现手动轮播和自动轮播
Dec 30 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
PHP的FTP学习(一)
2006/10/09 PHP
PHP array_push 数组函数
2009/12/26 PHP
Laravel 5.0 发布 新版本特性详解
2015/02/10 PHP
浅谈PDO的rowCount函数
2015/06/18 PHP
浅谈PHP的数据库接口和技术
2016/12/09 PHP
PHP中危险的file_put_contents函数详解
2017/11/04 PHP
jquery 字符串切割函数substring的用法说明
2014/02/11 Javascript
详解JavaScript基于面向对象之继承
2015/12/13 Javascript
jQuery动态添加及删除表单上传元素的方法(附demo源码下载)
2016/01/15 Javascript
AngularJS模块学习之Anchor Scroll
2016/01/19 Javascript
Vue.js组件tree实现无限级树形菜单
2016/12/02 Javascript
js实现带缓动动画的导航栏效果
2017/01/16 Javascript
angularJS之$http:与服务器交互示例
2017/03/17 Javascript
JavaScript学习总结之正则的元字符和一些简单的应用
2017/06/30 Javascript
vue.js 添加 fastclick的支持方法
2018/08/28 Javascript
ant design中upload组件上传大文件,显示进度条进度的实例
2020/10/29 Javascript
Python日志模块logging简介
2015/04/13 Python
浅析Python基础-流程控制
2016/03/18 Python
Python脚本实时处理log文件的方法
2016/11/21 Python
python解决汉字编码问题:Unicode Decode Error
2017/01/19 Python
Django REST为文件属性输出完整URL的方法
2017/12/18 Python
取numpy数组的某几行某几列方法
2018/04/03 Python
python 字符串的驻留机制及优缺点
2020/06/19 Python
使用css3实现超炫的loading加载动画效果
2014/05/07 HTML / CSS
不可轻视HTML5!App三年内将被html5顶替彻底消失
2015/11/18 HTML / CSS
挪威太阳镜和眼镜网上商城:SmartBuyGlasses挪威
2016/08/20 全球购物
专科毕业生自我鉴定
2013/12/01 职场文书
办理护照介绍信
2014/01/16 职场文书
化学教学随笔感言
2014/02/19 职场文书
分公司任命书
2014/06/06 职场文书
大学毕业生个人自荐书
2014/07/02 职场文书
个人工作年终总结
2015/03/09 职场文书
论文致谢词范文
2015/05/14 职场文书
python实现图片批量压缩
2021/04/24 Python
浅谈Python 中的复数问题
2021/05/19 Python
如何创建一个创建MySQL数据库中的datetime类型
2022/03/21 MySQL