「趣学前端」接口请求数据的缓存实践

简介: 前端开发中,如果通过后端接口请求获取的数据更新频率较低,但是使用率很高,可以考虑进行数据缓存减少请求。


一、灵感来源

最近在做新需求开发的时候,我发现某些页面进入时需要加载4、5个接口,我检查这些接口,发现大部分是基础数据,比如省、市、区或者某些特定分类(比如商品分类)等。这个数据需要通过后端接口请求获取,然后将数据回显到前端页面,让用户找到自己想要查询的筛选项。

每次进入带有省份筛选条件的列表页面,为了支持用户可以按照某个省份进行筛选的操作,都会将省份接口请求一次,拿到全部的省份列表。其实省份数据更新的频率很低,于是我就想如果用数据缓存替代接口请求是不是也可以?

二、假设与求证

再开始设计功能之前,我找到后端的同事进行了确认,我们的省市区(周一问一下)除非有特殊情况,基本不会更新。于是为了保险,我将缓存设置为了会话缓存,没有设置持久缓存。其实持久缓存设置过期时间也可以,但是因为是功能优化,优化的前提是不能带来额外的问题,所以为了稳妥,我采用了会话缓存。

三、纸上得来终觉浅,绝知此事要躬行

“大抵学问只有两途,致知力行而已。”我是个行动派,脑子里有了这个想法就着手去实现。

我们的项目是用React框架实现的,所以下面的功能实现均用JSX语法。

3.1 功能流程图

  • provinceList:全部省份数组变量;
  • 通过判断sessionStorage中是否有provinceList的值确定是否还需要请求省份接口,如果有值,不请求接口,直接将sessionStorage中provinceList的值赋值给provinceList变量;如果没有值,请求接口,将接口返回的provinceList值赋值给provinceList变量,同时存到sessionStorage中


3.2 UI交互

3.3 功能实现

  • 将该功能提炼成公共方法,根据需要获取的值的type不同区分数组对象和api接口请求;
  • apiMethodObj:定义接口方法变量,包括api接口和api接口入参两个变量。用定义对象变量的方式替代条件判断的方式,更方便维护和扩展,且不会带来额外的测试工作量;
  • callback: 回调函数,将最终获取的数据通过回调返回;
/** * @description 公共方法-获取sessionStorage数据 * @param {string} type 搜索项数组对象type值 * @param {Function} callback 回调函数 * @return {Array} 搜索项数组对象 */import { findProvince } from'@/api/base';
constgetSessionInfo= (type, callback) => {
letsessionInfo=JSON.parse(sessionStorage.getItem('sessionInfo')) || {};
letlist=sessionInfo[type] ?sessionInfo[type] : [];
// =>true: sessionStorage的数组对象值为空时,请求接口if (list.length===0) {
/** @name 接口方法变量 */letapiMethodObj= {
provinceList: {
api: findProvince, // api接口params: {
size: 100,
page: 1,
        }, // api接口入参      },
    };
/** @name 接口方法item变量 */letapiItem=apiMethodObj[type];
apiItem['api'](apiItem['params']).then(res=> {
if (res) {
// 重置sessionStorage中的sessionInfo值sessionInfo[type] =list;
sessionStorage.setItem('sessionInfo', JSON.stringify(sessionInfo));
// 回调数组对象callback&&callback(res.list);
      }
    });
  } else {
// 回调数组对象callback&&callback(list);
  }
};
exportdefaultgetSessionInfo;

设置省份数组对象

/** @name 设置省份数组对象 */const [provinceList, setProvinceList] =useState([]);
搜索通过anti提供的form表单实现,搜索项为select下拉<FormlabelAlign='left'onFinish={this.handleSearch} ref={this.formRef}><Form.Itemlabel='省份'name='provinceId'><Selectplaceholder='请选择'allowClear>      {provinceList.map(item=> (
<Select.Optionkey={item.provinceId} value={item.provinceId}>          {item.provinceName}
</Select.Option>      ))}
</Select></Form.Item></Form>;获取provinceList的值useEffect(() => {
getSessionInfo('provinceList', list=> {
setProvinceList(list);
  });
}, []);

3.4 小结

以上省份列表数据缓存的功能就实现了。我们来看一下接口请求是否只出现了一次。下面的截图是我第一次进入页面到不断刷新页面的截图,可以看到findProvince接口只请求了一次

浏览器缓存中sessionInfo对象已经有了数据,整个会话过程中,provinceList都会去缓存中的数据,除非手动删除缓存或者关闭会话。


四、总结

已经完成的小事,胜于计划中的大事。——雷特

新的一年,我致力于性能优化,前端性能优化涉及到很多方面,其中一条为减少http/https请求,优化接口请求,也可以帮忙做到这一点。

最后,还是要提醒一点,优化尽量不要带来额外的问题,所以进行接口数据缓存的时候,需要考虑数据的更新频率,尽量选择更新频率低甚至不更新的数据进行优化操作,且如果做永久缓存的话,尽量设置缓存时效,避免带来因为数据缓存导致数据不准的问题。

