提升 Web 应用程序的性能:如何使用 JavaScript 编写缓存服务
缓存是一种重要的优化技术,用于加速数据访问和降低服务器负载。缓存存储经常访问的数据,以便在需要时可以快速检索。在本文中,我们将探索如何使用简单的数据结构在 JavaScript 中编写缓存服务。
编码缓存服务的第一步是定义将用于访问缓存的接口。下面是使用键值存储的缓存服务的示例接口:
class CacheService { constructor ( ) {} get ( key ) {} set ( key, value ) {} clear ( ) {}
}
该get()方法检索与给定键关联的值,set()设置与键关联的值,并clear()从缓存中删除所有值。现在我们在实现接口的时候就可以使用各种存储来存储我们缓存的数据了。
一种方法是使用 JavaScript Map。Map是 JavaScript 中的内置数据结构,存储键值对。下面是使用缓存服务的示例实现Map:
class CacheService {constructor() {this.cache = new Map();}get(key) {return this.cache.get(key);}set(key, value) {this.cache.set(key, value);}clear() {this.cache.clear();}
}
该constructor()方法初始化一个空Map对象,该对象将用于存储缓存数据。
向缓存添加过期时间是一项重要的优化技术,有助于控制缓存大小。在此步骤中,我们将为缓存项添加过期时间,并在它们过期时将其从缓存中移除。
下面是包含过期时间的缓存服务的更新实现:
class CacheService {constructor() {this.cache = new Map();}get(key) {const cachedItem = this.cache.get(key);if (!cachedItem || cachedItem.expiresAt < Date.now()) {return null;}return cachedItem.value;}set(key, value, expiresInMs) {const expiresAt = Date.now() + expiresInMs;this.cache.set(key, { value, expiresAt });}clear() {this.cache.clear();}
}
该set()方法现在采用一个附加参数expiresInMs,它指定缓存项应过期的时间(以毫秒为单位)。该get()方法现在检查缓存项是否存在以及其过期时间是否已过。如果该项目已过期,则将其从缓存中删除并null返回。
下面是如何使用缓存服务:
// Create a new cache service instance
const cacheService = new CacheService();// Retrieve a value from the cache
const cachedValue = cacheService.get('myKey');// If the value is not found in the cache or has expired, it will return null
if (!cachedValue) {// Retrieve the value from the serverconst serverValue = fetch('https://example.com/myData').then(response => response.json()).then(data => {console.log(data);// Store the value in the cachecacheService.set('myKey', data, 5 * 60 * 1000);return data;});
} else {// Use the cached valueconsole.log(cachedValue);
}// Later clear the cache, if you need
cacheService.clear();
在此示例中,我们创建了缓存服务的新实例并从缓存中检索值。如果在缓存中找不到该值或已过期,我们会从服务器检索该值并将其存储在缓存中,有效期为 5 分钟,还可以使用 方法清除缓存clear()。
使用缓存服务,可以显着加快数据访问速度并减少服务器负载,从而使 Web 应用程序更快、更高效。实施缓存服务是一项重要的优化技术,可以显着提高应用程序的性能。
相关文章:
提升 Web 应用程序的性能:如何使用 JavaScript 编写缓存服务
缓存是一种重要的优化技术,用于加速数据访问和降低服务器负载。缓存存储经常访问的数据,以便在需要时可以快速检索。在本文中,我们将探索如何使用简单的数据结构在 JavaScript 中编写缓存服务。 编码缓存服务的第一步是定义将用于访问缓存的…...
供应商绩效管理指南:挑战、考核指标与管理工具
管理和优化供应商绩效既关键又具有挑战性。要知道价格并不是一切,如果你的供应商在商定的价格范围内向你开具发票,但服务达不到标准或货物不合格,你也无法达到节约成本的目标。 供应商绩效管理可以深入了解供应商可能带来的风险,…...
干货文稿|详解深度半监督学习
分享嘉宾 | 范越文稿整理 | William嘉宾介绍Introduction to Semi-Supervised Learning传统机器学习中的主流学习方法分为监督学习,无监督学习和半监督学习。这里存在一个是问题是为什么需要做半监督学习?首先是希望减少标注成本,因为目前可以…...
信箱|邮箱系统
技术:Java、JSP等摘要:在经济全球化和信息技术飞速发展的今天,通过邮件收发进行信息传递已经成为主流。目前,基于B/S(Browser/Server)模式的MIS(Management information system)日益…...
JS数组拓展
1、Array.from Array.from 方法用于将两类对象转为真正的数组: 类似数组的对象,所谓类似数组的对象,本质特征只有一点,即必须有length属性。 因此,任何有length属性的对象,都可以通过Array.from方法转为数组 和 可遍历…...
一道很考验数据结构与算法的功底的笔试题:用JAVA设计一个缓存结构
我在上周的笔试中遇到了这样一道题目,觉得有难度而且很考验数据结构与算法的功底,因此Mark一下。 需求说明 设计并实现一个缓存数据结构: 该数据结构具有以下功能: get(key) 如果指定的key存在于缓存中,则返回与该键关联的值&am…...
(10)C#传智:命名空间、String/StringBuilder、指针、继承New(第10天)
内容开始多了,慢品慢尝才有滋味。 一、命名空间namespace 用于解决类重名问题,可以看作类的文件夹. 若代码与被使用的类,与当前的namespace相同,则不需要using. 若namespace不同时,调用的方法:…...
基于Jetson Tx2 Nx的Qt、树莓派等ARM64架构的Ptorch及torchvision的安装
前提 已经安装好了python、pip及最基本的依赖库 若未安装好点击python及pip安装请参考这篇博文 https://blog.csdn.net/m0_51683386/article/details/129320492?spm1001.2014.3001.5502 特别提醒 一定要先根据自己板子情况,找好python、torch、torchvision的安…...
MySQL存储引擎详解及对比和选择
什么是存储引擎? MySQL中的数据用各种不同的技术存储在文件(或者内存)中。这些技术中的每一种技术都使用不同的存储机制、索引技巧、锁定水平并且最终提供广泛的不同的功能和能力。通过选择不同的技术,你能够获得额外的速度或者功能,从而改善…...
【推拉框-手风琴】vue3实现手风琴效果的组件
简言 在工作时有时会用到竖形手风琴效果的组件。 在此记录下实现代码和实现思路。 手风琴实现 结构搭建 搭建结构主要实现盒子间的排列效果。 用flex布局或者其他布局方式将内容在一行排列把每一项的内容和项头用盒子包裹, 内容就是这一项要展示的内容…...
滑动窗口最大值:单调队列
239. 滑动窗口最大值 难度困难2154收藏分享切换为英文接收动态反馈 给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 示例…...
负载均衡算法
静态负载均衡 轮询 将请求按顺序轮流地分配到每个节点上,不关心每个节点实际的连接数和当前的系统负载。 优点:简单高效,易于水平扩展,每个节点满足字面意义上的均衡; 缺点:没有考虑机器的性能问题&…...
C语言数组二维数组
C 语言支持数组数据结构,它可以存储一个固定大小的相同类型元素的顺序集合。数组是用来存储一系列数据,但它往往被认为是一系列相同类型的变量。 数组的声明并不是声明一个个单独的变量,比如 runoob0、runoob1、…、runoob99,而是…...
7年测试工程师,裸辞掉17K的工作,想跳槽找更好的,还是太高估自己了....
14年大学毕业后,在老师和朋友的推荐下,进了软件测试行业,这一干就是7年时间,当时大学本来就是计算机专业,虽然专业学的一塌糊涂,但是当年的软件测试属于新兴行业,人才缺口比较大,而且…...
企业为什么需要做APP安全评估?
近几年新型信息基础设施建设和移动互联网技术的不断发展,移动APP数量也呈现爆发式增长,进而APP自身的“脆弱性”也日益彰显,这对移动用户的个人信息及财产安全带来巨大威胁和挑战。在此背景下,国家出台了多部法律法规,…...
重回利润增长,涪陵榨菜为何能跑赢周期?
2022年消费市场持续低迷,疫情寒冬之下,不少食品快消企业均遭遇严重的业绩下滑,但一年里不断遭遇利空打击的“榨菜茅”涪陵榨菜,不仅安然躲过“酸菜劫”、走出“钠”争议,而且顺利将产品价格提起来,并在寒冬…...
这6个高清图片素材库,马住,马住~
网上找的图片素材清晰度不够,版权不明确怎么办。看看这几个可商用图片素材网站,解决你的所有图片需求,高清无水印,赶紧马住! 1、菜鸟图库 美女图片|手机壁纸|风景图片大全|高清图片素材下载网 - 菜鸟图库 网站素材…...
绝对零基础的C语言科班作业(期末模拟考试)
编程题(共10题; 共100.0分)模拟1(输出m到n的素数)从键盘输入两个整数[m,n], 输出m和n之间的所有素数。 输入样例:3,20输出样例:3 5 7 11 13 17 19 (输出数据之间用空格间…...
注解开发定义bean
注解开发定义bean 使用Component定义bean在核心配置文件中通过组件扫描加载bean,需要指定扫描包的范围 当然也可以使用Component的衍生注解,可以更加形象的表示 纯注解的开发模式 使用java类来代替了以前的 配置文件,在java类中ÿ…...
剑指 Offer 19. 正则表达式匹配
摘要 剑指 Offer 19. 正则表达式匹配 请实现一个函数用来匹配包含. 和*的正则表达式。模式中的字符.表示任意一个字符,而*表示它前面的字符可以出现任意次(含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如&#x…...
跨端三维GIS实战:uni-app集成Cesium.js的RenderJS方案解析
1. 为什么需要跨端三维GIS解决方案 最近几年三维GIS应用越来越普及,从传统的Web端到移动端APP,开发者都希望实现"一次开发,多端运行"的目标。uni-app作为跨端开发框架,天然具备这个优势。但当我们想在uni-app中集成Cesi…...
终极指南:如何用FanControl实现Windows系统风扇智能温控与静音优化
终极指南:如何用FanControl实现Windows系统风扇智能温控与静音优化 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub…...
Steam成就管理终极指南:三步掌握高效成就解锁技巧
Steam成就管理终极指南:三步掌握高效成就解锁技巧 【免费下载链接】SteamAchievementManager A manager for game achievements in Steam. 项目地址: https://gitcode.com/gh_mirrors/st/SteamAchievementManager Steam Achievement Manager(SAM&…...
写论文软件哪个好?2026 实测:真文献 + 实证图表 + 全流程,虎贲等考 AI 才是毕业论文通关王
每到毕业季,“写论文软件哪个好” 就成为本硕生最纠结的问题。市面上工具看似繁多,却大多藏着隐患:通用 AI 编造文献、无实证支撑;小众工具功能碎片化、格式混乱;传统软件效率低、无智能辅助…… 选错软件,…...
从Distributed到Lumped:三种SPEF寄生模型,你的芯片时序分析该选哪一个?
芯片时序分析中的SPEF模型选择:精度与效率的终极权衡 在28nm以下工艺节点,互连线寄生效应导致的时序偏差可能占到整体时钟周期的30%以上。面对动辄数千万个net的现代SoC设计,工程师们不得不在模型精度与运行时间之间做出艰难抉择。就像一位资…...
别再只复制粘贴了!深入理解阿里云IoT设备三元组(ProductKey/DeviceName/DeviceSecret)的安全与应用
阿里云IoT设备三元组安全实践指南:从基础认知到高级防护策略 在物联网项目开发中,设备身份认证是保障系统安全的第一道防线。许多开发者虽然能够快速完成设备接入,但对认证核心——设备三元组(ProductKey/DeviceName/DeviceSecret…...
计算机毕业设计:Python智慧医疗数据可视化与疾病预测系统 Flask框架 随机森林 机器学习 疾病数据 智慧医疗 深度学习(建议收藏)✅
博主介绍:✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业项目实战6年之久,选择我们就是选择放心、选择安心毕业✌ > 🍅想要获取完整文章或者源码,或者代做,拉到文章底部即可与…...
AI Token中转副业火爆!小白也能快速上手?3小时建站+真实盈利模式全解析!
很多观望的小白最纠结两个核心问题:普通人搭建一个Token中转站到底要多久?建好之后真的能赚钱吗,真实赚钱逻辑是什么? 今天不讲噱头、不吹月入几万,结合行业真实现状、新手实操经验,一次性讲透搭建耗时、成…...
告别编译报错:解决Windows下QGC源码编译中C2220等常见错误的实战记录
告别编译报错:解决Windows下QGC源码编译中C2220等常见错误的实战记录 当你满怀期待地克隆完QGroundControl源码,配置好Visual Studio和Qt环境,却在编译阶段遭遇红色错误提示时,那种挫败感我深有体会。特别是看到QGCTileCacheWork…...
Python地理空间数据处理技能库geoskills:简化GIS分析,提升开发效率
1. 项目概述:一个面向地理空间数据处理的技能库最近在GitHub上闲逛,发现了一个挺有意思的项目,叫geoskills,来自一个叫Cognitic-Labs的组织。光看名字,geo和skills的组合,就让我这个常年和数据打交道的人眼…...
