前端缓存的理解 或者 前端数据持久化的理解(强制缓存、协商缓存)

前端缓存的理解 或者 前端数据持久化的理解(强制缓存、协商缓存),第1张

缓存可以说是性能优化中简单高效的一种优化方式了。一个优秀的缓存策略可以缩短网页请求资源的距离,减少延迟,并且由于 缓存文件可以重复利用 ,还可以减少带宽,降低网络负荷。

        对于一个数据请求来说,可以分为发起 网络请求、后端处理、浏览器响应 三个步骤。浏览器缓存可以帮助我们在第一和第三步骤中优化性能。比如说直接使用缓存而不发起请求,或者发起了请求但后端存储的数据和前端一致,那么就没有必要再将数据回传回来,这样就减少了响应数据。
①不存在该缓存结果和缓存标识,强制缓存失效,则直接向服务器发起请求

②存在该缓存结果和缓存标识,但该结果已失效,强制缓存失效,则使用协商缓存

③存在该缓存结果和缓存标识,且该结果尚未失效,强制缓存生效,直接返回该结果
控制强制缓存的字段分别是Expires和Cache-Control,其中Cache-Control优先级比Expires高。
Cache-Control、Expires都是缓存到期时间,Cache-Control是相对值,Expires是绝对值,即再次发送请求时,如果时间没到期,强制缓存生效。
注:在无法确定客户端的时间是否与服务端的时间同步的情况下,Cache-Control相比于expires是更好的选择,所以同时存在时,只有Cache-Control生效。

①协商缓存生效,返回304

②协商缓存失效,返回200和请求结果
这里我们以博客的请求为例,状态码为灰色的请求则代表使用了强制缓存,请求对应的Size值则代表该缓存存放的位置,分别为from memory cache 和 from disk cache。那么from memory cache 和 from disk cache又分别代表的是什么呢?什么时候会使用from disk cache,什么时候会使用from memory cache呢?

from memory cache代表使用 内存中的缓存 ,from disk cache则代表使用的是 硬盘中的缓存 ,

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters]
TcpNumConnections = 2000
MaxUserPort = 65534
TCPTimedWaitDelay = 30
需要重启,也有可能是内存使用率太高和个人防火墙的原因

1 缓存击穿

缓存击穿是指一个请求要访问的数据,缓存中没有,但数据库中有的情况。这种情况一般都是缓存过期了。

但是这时由于并发访问这个缓存的用户特别多,这是一个热点 key,这么多用户的请求同时过来,在缓存里面没有取到数据,所以又同时去访问数据库取数据,引起数据库流量激增,压力瞬间增大,直接崩溃给你看。

所以一个数据有缓存,每次请求都从缓存中快速的返回了数据,但是某个时间点缓存失效了,某个请求在缓存中没有请求到数据,这时候我们就说这个请求就"击穿"了缓存。

针对这个场景,对应的解决方案一般来说有三种。

借助Redis setNX命令设置一个标志位就行。设置成功的放行,设置失败的就轮询等待。就是在更新缓存时加把锁

后台开一个定时任务,专门主动更新过期数据

比如程序中设置 why 这个热点 key 的时候,同时设置了过期时间为 10 分钟,那后台程序在第 8 分钟的时候,会去数据库查询数据并重新放到缓存中,同时再次设置缓存为 10 分钟。

其实上面的后台续命思想的最终体现是也是永不过期。

只是后台续命的思想,会主动更新缓存,适用于缓存会变的场景。会出现缓存不一致的情况,取决于你的业务场景能接受多长时间的缓存不一致。


2 缓存穿透

缓存穿透是指一个请求要访问的数据,缓存和数据库中都没有,而用户短时间、高密度的发起这样的请求,每次都打到数据库服务上,给数据库造成了压力。一般来说这样的请求属于恶意请求。

解决方案有两种:

就是在数据库即使没有查询到数据,我们也把这次请求当做 key 缓存起来,value 可以是 NULL。下次同样请求就会命中这个 NULL,缓存层就处理了这个请求,不会对数据库产生压力。这样实现起来简单,开发成本很低。


3 缓存雪崩

缓存雪崩是指缓存中大多数的数据在同一时间到达过期时间,而查询数据量巨大,这时候,又是缓存中没有,数据库中有的情况了。

防止雪崩的方案简单来说就是错峰过期。

在设置 key 过期时间的时候,在加上一个短的随机过期时间,这样就能避免大量缓存在同一时间过期,引起的缓存雪崩。

如果发了雪崩,我们可以有服务降级、熔断、限流手段来拒绝一些请求,保证服务的正常。但是,这些对用户体验是有一定影响的。

4 Redis 高可用架构

Redis 高可用架构,大家基本上都能想到主从、哨兵、集群这三种模式。

哨兵模式:

它主要执行三种类型的任务:

哨兵其实也是一个分布式系统,我们可以运行多个哨兵。

然后这些哨兵之间需要相互通气,交流信息,通过投票来决定是否执行自动故障迁移,以及选择哪个从服务器作为新的主服务器。

哨兵之间采用的协议是 gossip,是一种去中心化的协议,达成的是最终一致性。

选举规则:

IE总是d出脚本错误提示窗口
出现此问题是因为该网页的 HTML 源代码不能使用客户端脚本(如 Microsoft JScript 或 Visual Basic 脚本)正确工作。发生此问题可能是因为以下原因之一: " 网页的 HTML 源代码中有问题。
● 您的计算机或网络上阻止了活动脚本、ActiveX 控件或 Java 小程序。Internet Explorer 或另外一种程序(如防病毒程序或防火墙)可以配置为阻止活动脚本、ActiveX 控件或 Java 小程序
● 防病毒软件配置为扫描您的“临时 Internet 文件”或“已下载的程序文件”文件夹。
● 您计算机上的脚本引擎损坏或过时。
● 您计算机上的 Internet 相关文件夹损坏。
● 您的视频卡驱动程序已损坏或者已过时。
● 您计算机上的 DirectX 组件损坏或过时。
注意:服务器端脚本 -- 如 Active Server Pages (ASP) 中的 Visual Basic 脚本 -- 运行在 Web 服务器上。因服务器端脚本故障而发生的脚本错误不在 Internet Explorer 中生成错误消息,但也可能会创建一个不能正确显示或工作的网页。
一、错误特征:
行: 247 字符: 2 错误: 拒绝访问 代码: 0
二、解决方案
1、清除一下IE浏览器的缓存,点IE上的工具——然后再选择最下面的Internet选项,再点Internet删除文件(记得勾上删除所有脱机内容),确定后再重新打开IE浏览器试试,同时请确认您使用的是IE60及以上版本。
2、您的网页上清缓存,在网页上选择工具->Interner选项->删除Cookies和删除文件,然后再确定。
3、请您点击IE浏览器中的“工具”,选择“internet选项”,进入“安全”页面,点击“自定义级别”,将您的安全设置设为“低”。
4、清空一下IE浏览器的cookies文件,在IE浏览器中设置“禁止自动脚本更新”,并不要选择“禁止运行ActiveX控件”,然后再尝试 *** 作。
三、总结
1、错误类型不固定 行: 247 字符: 2 错误: 拒绝访问 代码: 0 数字部分都是可变的。
2、解决方案中的4条不用都改,我的错误只用了1、2条就解决了。
3、错误发生原因没有做解释,因为我也搞不懂,很复杂而且需要一定专业知识才能搞懂,写在这也没什么必要,因为我们的目的是解决这一错误,能正常访问网页就OK了。
如果是打开IE上网时d出,属正常现象,可以在IE-工具-高级选项中选择"禁用脚本调试";如果还是不行,就把“显示每个脚本的错误通知”前的对号去掉,就不会出现了!
因为现在的网页都使用了大量的脚本,写错了也很正常,把脚本错误通知去掉就可以了!
也是在IE的高级选项中找

要解决问题,有先决的理论知识先要了解

分两种:

这种机制下,浏览器会先找本地缓存,命中则不会从服务器请求,并返回200状态码,且附有 disk cache 或者 memory cache 字样

这种机制,强缓存失效后,浏览器会携带缓存标识向服务器发起请求,服务器根据标识决定是否使用缓存

首先一点,就是 “浏览器会携带缓存标识” ,这个标识是什么,有两种

好,原理讲了,现在凡是用到nginx的,基本上自动都会实现了ETag和Last-Modified,也就是说,这部分实现机制,已经是默认的!不需要你另加处理。

好,问题来了,如何处理前端SPA应用的缓存问题呢?

现在的SPA要么Vue要么React要么Angular

默认情况下,我们会看到:

即所有资源第一次进,强缓存,第二次进,无意外情况下,会执行协商缓存。

之所以会出现SPA缓存问题,在于indexhtml是304,那么客户端读取到的,有可能是本地的Not Modified,那么继续下去,读的依旧是本地的disk cache

如何解决问题呢?

这里有个特性,SPA通过webpack打包,一般默认会带有contenthash值,即当对应文件有改动,这个contenthash值才会改变,进而改变打包出来的文件名,意味着 只有改变了的文件,文件名才会变,没有改变的文件是不会变的

如果需要对特殊的文件特殊处理,比如文字类型的文件设置更大的缓存时间或者别的,可以参考上述语法单独加映射

修改后, service nginx reload 一下,浏览器可以看到差别:

indexhtml一直是200,且从服务器直接读取,而所有其他的静态文件,均从memory or disk cache读取

好,那么接下来如果有更新,可以想象,变化的文件有

而由于indexhtml一直是请求服务器的,那么得到的入口js也必然是最新的,意味着如果没改动的,走本地强缓存,有改动的,会请求最新的,之后请求会走本地强缓存。

Problem solved

解决前端SPA缓存问题:

服务器采用Win2008 R2来架构逐渐增多,因性能方面提升了不少,还自带对某些文件进行配置缓存,大大提高了网站的效率和访问量。针对网站自带的FTP自然也是比较好的选择方案,不用选择第三方,即安全又方便。但跟Win2003的配置有所不同,配置过程如下:打开IIS管理器“控制面板\所有控制面板项\管理工具”-“Internet 信息服务(IIS)管理器”右击“添加FTP站点”填写FTP站点名称及所在盘符,这个盘符比较讲究,如果是在D盘设为FTP目录那么只要选择D盘就可以。接着在D盘下创建一个“LocalUser”目录。一般情况下IP地址不用选择,除非特殊要求,端口号就改成自己喜欢的,SSL可以选择无。比较关键,身份验证这里选择“基本”即可,允许访问这里选择“所有用户”,并且权限这里要勾上“读取,写入”FTP创建完之后,选择“FTP用户隔离”选择“用户名目录(禁用全局虚拟目录)”,这样创建用户名就可以限止到其他用户目录下了。FTP搭建完成可以测试了。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10789581.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-11
下一篇 2023-05-11

发表评论

登录后才能评论

评论列表(0条)

保存