目录
相关文章
|
11月前
|
Web App开发 存储 缓存
如何精准清除特定类型或标签的缓存数据?
如何精准清除特定类型或标签的缓存数据?
921 57
|
存储 前端开发 安全
前端如何存储数据:Cookie、LocalStorage 与 SessionStorage 全面解析
本文全面解析前端三种数据存储方式:Cookie、LocalStorage与SessionStorage。涵盖其定义、使用方法、生命周期、优缺点及典型应用场景,帮助开发者根据登录状态、用户偏好、会话控制等需求,选择合适的存储方案,提升Web应用的性能与安全性。(238字)
1207 0
|
缓存 NoSQL 关系型数据库
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
|
10月前
|
存储 缓存 监控
一次缓存引发的文件系统数据不一致问题排查与深度解析
本文详述了一次由自研分布式文件系统客户端 EFC 的缓存架构更新所引发的严重数据不一致问题的完整排查过程。
一次缓存引发的文件系统数据不一致问题排查与深度解析
|
消息中间件 缓存 NoSQL
基于Spring Data Redis与RabbitMQ实现字符串缓存和计数功能(数据同步)
总的来说,借助Spring Data Redis和RabbitMQ,我们可以轻松实现字符串缓存和计数的功能。而关键的部分不过是一些"厨房的套路",一旦你掌握了这些套路,那么你就像厨师一样可以准备出一道道饕餮美食了。通过这种方式促进数据处理效率无疑将大大提高我们的生产力。
391 32
|
数据采集 缓存 JavaScript
数据抓取的缓存策略:减少重复请求与资源消耗
本教程聚焦于提升爬虫效率与稳定性,通过结合缓存策略、代理IP技术(如爬虫代理)、Cookie和User-Agent设置,优化数据采集流程。以知乎为例,详细讲解如何抓取指定关键词的文章标题和内容。内容涵盖环境准备、代码实现、常见问题及解决方案,并提供延伸练习,帮助读者掌握高效爬虫技巧。适合具备Python基础的初学者,助你规避网站机制,顺利获取目标数据。
428 2
数据抓取的缓存策略:减少重复请求与资源消耗
|
前端开发 Cloud Native Java
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
|
机器学习/深度学习 人工智能 缓存
MHA2MLA:0.3%数据微调!复旦团队开源推理加速神器,KV缓存狂降96.87%
MHA2MLA是复旦大学、华东师范大学、上海AI Lab等机构联合推出的数据高效微调方法,通过引入多头潜在注意力机制(MLA),显著优化基于Transformer的LLM推理效率,降低推理成本。
646 1
MHA2MLA:0.3%数据微调!复旦团队开源推理加速神器,KV缓存狂降96.87%
|
8月前
|
缓存 负载均衡 监控
135_负载均衡:Redis缓存 - 提高缓存命中率的配置与最佳实践
在现代大型语言模型(LLM)部署架构中,缓存系统扮演着至关重要的角色。随着LLM应用规模的不断扩大和用户需求的持续增长,如何构建高效、可靠的缓存架构成为系统性能优化的核心挑战。Redis作为业界领先的内存数据库,因其高性能、丰富的数据结构和灵活的配置选项,已成为LLM部署中首选的缓存解决方案。
867 25
|
缓存 NoSQL Java
Redis+Caffeine构建高性能二级缓存
大家好,我是摘星。今天为大家带来的是Redis+Caffeine构建高性能二级缓存,废话不多说直接开始~
1670 0

热门文章

最新文章

  • 1
    前端如何存储数据:Cookie、LocalStorage 与 SessionStorage 全面解析
    1207
  • 2
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(九):强势分析Animation动画各类参数;从播放时间、播放方式、播放次数、播放方向、播放状态等多个方面,完全了解CSS3 Animation
    538
  • 3
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(八):学习transition过渡属性;本文学习property模拟、duration过渡时间指定、delay时间延迟 等多个参数
    418
  • 4
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(七):学习ransform属性;本文学习 rotate旋转、scale缩放、skew扭曲、tanslate移动、matrix矩阵 多个参数
    414
  • 5
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(六):全方面分析css的Flex布局,从纵、横两个坐标开始进行居中、两端等元素分布模式;刨析元素间隔、排序模式等
    525
  • 6
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(五):背景属性;float浮动和position定位;详细分析相对、绝对、固定三种定位方式;使用浮动并清除浮动副作用
    708
  • 7
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(四):元素盒子模型;详细分析边框属性、盒子外边距
    1304
  • 8
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(三):元素继承关系、层叠样式规则、字体属性、文本属性;针对字体和文本作样式修改
    301
  • 9
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(二):CSS伪类:UI伪类、结构化伪类;通过伪类获得子元素的第n个元素;创建一个伪元素展示在页面中;获得最后一个元素;处理聚焦元素的样式
    1087
  • 10
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(一):CSS发展史;CSS样式表的引入;CSS选择器使用,附带案例介绍
    491