JavaScript 实现带过期时间的数据缓存方案
作者:性能诊所时间:2026-10-31 18:02:35浏览:502
本文介绍在 JavaScript 中实现支持过期时间的数据缓存功能。通过对比 localStorage、sessionStorage 和内存对象(Map)三种方案,详细讲解了各自的实现原理、注意事项及适用场景。文章提供了完整的代码示例,帮助开发者根据持久性、共享性和性能需求选择合适的缓存策略,并包含一个特性对比表以供参考。
在 JavaScript 中构建具备过期机制的数据缓存,可借助 localStorage、sessionStorage 或内存容器(如 Map 及常规对象)保存数据,并为各缓存条目配置失效时间。下面提供一个基础实现范例:
JavaScript 构建支持失效时间的数据缓存方案
1. 基于 localStorage 构建持久化缓存
const Cache = {
/**
* 设置缓存
* @param {string} key - 缓存键
* @param {*} value - 缓存值
* @param {number} ttl - 缓存时间(毫秒)
*/
set(key, value, ttl) {
const data = {
value,
expiry: ttl ? Date.now() + ttl : null, // 计算过期时间
};
localStorage.setItem(key, JSON.stringify(data));
},
/**
* 获取缓存
* @param {string} key - 缓存键
* @returns {*} 缓存值或 null(如果过期或不存在)
*/
get(key) {
const data = localStorage.getItem(key);
if (!data) return null;
try {
const { value, expiry } = JSON.parse(data);
if (expiry && Date.now() > expiry) {
localStorage.removeItem(key); // 过期删除缓存
return null;
}
return value;
} catch (e) {
console.warn("缓存数据解析失败", e);
return null;
}
},
/**
* 删除缓存
* @param {string} key - 缓存键
*/
remove(key) {
localStorage.removeItem(key);
},
/**
* 清空所有缓存
*/
clear() {
localStorage.clear();
},
};
// 使用示例
Cache.set("username", "Alice", 5000); // 设置缓存5秒后过期
console.log(Cache.get("username")); // 5秒内返回 'Alice'
setTimeout(() => console.log(Cache.get("username")), 6000); // 6秒后返回 null关键注意点
localStorage仅支持字符串存储,故需运用JSON.stringify与JSON.parse执行序列化及反序列化操作。localStorage的存储容量通常受限(约 5MB)。- 若需跨页面访问,务必保证处于同一域名环境。
2. 基于 sessionStorage 构建数据缓存(适用于页面级临时存储)
sessionStorage 属于一种浏览器存储机制,其核心特征在于数据仅在页面会话(session)存续期间有效,一旦页面关闭则数据自动清除。
const SessionCache = {
/**
* 设置缓存
* @param {string} key - 缓存键
* @param {*} value - 缓存值
* @param {number} ttl - 缓存时间(毫秒)
*/
set(key, value, ttl) {
const data = {
value,
expiry: ttl ? Date.now() + ttl : null, // 计算过期时间
};
sessionStorage.setItem(key, JSON.stringify(data));
},
/**
* 获取缓存
* @param {string} key - 缓存键
* @returns {*} 缓存值或 null(如果过期或不存在)
*/
get(key) {
const data = sessionStorage.getItem(key);
if (!data) return null;
try {
const { value, expiry } = JSON.parse(data);
if (expiry && Date.now() > expiry) {
sessionStorage.removeItem(key); // 缓存已过期,删除
return null;
}
return value;
} catch (e) {
console.warn("缓存数据解析失败:", e);
return null;
}
},
/**
* 删除缓存
* @param {string} key - 缓存键
*/
remove(key) {
sessionStorage.removeItem(key);
},
/**
* 清空所有缓存
*/
clear() {
sessionStorage.clear();
},
};
// **使用示例**
// 设置缓存,5秒后过期
SessionCache.set("userToken", "abc123", 5000);
// 获取缓存
console.log(SessionCache.get("userToken")); // 5秒内返回 'abc123'
// 5秒后尝试获取缓存
setTimeout(() => {
console.log(SessionCache.get("userToken")); // 返回 null
}, 6000);关键注意点
sessionStorage数据会在页面关闭或会话终止时自动清除。- 在不同标签页中,
sessionStorage相互独立(不共享数据)。 sessionStorage的存储容量通常约为 5MB。- 数据存入
sessionStorage前必须经过JSON.stringify与JSON.parse处理。
3. 基于内存对象构建轻量级缓存(适用于短期缓存)
class MemoryCache {
constructor() {
this.cache = new Map();
}
/**
* 设置缓存
* @param {string} key - 缓存键
* @param {*} value - 缓存值
* @param {number} ttl - 缓存时间(毫秒)
*/
set(key, value, ttl) {
const expiry = ttl ? Date.now() + ttl : null;
this.cache.set(key, { value, expiry });
}
/**
* 获取缓存
* @param {string} key - 缓存键
* @returns {*} 缓存值或 null(如果过期或不存在)
*/
get(key) {
const item = this.cache.get(key);
if (!item) return null;
if (item.expiry && Date.now() > item.expiry) {
this.cache.delete(key); // 缓存过期,删除
return null;
}
return item.value;
}
/**
* 删除缓存
* @param {string} key - 缓存键
*/
remove(key) {
this.cache.delete(key);
}
/**
* 清空所有缓存
*/
clear() {
this.cache.clear();
}
}
// 使用示例
const memCache = new MemoryCache();
memCache.set("token", "abc123", 3000); // 设置缓存3秒后过期
console.log(memCache.get("token")); // 3秒内返回 'abc123'
setTimeout(() => console.log(memCache.get("token")), 4000); // 4秒后返回 null三种方案对比分析
| 特性 | localStorage | sessionStorage | 内存缓存 (Map) |
|---|---|---|---|
| 持久性 | 持久存储,页面刷新或关闭后仍保留 | 页面会话结束(即关闭页面)时丢失 | 页面刷新后丢失 |
| 共享性 | 同一域名下所有页面共享 | 仅当前标签页可用 | 仅当前标签页可用 |
| 性能 | 读取稍慢(I/O 操作) | 读取稍慢(I/O 操作) | 更快(内存存取) |
| 适用场景 | 长期存储、页面级数据 | 临时存储页面状态、会话数据 | 短期存储、临时数据 |
| 存储大小限制 | 约 5MB | 约 5MB | 取决于可用内存 |
至此,关于 JavaScript 构建支持失效时间的数据缓存方案的介绍已完毕,更多相关 JavaScript 数据缓存内容请查阅本站往期文章或继续浏览下方相关文章,希望大家日后多多支持本站!
作者最新文章
JS数组查找性能对比:find、some与includes该选谁
2026-11-05 17:48:00
怎么优化 React 应用性能?避免不必要的重渲染
2026-11-05 12:43:40
怎么利用 Nuxt.js useHead 优化 SEO 与元数据管理
2026-11-05 10:37:58
JS混淆常见手段解析:字符串加密与控制流平坦化还原思路
2026-11-04 19:07:42
JavaScript能在浏览器中直接获取MAC地址吗
2026-11-03 20:34:17
