优化技巧!!前端菜鸟让接口提速60%

javascript栏目介绍前端菜鸟让接口提速60%的技巧。

优化技巧!!前端菜鸟让接口提速60%

背景

好久没写文章了,沉寂了大半年

持续性萎靡不振,间歇性癫痫发作

天天来大姨爹,在迷茫、焦虑中度过每一天

不得不承认,其实自己就是个废物

立即学习“前端免费学习笔记(深入)”;

作为一名低级前端工程师

最近处理了一个十几年的祖传老接口

它继承了一切至尊级复杂度逻辑

传说中调用一次就能让cpu负载飙升90%的日天服务

专治各种不服与老年痴呆

我们欣赏一下这个接口的耗时

优化技巧!!前端菜鸟让接口提速60%

平均调用时间在3s以上

导致页面出现严重的转菊花

经过各种深度剖析与专业人士答疑

最后得出结论是:放弃医疗

鲁迅在《狂人日记》里曾说过:“能打败我的,只有女人和酒精,而不是bug”

每当身处黑暗之时

这句话总能让我看到光

所以这次要硬起来

我决定做一个node代理层

用下面三个方法进行优化:

按需加载 -> graphQL

数据缓存 -> redis

轮询更新 -> schedule

代码地址:github

按需加载 -> graphQL

天秀老接口存在一个问题,我们每次请求1000条数据,返回的数组中,每一条数据都有上百个字段,其实我们前端只用到其中的10个字段而已。

如何从一百多个字段中,抽取任意n个字段,这就用到graphQL。

graphQL按需加载数据只需要三步:

定义数据池 root描述数据池中数据结构 schema自定义查询数据 query

定义数据池

我们针对屌丝追求女神的场景,定义一个数据池,如下:

// 数据池var root = {    girls: [{        id: 1,        name: '女神一',        iphone: 12345678910,        weixin: 'xixixixi',        height: 175,        school: '剑桥大学',        wheel: [{ name: '备胎1号', money: '24万元' }, { name: '备胎2号', money: '26万元' }]    },    {        id: 2,        name: '女神二',        iphone: 12345678910,        weixin: 'hahahahah',        height: 168,        school: '哈佛大学',        wheel: [{ name: '备胎3号', money: '80万元' }, { name: '备胎4号', money: '200万元' }]    }]}复制代码

登录后复制

里面有两个女神的所有信息,包括女神的名字、手机、微信、身高、学校、备胎集合等信息。

接下来我们就要对这些数据结构进行描述。

描述数据池中数据结构

const { buildSchema } = require('graphql');// 描述数据结构 schemavar schema = buildSchema(`    type Wheel {        name: String,        money: String    }    type Info {        id: Int        name: String        iphone: Int        weixin: String        height: Int        school: String        wheel: [Wheel]    }    type Query {        girls: [Info]    }`);复制代码

登录后复制

上面这段代码就是女神信息的schema。

首先我们用type Query定义了一个对女神信息的查询,里面包含了很多女孩girls的信息Info,这些信息是一堆数组,所以是[Info]

我们在type Info中描述了一个女孩的所有信息的维度,包括了名字(name)、手机(iphone)、微信(weixin)、身高(height)、学校(school)、备胎集合(wheel)

定义查询规则

得到女神的信息描述(schema)后,就可以自定义获取女神的各种信息组合了。

比如我想和女神认识,只需要拿到她的名字(name)和微信号(weixin)。查询规则代码如下:

const { graphql } = require('graphql');// 定义查询内容const query = `    {         girls {            name            weixin        }    }`;// 查询数据const result = await graphql(schema, query, root)复制代码

登录后复制

筛选结果如下:

优化技巧!!前端菜鸟让接口提速60%

又比如我想进一步和女神发展,我需要拿到她备胎信息,查询一下她备胎们(wheel)的家产(money)分别是多少,分析一下自己能不能获取优先择偶权。查询规则代码如下:

const { graphql } = require('graphql');// 定义查询内容const query = `    {         girls {            name            wheel {            money            }        }    }`;// 查询数据const result = await graphql(schema, query, root)复制代码

登录后复制

筛选结果如下:

优化技巧!!前端菜鸟让接口提速60%

