JavaScript 实现支持过期时间的数据缓存功能

server/2025/1/11 4:03:22/

JavaScript 实现支持过期时间的数据缓存功能

要在 JavaScript 中实现数据缓存功能并支持设置过期时间,可以使用 localStoragesessionStorage 或内存对象(如 Map 或普通对象)来存储数据,并为每个缓存项设置一个过期时间。以下是一个简单的实现示例:


JavaScript 实现支持过期时间的数据缓存功能

1. 使用 localStorage 实现持久缓存

javascript">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.stringifyJSON.parse 进行序列化和反序列化。
  • localStorage 的存储空间一般有限(大约 5MB)。
  • 如果是跨页面使用,请确保在相同的域名下。

2. 使用 sessionStorage 实现数据缓存(适合页面级临时存储)

sessionStorage 是一种浏览器存储机制,它的特点是数据仅在页面会话(session) 期间有效,页面关闭后数据会被清除。

javascript">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.stringifyJSON.parse 处理。

3. 使用内存对象实现轻量缓存(适合短期缓存

javascript">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

三种方式对比

特性localStoragesessionStorage内存缓存 (Map)
持久性持久存储,页面刷新或关闭后仍保留页面会话结束(即关闭页面)时丢失页面刷新后丢失
共享性同一域名下所有页面共享仅当前标签页可用仅当前标签页可用
性能读取稍慢(I/O 操作)读取稍慢(I/O 操作)更快(内存存取)
适用场景长期存储、页面级数据临时存储页面状态、会话数据短期存储、临时数据
存储大小限制约 5MB约 5MB取决于可用内存

http://www.ppmy.cn/server/157366.html

相关文章

环动科技平均售价波动下滑:大客户依赖明显,应收账款周转率骤降

《港湾商业观察》施子夫 2024年12月18日,浙江环动机器人关节科技股份有限公司(以下简称,环动科技)的上市审核状态变更为“已问询”,公司在11月25日科创板IPO获上交所受理,独家保荐机构为广发证券。 此次环…

浙江生易达自控科技:品质与实力的象征

​ 从公司的背景来看,耀圣控制设备有限公司在行业内拥有丰富的经验和良好的声誉。其多年来致力于控制设备领域的研发、生产和销售,积累了深厚的技术实力和专业知识。而浙江生易达自控科技作为其新的发展载体,无疑继承了这些优势。浙江生易达…

Java SpringBoot如何生成唯一的订单号

1. 引言 在现代电子商务和金融系统中,生成唯一的订单号是确保数据一致性和系统可靠性的关键环节。特别是在分布式系统架构下,如何生成一个全局唯一的订单号变得尤为重要。本文将详细探讨在Spring Boot应用中生成唯一订单号的多种方法,包括UU…

解决:离线部署Docker容器(使用Docker现有容器生成镜像,将镜像打包成tar并发布到离线服务器中)

一、概述 本文主要讲解如何将现有的容器打包为镜像,然后该镜像打包为tar文件并在新环境中重新载入(在离线服务器中部署)。 二、现有容器生成镜像 docker提供了 commit 命令,可将容器打成镜像,其命令格式如下: docke…

PHP 在 2025 年的现状与展望

PHP 在 2025 年依然强劲,继续为超过 77% 使用已知服务器端编程语言的网站提供动力。这并非仅仅依靠遗留代码,像 WordPress、Shopify 和 Laravel 这样的主流平台持续推动 PHP 的发展,使其保持着 актуальность 并不断进化。 为什么…

JavaScript语言的学习路线

JavaScript语言的学习路线 引言 JavaScript是一门广泛使用的编程语言,最初为网页添加互动效果而设计。随着技术的发展,JavaScript的应用领域已经从网页开发扩展到了移动应用、桌面应用、服务器端开发等多个领域。掌握JavaScript不仅能够帮助你成为一名…

中国科学院|PPTAgent:超越文本到幻灯片的演示文稿生成与评估

🎯 推荐指数:🌟🌟🌟 📖 title:PPTAgent: Generating and Evaluating Presentations Beyond Text-to-Slides 🔥 code:https://github.com/icip-cas/PPTAgent &#x1f31f…

MATLAB语言的数据库交互

MATLAB语言的数据库交互 引言 在当今数据驱动的时代,掌握数据库的使用和管理是非常重要的。MATLAB作为一种强大的数值计算和数据分析工具,广泛应用于科学研究、工程设计和数据分析等领域。为了更有效地处理和分析数据,MATLAB提供了与各类数…