Instagram网站性能优化之路:第三部分 - 缓存优先

news/2024/5/19 7:21:56/文章来源:https://blog.csdn.net/m0_37411791/article/details/103077916

原文:https://instagram-engineering.com/making-instagram-com-faster-part-3-cache-first-6f3f130b9669

作者:Glenn Conner

翻译:奶爸码农

近年来,Instagram发布了许多功能-我们推出了故事,过滤器,创建工具,通知和消息直递,以及许多其他功能和优化。但是,随着产品功能的增长,一个不幸的副作用是我们的网络性能开始下降。在过去的一年中,我们有意识地努力来改善这一状况。 

到目前为止,我们的不懈努力已使Feed页的加载时间累计提升了近50%。这一系列博客文章将概述我们为实现这些改进所做的一些工作。

缓存优先

由于我们已经在页面加载的尽可能早的时间点将数据推送到客户端,因此,将数据发送到客户端的更快的唯一方法就是根本不必获取或推送任何数据。

我们可以使用缓存优先渲染方法来实现,尽管这确实意味着我们必须在短时间内向用户显示陈旧的Feed数据信息。通过这种方法,当页面加载完毕后,我们会立即向用户显示其先前的提要和故事的缓存副本,然后在可用时将其替换为新数据。

我们使用Redux来管理instagram.com上的状态,总体而言,我们实现该方法的方式是将Redux存储的子集存储在客户端上的indexedDB表中,然后在首次加载页面时重新更新该存储。但是,由于indexedDB访问、服务器数据获取、用户交互三者间的异步特性,如果用户在缓存数据上进行交互可能会存在问题。但是我们依旧想确保这些交互仍作用于从服务器获取的新状态数据。

例如,如果我们要以简便的方式处理缓存,则可能会遇到以下问题:我们开始同时从缓存和网络加载,并且由于已准备好缓存的数据,因此将其显示给用户。然后,用户点击喜欢该帖子,但是一旦最新的网络数据返回,它就会用一个副本覆盖该帖子,该副本会丢失用户对于缓存副本的操作(请参见下图)。

为了解决此问题,我们需要一种将交互应用于缓存状态,同时还存储了这些交互,以便以后可以在服务器上的新状态上重放它们。

如果您以前曾经使用过Git或类似的源代码控制系统,则此问题可能看起来很熟悉。如果我们将缓存的提要状态视为一个分支,而将服务器提要响应视为主服务器,则我们有效地要做的是执行一个变基操作,将本地分支中的提交(喜欢,评论等)应用到主分支。

我们做了以下设计:

  • 在页面加载时,我们发送对新数据的请求(或等待其推送)

  • 创建Redux状态的阶段性子集

  • 在请求/推送未完成期间,我们存储所有调度的动作

  • 请求到达后,我们会将操作与新数据以及所有待处理的操作一起应用到暂存状态

  • 提交暂存状态后,我们只需用暂存状态替换当前状态即可。

通过具有暂存状态,可以重新使用所有现有的reducer行为。它还使暂存状态(具有最新数据)与当前状态保持独立。另外,由于分段是使用Redux实现的,因此我们只需要调度操作即可使用它!

API

function stagingAction(
key: string,
promise: Promise<Action>,
): AsyncAction<State, Action>

function stagingCommit(key: string): AsyncAction<State, Action>

Staging API包括两个主要函数: stagingAction & stagingCommit

stagingAction接受一个Promise,该Promise将解决要分派到暂存状态的动作。它初始化暂存状态并跟踪自初始化以来已调度的所有操作。在源代码控制的类比中,我们可以将其视为创建本地分支,因为当新数据到达时,现在发生的任何操作都将排队,并应用于暂存状态。

stagingCommit将staging状态提交到current状态。如果对暂存状态的任何异步操作处于暂挂状态,它将在提交之前等待。这类似于源代码管理中的变基,因为我们将所有本地更改(来自缓存分支)应用在主服务器(服务器中的新数据)之上,使本地分支保持最新状态。

为了启用staging,我们用处理stagingCommit动作并将stage的动作应用于新状态。要使用所有这些,我们只需要调度相关的动作,一切都将为我们处理。例如,如果我们要获取一个新的feed并将其应用于暂存状态,则可以执行以下操作:

function fetchAndStageFeed() {
return stagingAction(
'feed',
(async () => {
const {data} = await fetchFeedTimeline();
return {
type: FEED_LOADED,
...data,
};
})(),
);
}

// Fetches the new feed and stages it
store.dispatch(fetchAndStageFeed());

// any other actions dispatched until the stagingCommit action
// will be applied to the 'feed' staged state