我们通过女神的例子,展现了如何通过graphQL按需加载数据。

映射到我们业务具体场景中,天秀接口返回的每条数据都包含100个字段,我们配置schema,获取其中的10个字段,这样就避免了剩下90个不必要字段的传输。

graphQL还有另一个好处就是可以灵活配置,这个接口需要10个字段,另一个接口要5个字段,第n个接口需要另外x个字段

按照传统的做法我们要做出n个接口才能满足,现在只需要一个接口配置不同schema就能满足所有情况了。

感悟

在生活中,咱们舔狗真的很缺少graphQL按需加载的思维

渣男渣女,各取所需

你的真情在名媛面前不值一提

我们要学会投其所好

上来就亮车钥匙,没有车就秀才艺

今晚我有一条祖传的染色体想与您分享一下

行就行,不行就换下一个

直奔主题,简单粗暴

缓存 -> redis

第二个优化手段,使用redis缓存

天秀老接口内部调用了另外三个老接口,而且是串行调用,极其耗时耗资源,秀到你头皮发麻

我们用redis来缓存天秀接口的聚合数据,下次再调用天秀接口,直接从缓存中获取数据即可,避免高耗时的复杂调用,简化后代码如下:

const redis = require("redis");const { promisify } = require("util");// 链接redis服务const client = redis.createClient(6379, '127.0.0.1');// promise化redis方法,以便用async/awaitconst getAsync = promisify(client.get).bind(client);const setAsync = promisify(client.set).bind(client);async function list() {// 先获取缓存中数据,没有缓存就去拉取天秀接口let result = await getAsync("缓存");    if (!result) {      // 拉接口      const data = await 天秀接口();          result = data;          // 设置缓存数据          await setAsync("缓存", data)    }   return result;}list(); 复制代码

登录后复制

先通过getAsync来读取redis缓存中的数据,如果有数据,直接返回,绕过接口调用,如果没有数据,就会调用天秀接口,然后setAsync更新到缓存中,以便下次调用。因为redis存储的是字符串,所以在设置缓存的时候,需要加上JSON.stringify(data),为了便于大家理解,我就不加了,会把具体细节代码放在github中。

将数据放在redis缓存里有几个好处

可以实现多接口复用、多机共享缓存

这就是传说中的云备胎

追求一个女神的成功率是1%

同时追求100个女神,那你获取到一个女神的概率就是100%

鲁迅《狂人日记》里曾说过:“舔一个是舔狗,舔一百个你就是战狼”

你是想当舔狗还是当战狼?

来吧,缓存用起来,redis用起来

轮询更新 -> schedule

最后一个优化手段:轮询更新 -> schedule

女神的备胎用久了,会定时换一批备胎,让新鲜血液进来,发现新的快乐

缓存也一样,需要定时更新,保持与数据源的一致性,代码如下:

const schedule = require('node-schedule');// 每个小时更新一次缓存schedule.scheduleJob('* * 0 * * *', async () => {    const data = await 天秀接口();    // 设置redis缓存数据    await setAsync("缓存", data)});复制代码

登录后复制

天秀接口不是一个强实时性接口,数据源一周可能才会变一次

所以我们根据实际情况用轮询来设置更新缓存频率

我们用node-schedule这个库来轮询更新缓存,* * 0 * * *这个的意思就是设置每个小时的第0分钟就开始执行缓存更新逻辑,将获取到的数据更新到缓存中,这样其他接口和机器在调用缓存的时候,就能获取到最新数据,这就是共享缓存和轮询更新的好处。

早年我在当舔狗的时候,就将轮询机制发挥到淋漓尽致

每天向白名单里的女神,定时轮询发消息

无限循环云跪舔三件套:

“啊宝贝,最近有没有想我”“啊宝贝早安安”“宝贝晚安,么么哒”

虽然女神依然看不上我

但仍然时刻准备着为女神服务

结尾

经过以上三个方法优化后

接口请求耗时从3s降到了860ms

优化技巧!!前端菜鸟让接口提速60%

这些代码都是从业务中简化后的逻辑

真实的业务场景远比这要复杂:分段式数据存储、主从同步 读写分离、高并发同步策略等等

每一个模块都晦涩难懂

