要在 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数据缓存内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
来源链接:https://www.jb51.net/javascript/333786l7i.htm
© 版权声明
本站所有资源来自于网络,仅供学习与参考,请勿用于商业用途,否则产生的一切后果将由您(转载者)自己承担!
如有侵犯您的版权,请及时联系3500663466#qq.com(#换@),我们将第一时间删除本站数据。
如有侵犯您的版权,请及时联系3500663466#qq.com(#换@),我们将第一时间删除本站数据。
THE END
暂无评论内容