localstorage实现带过期时间的缓存功能
前言
一般可以使用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实现带过期时间的缓存功能的更多相关文章
- java实现带过期时间的缓存
private static ScheduledExecutorService swapExpiredPool = new ScheduledThreadPoolExecutor(10); priva ...
- 如何给localStorage设置一个过期时间?
原文:如何给localStorage设置一个过期时间? 作者:苏南 - 首席填坑官 公众号:IT平头哥联盟 Fundebug经授权转载,版权归原作者所有. 引言 这个话题其实在上次分享已经讲过(大佬可 ...
- IIS使用十大原则,(IIS过期时间,IIS缓存设置) 【转载】
1. 自定义错误页虽然自定义错误页很简单,但只有少数管理员有效地利用了它.管理员可以在MMC中将HTTP错误信息映像到服务器上的绝对URL或是某个文件,更为详细的信息可以在这里找到.如果你嫌这太麻烦, ...
- redis 过期时间与缓存
设置过期时间 redis对于存储的键值可以设置过期时间,对于过期了的键值,redis会自动删除. > OK > get price " > expire price (in ...
- Redis -- 过期时间 和 缓存 例子
1.设置 key的生存时间,过期自动删除 exprire key seconds 设置过期时间 秒数 ttl key 查询剩余时间 如果 设置了过期时间.对key进行 set 操作,会清除 ...
- [置顶] 页面缓存,cache,设置缓存过期时间,OutputCache
页面缓存 方法一: protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { //缓存有数据 if (Cach ...
- 阿里面试官让我实现一个线程安全并且可以设置过期时间的LRU缓存,我蒙了!
目录 1. LRU 缓存介绍 2. ConcurrentLinkedQueue简单介绍 3. ReadWriteLock简单介绍 4.ScheduledExecutorService 简单介绍 5. ...
- 利用GUID唯一标识符并设置它的过期时间
项目中遇到一个小问题,就是把服务器创建的GUID发送给客户端,客户端接收后,下次访问时带上这个GUID, 服务端这边就进行验证,并做相应的处理. 问题是:项目中还需要这个GUID带过期时间,那是如何设 ...
- 老司机带你玩转面试(2):Redis 过期策略以及缓存雪崩、击穿、穿透
前文回顾 建议前一篇文章没看过的同学先看下前面的文章: 「老司机带你玩转面试(1):缓存中间件 Redis 基础知识以及数据持久化」 过期策略 Redis 的过期策略都有哪些? 在聊这个问题之前,一定 ...
随机推荐
- npm与cnpm混用导致的问题
npm和cnpm混用之后,再用npm升级模块导致如下错误: 解决办法: 删除node_modules文件下的文件后,重新执行npm install
- C#委托五(自定义事件)
事件: "在发生其他类或对象关注的事情时,类或对象可以通过事件通知他们.发送(或引发)事件的类称为"发行者",接受(或处理)事件的类称为"订户".&q ...
- cocos2dx-3.1加入cocosStudio参考库 libCocosStudio
一个,创建好项目 两,在"解(项目名称)".选择现有项目 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2dzbHVja3k=/fon ...
- modern-cpp-features
C++17/14/11 Overview Many of these descriptions and examples come from various resources (see Acknow ...
- FFmpeg来源简单分析:结构会员管理系统-AVClass
===================================================== FFmpeg章列表: [架构图] FFmpeg源码结构图 - 解码 FFmpeg源码结构图 ...
- hibernate关于一对一注解配置
注解(Annotation),也叫元数据.一种代码级别的说明.它是JDK1.5及以后版本引入的一个特性,与类.接口.枚举是在同一个层次.它可以声明在包.类.字段.方法.局部变量.方法参数等的前面,用来 ...
- Linux之tail命令实时收集[纠正误解]
tail [OPTION]... [FILE]... -c, --bytes=K output the last K bytes; alternatively, use -c + ...
- WPF特效-粒子动画
原文:WPF特效-粒子动画 WPF实现泡泡龙小游戏效果. /// -Ball to Ball Collision - Detection and Handling /// http:// ...
- 【Unity】贝塞尔曲线关于点、长度、切线计算在 Unity中的C#实现
原文:[Unity]贝塞尔曲线关于点.长度.切线计算在 Unity中的C#实现 写在前面 最近给项目做了个路径编辑,基本思路是满足几个基本需求: [额外说明]其实本篇和这个没关系,可以跳过" ...
- 详解 Java 8 HashMap 实现原理
HashMap 是 Java 开发过程中常用的工具类之一,也是面试过程中常问的内容,此篇文件通过作者自己的理解和网上众多资料对其进行一个解析.作者本地的 JDK 版本为 64 位的 1.8.0_171 ...