就好像每一个女神都高不可攀

屌丝战胜了所有bug,唯独战胜不了她的心

受伤了只能在深夜里独自买醉

但每当梦到女神打开我做的页面

被极致流畅的体验惊艳到

在精神高潮中享受灵魂升华

那一刻

我觉得我又行了

(完)

相关免费学习推荐:JavaScript(视频)

以上就是优化技巧!!前端菜鸟让接口提速60%的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2724343.html

(0)
上一篇 2025年3月7日 23:13:05
下一篇 2025年3月1日 03:04:31

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 深入解析Ajax接口:揭示其功能和特征

    深入了解Ajax接口:探索其功能和特点,需要具体代码示例 引言:在当今互联网开发领域中,Ajax(Asynchronous JavaScript and XML)已成为一项重要的技术。它能够实现页面异步加载,使Web应用程序更具交互性和响应…

    2025年3月7日
    200
  • 展望Ajax接口的技术趋势:未来发展的展望

    Ajax接口的未来发展:展望其在技术趋势中的前景,需要具体代码示例 随着互联网的发展,Ajax(Asynchronous JavaScript and XML)作为一种前端技术,已经成为开发者广泛使用的工具之一。它能够实现异步通信,使得前端…

    2025年3月7日
    200
  • restful api是什么?

    RESTful API是REST风格的API,是一套用来规范多种形式的前端和同一个后台的交互方式的协议。RESTful API由后台也就是SERVER来提供前端来调用;前端调用API向后台发起HTTP请求,后台响应请求将处理结果反馈给前端。…

    2025年3月7日
    200
  • 了解API: 探索不同类型的接口及其用途

    了解API: 探索不同类型的接口及其用途,需要具体代码示例 导言:在如今的数字化时代,我们经常听到与API(应用程序接口)相关的词汇。API是现代软件开发中不可或缺的一部分,它提供了各种方式让不同的软件系统之间进行通信和交互。本文将向读者介…

    2025年3月7日
    200
  • 苹果14有没有换接口_苹果14有没有换接口介绍

    php小编草莓带来最新科技资讯:苹果14有没有换接口?苹果14一直以来备受关注,其中是否换接口成为了热门话题。苹果14是否继续沿用lightning接口还是会转向usb-c接口?让我们一起揭晓苹果14的接口设计,带来更多惊喜! 1、只要苹果…

    2025年3月6日
    200
  • 透视鸿蒙系统:功能实测与使用感受

    鸿蒙系统作为华为推出的全新操作系统,在行业内引起了不小的轰动。作为华为在美国禁令之后的一次全新尝试,鸿蒙系统被寄予了厚望和期待。近日,我有幸得到了一部搭载鸿蒙系统的华为手机,经过一段时间的使用和实测,我将分享一些关于鸿蒙系统的功能实测和使用…

    互联网 2025年3月6日
    200
  • C++ 框架设计中接口和类的权衡

    接口和类在 c++++ 框架设计中用途不同。接口定义抽象方法,强制实现类提供实现,提供抽象和解耦。类提供具体实现,提高性能和封装性。使用接口时,需要保持灵活性、促进解耦和支持多种实现;使用类时,需要具体实现、性能和隐藏实现细节。 C++ 框…

    2025年3月6日
    200
  • php接口加密怎么做

    解析接口客户端接口传输规则:1.用cmd参数(base64)来动态调用不同的接口,接口地址统一为http://a.lovexpp.com。 2.将要传过来的参数组成一个数组,数组添加timestamp元素(当前时间戳,精确到秒),将数组的键…

    2025年3月5日
    200
  • php接口有什么用

    php接口加密 接口是什么? 使用接口(interface),可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容。 接口是通过 interface 关键字来定义的,就像定义一个标准的类一样,但其中定义所有的方法都是空的。 接口中…

    2025年3月5日
    200
  • php开发接口要注意什么

    1.制定规范 开发前一定要定好一个规范,比如要定好数据返回的通用参数和格式。关于数据格式,用的比较多的有xml和json,我建议用json,因为json比xml的好处更多。 2.精简的返回数据 接口数据因符合需要什么返回什么的原则,比如要查…

    2025年3月5日
    200

发表回复

登录后才能评论