// Commits staging to the current state
store.dispatch(stagingCommit('feed'));

对Feed和Stories功能同时使用缓存优先渲染功能,分别使显示完成时间缩短了2.5%和11%,并通过本机iOS和Android Instagram应用提供了更好的用户体验。

静待第四部分

在第四部分,我们讲介绍如何裁剪代码大小,并且通过代码大小和执行优化提升性能。

-End-

推荐阅读:

Instagram.com网站性能优化之路:第一部分

Instagram.com网站性能优化之路:第二部分 - 数据推送

解密国内BAT等大厂前端技术体系-阿里篇(长文建议收藏)

2019年一半已过,这些大前端技术你都GET了吗?- 上篇

请关注奶爸码农公众号,第一时间获得最新信息。

『奶爸码农』从事互联网研发工作10+年,经历IBM、SAP、陆金所、携程等国内外IT公司,目前在美团负责餐饮相关大前端技术团队,定期分享关于大前端技术、投资理财、个人成长的思考与总结

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_844840.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Instagram.com网站性能优化之路:完结篇-代码大小和执行优化

近年来&#xff0c;Instagram发布了许多功能-我们推出了故事&#xff0c;过滤器&#xff0c;创建工具&#xff0c;通知和消息直递&#xff0c;以及许多其他功能和优化。但是&#xff0c;随着产品功能的增长&#xff0c;一个不幸的副作用是我们的网络性能开始下降。在过去的一年…

让网站更快、更可访问与更安全 - 这里有来自谷歌的新建议

这是奶爸码农第67篇原创文章&#xff0c;点击上方蓝字关注从6月30日到7月2日&#xff0c;Google的网络平台团队将Web.dev LIVE的网络社区召集在一起&#xff0c;这是一个在线技术分享活动&#xff0c;旨在讨论平台和工具生态系统的最新发展&#xff0c;使开发人员有机会相互交流…

aspnet网站开发实例_「前言」网站开发实例:公文处理系统(登记部分)一

需求分析与市场分析(简版)电子公文的归档工作是档案管理工作和电子政务建设的重要内容之一&#xff0c;电子公文归档系统作为一个连接办公自动化系统和数字档案管理系统的桥梁&#xff0c;在文档一体化管理体系中占据着重要位置。与传统纸质文档登记归档相比&#xff0c;电子公…

shell脚本监控网站,异常则进行邮件报警

服务器系统centos7.6 1、安装邮箱服务,一般服务器都已经安装了&#xff0c;查看是否安装。 yum list mailx rpm -qa | grep mail 查看是已经安装了。 未安装的执行命令安装即可。 yum -y install mailx 配置mail&#xff0c;配置文件路径/etc/mail.rc vim /etc/mail.rc 在尾部…

云上网站通用解决方案

在创业型公司或阿米巴模式经营的公司&#xff0c;新项目发布初期存在较大的不确定性&#xff0c;既要考虑项目未来的扩展性&#xff0c;又要衡量项目的运营成本。本解决方案为客户提供低成本&#xff0c;敏捷快捷的最佳实践。 典型行业&#xff1a;传统企业、游戏和零售等行业…

阿里云企业通用场景解决方案--企业建站

业务痛点及解决方案* 从企业前期筹备到创立初期&#xff0c;一站式服务为初创企业提供便利&#xff0c;让初创企业得到省心、省时、省钱的服务 阿里云解决方案 一站式提供从公司注册到财税法等各项代办服务&#xff0c;高效透明&#xff0c;省时省心。 解决方案简介 公司注…

搭建网站的简单粗暴方法概述

作者&#xff1a;fearlazy个人主页&#xff1a;fearlazy.com 对于不懂网站的人来说想要搭建自己的网站还是比较 困难的。好在现在很多东西都可以用现成的&#xff0c;这使得我们要搭建一个网站的时间成本大大降低了。在这里我们使用阿里云服务器wampserverzblog的组合方式简…

记网站由http改为https的几个步骤

环境&#xff1a;centos7 apache 1.申请证书 最新申请证书请参考&#xff1a;https://www.fearlazy.com/index.php/post/315.html 下载证书&#xff1a; 根据自己的web服务器选择下载即可。 2.上传证书到服务器 可以在web服务器程序目录下创建一个目录存放证书 mkdir /et…

微服务接入oauth2_分分钟让自己的网站接入 GitHub 第三方登录功能

