首页 > 编程知识 正文

缓存cache和redis区别,手机浏览器清空历史记录怎么恢复

时间:2023-05-03 06:00:45 阅读:43438 作者:696

首先什么是浏览器缓存?

3358 www.Sina.com/http://www.Sina.com /检查在同一会话期间缓存副本是否足够新,并且可以从浏览器缓存中检索和使用返回网页时访问的资源通过减少服务器处理的请求数量,用户可以获得更快的体验。

让我们聚焦于传说中的浏览器缓存。

缓存分类web缓存有多种类型,包括浏览器缓存是将文件保存在客户端和浏览器缓存。 其实拒绝读太多的文字,所以画了图说明。

浏览器通过代理服务器向源服务器发出请求的原理如下图所示

浏览器向代理服务器启动Web请求,然后将请求转发到源服务器。 因为是共享缓存,所以可以在很多地方使用缓存资源,对节约流量有很大的作用。

可检查在同一会话期间缓存的副本是否足够新,并从浏览器缓存中检索在返回网页时访问的资源。 通过减少服务器处理的请求数量,用户可以获得更快的体验

让我们聚焦于传说中的浏览器缓存。

浏览器缓存数据库缓存、代理服务器缓存、还有我们熟悉的CDN缓存,header有四个参数。

一、Cache-Control (关键战略):Cache-Control是指最大- age/s-maxage/public/private/no-cache/no-store/must-must

试着找资源吧。 例如,shang.qq.com上的css资源的max-age=2592000,即缓存有效期为2592000秒(即30天)。 因此,在30天内将使用此版本的资源,并且在服务上的资源发生更改时不会通知浏览器。 max-age涵盖Expires。 稍后再讨论。

浏览器缓存是将文件保存在客户端

例如,如果s-maxage=60,则在这60秒内更新CDN内容不会请求浏览器。 这意味着max-age用于常规缓存,而s-maxage用于代理缓存。 如果s-maxage存在,则会覆盖max-age和Expires header。页面的缓存状态是由header决定的也就是下图的意思。 如果未指定是公共还是私有,则默认值为公共。

如果需要33558www.Sina.com/http认证,响应将自动设置为private。

1、max-age(单位为s)指定设置缓存最大的有效时间,定义的是时间长短

但是,设置no-cache后,并不意味着浏览器不缓存,而是在缓存之前,必须向服务确认资源是否发生了更改。 因此,即使只设置no-cache来防止缓存,保险也可能不够。 也可以添加private命令,将过期时间设置为过去的时间。2、s-maxage(单位为s)同max-age,只用于共享缓存(比如CDN缓存)。一看就知道,使用此命令当然不会缓存~,但每次请求资源时都必须从服务器重新获取。3、public 指定响应会被缓存,并且在多用户间共享。这个指令不太常用,所以不太讨论。

二. Expires缓存过期。 用于指定资源的有效期,是服务端的具体时间点。 也就是说,Expires=max-age请求时间必须与Last-modified结合使用。 但是,如上所述,缓存控制的优先级更高。 Expires是Web服务器的响应标头字段,用于在响应http请求时通知浏览器,在过期之前,无需浏览器再次请求即可直接从浏览器缓存数据。

三.上次修改最后修改服务器端文件的时间需要与缓存控制一起使用,是检查服务器端资源是否更新的一种方法。 当浏览器再次发出请求时,If-Modified-Since标头将发送到服务器,询问自上次修改以来资源是否发生了更改。 如果未更改,则返回代码为304,使用缓存; 如果发生更改,则再次向服务请求资源。 返回代码与第一个请求相同,为200,资源是服务的最新资源。 如下图所示,最终修改时间为2014年12月19日星期五2点50分47秒

四、ETag根据实体内容生成哈希字符串,识别资源状态,服务端生成。 浏览器将此字符串返回给服务器,并检查资源是否已更改。 如果未更改,请执行以下步骤:

使用ETag可以解决最后修改的问题。

答,有吗

些服务器不能精确得到资源的最后修改时间,这样就无法通过最后修改时间判断资源是否更新 b、如果资源修改非常频繁,在秒以下的时间内进行修改,而Last-modified只能精确到秒 c、一些资源的最后修改时间改变了,但是内容没改变,使用ETag就认为资源还是没有修改的。 使用缓存流程

还是用图说话,下面是我所总结的从浏览器请求到展示资源的过程(非常重要):

Etag/If-None-Match
Etag/If-None-Match也要配合Cache-Control使用。
lEtag:web服务器响应请求时,告诉浏览器当前资源在服务器的唯一标识(生成规则由服务器觉得)。Apache中,ETag的值,默认是对文件的索引节(INode),大小(Size)和最后修改时间(MTime)进行Hash后得到的。
lIf-None-Match:当资源过期时(使用Cache-Control标识的max-age),发现资源具有Etage声明,则再次向web服务器请求时带上头If-None-Match(Etag的值)。web服务器收到请求后发现有头If-None-Match则与被请求资源的相应校验串进行比对,决定返回200或304。

