本文介绍如何利用localStorage实现带过期时间的缓存功能。通过对比Cookie和SessionStorage,分析localStorage的优势与局限。详细讲解在保存、读取和移除数据时,如何通过额外存储时间戳来管理缓存有效期,并提供完整的JavaScript实现代码,帮助开发者优化前端数据缓存策略。
前言与存储方式对比
前言
在浏览器端实现数据缓存,通常可选用Cookie、localStorage或sessionStorage,主要目的是降低对服务器的请求频率。
Cookie数据存储在本地硬盘中,只要在设定的过期时间之前,即使重启浏览器也能保持有效。然而,Cookie会在每次HTTP请求中自动附加到请求头里,如果数据量过大,可能会引发性能问题。
sessionStorage将数据保存在浏览器内存中,一旦页面关闭或浏览器退出,其中的信息便会丢失。
localStorage同样将数据保存在本地硬盘中,除非用户主动清除,否则信息不会消失。但在实际应用中,往往需要为缓存设置过期时间,本文将重点讲解如何为localStorage添加这一功能。
这三种存储方式均仅支持同源(主机名+端口号)的数据访问,不同源的数据无法相互读取。
localStorage基础操作
localStorage
localStorage支持以下操作方法:
- 保存数据:使用localStorage.setItem(key, value);
- 读取数据:使用localStorage.getItem(key);
- 删除单个数据:使用localStorage.removeItem(key);
- 删除所有数据:使用localStorage.clear();
- 获取指定索引的key:使用localStorage.key(index);
需要注意的是,localStorage仅支持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());
}
},
读取缓存
由于从localStorage读取出的时间信息是字符串格式,需要将其转换为数字后再进行比较。
/**
* 获取键
* @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实现带过期时间缓存功能的方法,希望对大家有所帮助。如果大家有任何疑问,欢迎留言,小编会及时回复大家!