今日干货刚刚发表查看:66666回复:666公众号后台回复 ssm&#xff0c;免费获取松哥纯手敲的 SSM 框架学习干货。OAuth2 和小伙伴们已经聊了很多了&#xff0c;咱们来一个实际点的案例练练手。这里我才用 GitHub 来做第三方登录。为什么是 GitHub 呢&#xff1f;有两方面考虑&…

求导数(导数计算器)网站 Derivative Calculator

Derivative Calculator 比如求x的平方的导数, 输入pow(x, 2), 点击go. 点击go, 然后会生成如下结果&#xff0c;包括了响应的函数图形.

LaTex常用技巧7:常用网站(公式和表格编辑器)

本文记录了本人编辑LaTex表格和公式常用的网站&#xff1a; 表格编辑器公式编辑器表格编辑器 网站1&#xff1a; 表格 编辑和生成器 支持LaTex Markdown多种格式 跟Markdown LaTex csv sql等和表格相关的都可以在这个网站里面找到。TableConvert 网站2&#xff1a; Tables G…

一个包含简明教程的网站:cheat-sheets.org

你听过Cheat-Sheets.org吗&#xff1f;在这里可以看到各种简明教程&#xff0c;包含了大部分的编程语言&#xff0c;C、C#、Jave、Python、sql、html、css、matlab、qt、mfc、shell、R……甚至还有photoshop、illustrator各种快键键汇总&#xff0c;真的短小精悍&#xff01;&a…

科研英文写作常用网站【持续更新】

1. bing词典 https://www.bing.com/dict?FORMZ9LHS4 例句很丰富。还没有广告。 2.英语表达同义替换 2.1 https://kmcha.com/similar 2.2 https://synonym.wordhippo.com/ 2.3 https://www.powerthesaurus.org/

太强了?京东大咖10年经验汇总:亿级流量网站核心架构笔记

经历过“双11”和“618”的同学都知道&#xff0c;在大促时如何保证系统的高并发、高可用是非常重要的事情。因此在备战大促时&#xff0c;有些通用原则和经验可以帮助我们在遇到高并发时&#xff0c;构建更可用的系统&#xff0c;如限流、降级、水平扩展和隔离解耦等。通过这些…

服务器论坛有哪些_网站降权常见的处理方法都有哪些?

要说在网站优化过程中害怕出现的情况&#xff0c;降权就是其中的一个&#xff0c;要知道网站降权会导致网站流量大幅度下降&#xff0c;关键词排名消失等现象&#xff0c;那么大家是否了解网站降权常见的处理方法都有哪些吗?1.网站服务器的稳定性在网站优化的过程中大家都会了…

【技巧】用手机访问局域网内Apache网站

写在前面 之前不知道还有这么一个技巧&#xff0c;以前手机真机测试webApp都是开电脑的WiFi&#xff0c;然后在手机里开启代理来访问这个网站。这样对设备的依赖性比较大&#xff0c;试想哪天没带笔记本电脑&#xff0c;或者在没有WiFi发射器的台式机里怎么用这个方式&#xf…

网站备案地点选择_建设项目环境影响登记表(备案)操作指南 (汽修行业收藏版)...

汽修行业示例一、请在取得营业执照后按照以下步骤进行备案操作■1、打开上海市生态环境局网站(http://sthj.sh.gov.cn)&#xff0c;点击首页中部“网上办事大厅”■2、点击“建设项目环境影响登记表备案”下方的“在线办理”■3、认真阅读各项告知信息和《建设项目环境影响登记…

[软件测试] - No.5 Linux 下使用 xampp搭建ecshop网站

一、安装配置xampp 1. 在linux系统中&#xff0c;百度xampp&#xff0c;下载linux版本。下载并提取后的文件如图所示&#xff1a; 2. 在终端中执行 上述命令&#xff0c;启动xampp 安装界面&#xff0c;一直点击next至安装成功&#xff1a; 3.安装成功以后&#xff0c;切换到/…

搭建个人网站

许久没有更博了&#xff0c;当初开博的时候还是一个刚保研的大四学生&#xff0c;如今已是研究生毕业两年&#xff0c;混迹银行业的IT码农&#xff0c;生活还算如意&#xff0c;追求不止于此&#xff0c;2016年初终于发布了自己首个个人网站&#xff0c;写篇文章分享网站的技术…

apache2.4在本地打开laravel项目_开源导航网站-WebStack-Laravel

前言&#xff1a;因为工作&#xff0c;需要使用的网站比较多&#xff0c;所以一直想为公司搭建一款私有的导航网站。本来想自己写&#xff0c;可是不会前端呀。只好去github上看看有没有大神分享的开源导航网站。虽然不太好找但还是找到了。项目地址&#xff1a;https://github…