Last-Modified/If-Modified-Since
Last-Modified/If-Modified-Since要配合Cache-Control使用。
lLast-Modified:标示这个响应资源的最后修改时间。web服务器在响应请求时,告诉浏览器资源的最后修改时间。
lIf-Modified-Since:当资源过期时(使用Cache-Control标识的max-age),发现资源具有Last-Modified声明,则再次向web服务器请求时带上头If-Modified-Since,表示请求时间。web服务器收到请求后发现有头If-Modified-Since则与被请求资源的最后修改时间进行比对。若最后修改时间较新,说明资源又被改动过,则响应整片资源内容(写在响应消息包体内),HTTP 200;若最后修改时间较旧,说明资源无新修改,则响应HTTP 304 (无需包体,节省浏览),告知浏览器继续使用所保存的cache。

既生Last-Modified何生Etag?
你可能会觉得使用Last-Modified已经足以让浏览器知道本地的缓存副本是否足够新,为什么还需要Etag(实体标识)呢?HTTP1.1中Etag的出现主要是为了解决几个Last-Modified比较难解决的问题:
1.Last-Modified标注的最后修改只能精确到秒级,如果某些文件在1秒钟以内,被修改多次的话,它将不能准确标注文件的修改时间
2.如果某些文件会被定期生成,当有时内容并没有任何变化,但Last-Modified却改变了,导致文件没法使用缓存
3.有可能存在服务器没有准确获取文件修改时间,或者与代理服务器时间不一致等情形
Etag是服务器自动生成或者由开发者生成的对应资源在服务器端的唯一标识符,能够更加准确的控制缓存。Last-Modified与ETag是可以一起使用的,服务器会优先验证ETag,一致的情况下,才会继续比对Last-Modified,最后才决定是否返回304。

cache-control指令使用

说了那么多cache-control的指令,那么如何选择使用哪些指令呢?

另外的缓存方式:LocalStorage和sessionStorage

除了开头提到的那么多缓存方式以外,还有一种我们都熟悉的缓存方式,LocalStorage和sessionStorage(好像是两种23333)。
LocalStorage是一种本地存储的公共资源,域名下很多应用共享这份资源会有风险;LocalStorage是以页面域名划分的,如果有多个等价域名之间的LocalStorage不互通,则会造成缓存多份浪费。
LocalStorage在PC上的兼容性不太好,而且当网络速度快、协商缓存响应快时使用localStorage的速度比不上304。并且不能缓存css文件。而移动端由于网速慢,使用localStorage要快于304。
而相对LocalStorage来说,SessionStorage的数据只存储到特定的会话中,不属于持久化的存储,所以关闭浏览器会清除数据。和localstorage具有相同的方法。
在前端开发中缓存是必不可少的,那么使用怎样的缓存方式更高效、让我们项目的性能更优,还是需要我们仔细斟酌。

如何启用Web缓存 启用缓存

了解了Web缓存的基本原理和重要性,接下来的问题就是如何在项目里使用。
 对于使用nginx或者apache做为Web前端的系统,有相应的指令达成目的,资料很多,比如可以参考NGINX下配置CACHE-CONTROL头部。
 对于使用高版本Tomcat的项目,没有必要自造轮子,官方实现的ExpiresFilter已经可以满足日常的使用,具体方法可以参考ExpiresFilter官方文档和Tomcat性能调优 通过ExpiresFilter设置资源缓存。
 对于使用低版本Tomcat的项目来说,虽然没有官方的过滤器可用,但可以自定义过滤器来实现缓存,具体方法可以参考tomcat中Cache-Control 的配置和使用Cache-Control和gzip提升tomcat应用性能(整理),代码和配置都比较简单,很好理解。

注意点

启用Web缓存之后,浏览器的缓存行为与用户的操作方式有关系,验证缓存特性开启的时候不要被假象蒙蔽。
使用Tomcat做应用容器,修改应用的Web.xml,增加缓存过滤器的配置,指定max-age为2周,此时使用Chrome访问应用的页面:
 在浏览器地址栏里输入URL,多次按回车,使用调试器可以观察到除了第一次访问页面,浏览器需要从Web服务器请求静态资源,一旦静态资源下载完毕,Chrome后续直接从本地缓存中加载资源,不再向Web服务器发起请求;
 按F5刷新页面或者右键菜单重新加载页面,浏览器向Web服务器发起加载静态资源的请求,Web服务器返回状态码304,表示资源未变化。

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。