精华内容
下载资源
问答
  • 强缓存和弱缓存

    2019-02-22 12:27:39
    强缓存和弱缓存 www.cnblogs.com/iceflorence…
    展开全文
  • 这就涉及到了强缓存和弱缓存这两位兄弟喽 1.首先看看强缓存和弱缓存是怎么来的 **缓存: **在http协议请求头中设置Expires或者Cache-Control cache-control: max-age=3600 Expires是用来设置缓存过期时间,cache-...

    经常开发大哥改完bug,重新部署测试环境后,我这个菜鸟测试都会刷新下页面,但是发现有时候bug并没有修复,这个时候开发大哥就会让我清下缓存。那么问题就来了:刷新页面没有清缓存嘛?
    这就涉及到了强缓存和弱缓存这两位兄弟喽
    1.首先看看强缓存和弱缓存是怎么来的
    **强缓存:
    **在http协议请求头中设置Expires或者Cache-Control

    cache-control: max-age=3600
    

    Expires是用来设置缓存过期时间,cache-control的参数可以设置缓存的过期时间等。

    若浏览器发起请求的时候,缓存没有过期,则会直接读取本地缓存

    弱缓存:
    若未命中强缓存,则会向服务器发起请求:服务器判断页面有没有更新,若没有则会返回304,浏览器去读取本地缓存

    2.在读取缓存的时候状态码后面会跟(from memory cache)或者(from disk cache)
    (from memory cache):从内存中读取缓存
    (from disk cache):从硬盘中读取缓存

    至于缓存是存储在哪里这是由后端或者是在nginx等容器或者中间件服务中设置的
    3.回答我一开始的问题:刷新页面没有清缓存嘛?
    刷新页面是清除的强缓存,但是弱缓存并没有清除。

    展开全文
  • cache 缓存与弱缓存区别

    千次阅读 2019-03-08 09:04:27
    Web缓存可以保存常见文档副本,当发起Web请求时,如果本地有 “已缓存的" 的副本,就可以直接从本地存储中提取这个文档,而不是去从原始服务器中拿。 减少冗余数据传输 当很多客户端访问原始服务器页面时...

    Caches作用
    Web缓存可以保存常见文档副本,当发起Web请求时,如果本地有 “已缓存的" 的副本,就可以直接从本地存储中提取这个文档,而不是去从原始服务器中拿。

    减少冗余数据传输

    当很多客户端访问原始服务器页面时,服务器会多次传输同一份文档,相同的数据在网络中一遍遍的传输。这些冗余数据会耗尽昂贵的网络带宽,降低传输速度。

    使用缓存之后,浏览器只要保留第一条服务器响应的副本,后续对这个资源的访问都可以从缓存副本中得到了,减少了重复流量。

    缓解带宽瓶颈

    网络为本地网络客户端提供的带宽比服务器提供的带宽大很多。客户端会以路径上最慢的速度访问服务器。如果客户端从本地或者局域网的缓存中得到了一份副本,那么缓存就可以提高性能,尤其在传输大文件时。

    降低原始服务器负载

    当很多人去访问原始服务器时,会产生巨大流量,从而可能导致服务器崩溃

    降低距离时延

    将缓存放在本地或者局域网内可以大幅度降低传输距离,加快传输速度。

    浏览器缓存过程
    Web缓存服务器的基本工作原理很简单,对一条HTTP GET请求的缓存过程如下:

    · 接收:缓存从网络中读取抵达的请求报文

    · 解析:解析报文,提取首部

    · 查询:查询本地是否有副本,如果没有,就发起请求获取副本

    · 新鲜度检测:查看本地缓存是否足够新鲜,如果不是,则查询服务器是否有更新

    · 创建响应:返回缓存副本

    · 发送:将响应发回给客户端

    对于浏览器而言,整个过程又可以简化:

    · 查询本地副本,如果有且足够新鲜,则直接使用本地副本

    · 否则发起请求,验证本地副本是否足够新鲜

    以上两个过程分别称为强缓存和协商缓存。

    强缓存
    强缓存即直接从本地读取缓存副本,不需要发起请求。这种方式是最快的。

    强缓存通过HTTP 首部:cache-control管理

    cache-control首部

    cache-control首部用来指定缓存策略,例如是否能缓存,谁可以缓存,缓存多久

    no-cache与no-store:

    no-cache:表示必须先与服务器确认返回的响应是否被更改,然后才能使用该响应来满足后续对同一个网址的请求。如果资源未被更改,可以避免下载。

    no-store:禁止浏览器 (和所有中继缓存)存储返回的 任何版本的响应,每次用户请求该资源时,都会向服务器发送一个请求,每次都会下载完整的响应

    public 与 private:

    public:即使有关联的 HTTP 认证,甚至响应状态码无法正常缓存,响应也可以被缓存

    private:不允许任何中继缓存对其进行缓存

    max-age指令

    指定从当前请求开始,允许获取的响应被重用的最长时间(单位为秒)。

    通过cache-control的max-age,设置好缓存时间,单位是秒,例如缓存一年:

    cache-control: public, max-age=31536000
    当使用本地强缓存时,浏览器发回的响应信息是 200 from cache 或者 200 from memory cache,所耗费的时间在几毫秒之间,可以忽略不计。

    强缓存的更新问题:如果资源有更新,则希望浏览器使用新的资源。但是在现如今情况下,除了修改资源名称,没有别的办法更新资源。所以现在通常使用的办法是更新资源名称,例如资源名称一般是:

    [name]-[hash].ext
    在原始文件名之后加入文件哈希值,这样当文件内容修改之后,哈希值就会改变。再修改html文件的引用地址,这样就可以做到资源更新时,自动下载新资源;否则会一直使用本地缓存。

    expires首部

    expires是HTTP/1.0时期用于强缓存的首部字段。它会指定一个绝对的过期日期,如果日期已经过了,说明本地副本不再新鲜了。例如:

    Expires: Fri, 09 Dec 2016, 05:00:00 GMT
    Expires也是精确到秒的。

    由于expires使用的是绝对日期,如果服务器与客户端时间不一致,则会出现缓存不成功或者缓存不更新的问题。所以现在都建议cache-control做强缓存。

    协商缓存
    当本地缓存过期的时候,浏览器就会尝试协商缓存。协商缓存会发起请求,以验证本地副本是否可以使用。也称为再验证的过程。

    · 如果验证后显示文档内容变化,浏览器会获取一份新的副本,替代旧副本,缓存在本地

    · 如果验证后显示文档内容无变化,浏览器只用获取新的首部和新的过期日期

    根据响应中的状态码来指明文档没有变化。304 Not Modified
    验证文档内容是否变化有两种方式,统称为条件GET方法

    Last-Modified 与 If-Modified-Since首部

    这一对首部通过资源修改日期判断是否有变化,主要过程为:

    · 首次获取资源:服务器响应中添加首部Last-Modified,说明资源最近一次修改时间。浏览器保存下来这个时间

    · 验证资源:浏览器带上If-Modified-Since首部,值就是Last-Modified返回的时间;服务器比较If-Modified-Since的时间与资源最近一次修改时间:

    o 如果最近一次修改时间小于If-Modified-Since的时间,则返回304响应,响应中也会有cache-control、expires、Date首部;

    o 如果最近一次修改时间大于If-Modified-Since的时间,则返回新资源,并且更新所对应的全部首部,包括cache-control、expires、Date

    ETag与If-None-Match首部

    ETag是服务器为资源生成的唯一标识字符串。只有当文件内容变化时,ETag才会变化。使用过程与Last-Modified类似。

    · 首次获取资源:浏览器得到响应首部ETag对应的值

    · 验证资源:带上If-None-Match首部,值就是浏览器从服务器获得的ETag值,这样服务器可以比较ETag值来确定客户端缓存是否是最新,如果不是最新,则返回新文档;如果是,直接返回304Not Modified,包括cache-control、expires、Date首部

    ETag对比Last-Modified优势

    在有些情况下,Last-Modified会出现难以解决的问题:

    · 有些文档可能会被周期性的重写,但实际内容并没有变化。而此时Last-Modified会变化,ETag则不会

    · 有些文档被修改了,但是修改的内容并不重要,比如注释,不需要更新缓存

    · 有些服务器无法准确判断页面最后修改日期

    · 有些服务器的文档可能在1秒钟之内就产生变化了,而Last-Modified只能精确到秒,在某些场合下不够精准

    如果同时使用ETag和Last-Modified两种验证方式,服务器会优先验证ETag对应的If-None-Match请求首部,如果ETag相同,才会去验证Last-Modified

    项目中遇到问题的解释:

    如果设置的是no-store,浏览器每次都会请求新的;如果是no-cache,浏览器会优先走304协商缓存;如果这两个都没设置,而是设置了max-age,那在过期时间之内,浏览器不会发送请求到服务器,直接使用本地的。当然如果是cmd+r刷新,是会请求新资源的。

    如果不向服务器请求,浏览器就拿不到新资源的。form请求能拿到返回code,但是返回值我们是拿不到的;ajax可以拿到。(所以那个上传文件的组件,form请求失败,需要前端重定向)所以form没有跨域问题,而ajax有跨域问题。而跨域是说请求发送到了服务器,而我们拿不到返回值而已。浏览器觉得跨域拿返回值是危险的。window.open和输入url是一样的。

    如果后端正确设置了index.html的cache-control规则,是不需要强刷的。后端对index.html设置cache-control: no-cache,no-store,浏览器每次都请求新的html资源,这样用户就会请求新的js和css了(上次是这个规则没设置,所以要强刷)。如果强缓存未过期,在最近一段时间内加载过这个文件,就会from memory,否则就是from disk;from cache也是从缓存里读取。最终都是强缓存,没有请求服务器。304是向服务器做了协商缓存验证,如果没更新才会使用本地资源。

    (上次那个没权限用户总是走缓存的问题,meta头,后端没设置。所以后面自己设置了,并且在登录回调那里把index.html加上时间戳。)

    作者:快乐的程序媛
    来源:CSDN
    原文:https://blog.csdn.net/qianqianstd/article/details/75907082
    版权声明:本文为博主原创文章,转载请附上博文链接!

    展开全文
  • 浏览器的缓存与弱缓存

    千次阅读 2018-06-11 16:37:15
    在浏览器众多缓存中的HTTP缓存可能很多人对这个的概念并没有很清晰,每个人都知道进入一次网页之后再刷新一次页面,加载速度会比首次加载快非常多,每个人都知道这是浏览器缓存的magic,但是对此背后的原因可能不甚...

    在浏览器众多缓存中的HTTP缓存可能很多人对这个的概念并没有很清晰,每个人都知道进入一次网页之后再刷新一次页面,加载速度会比首次加载快非常多,每个人都知道这是浏览器缓存的magic,但是对此背后的原因可能不甚了解...

    当我们在谈论HTTP缓存时我们在谈论什么:

    我们实际上是在谈论下面这两种情况:

    如上图,浏览器对静态资源的HTTP缓存有两种情况,一种是强缓存(本地缓存),另一种是弱缓存(协商缓存)。


    缓存流程:

    浏览器第一次请求资源时:

    图片出自网络

    浏览器第一次请求资源时,必须下载所有的资源,然后根据响应的header内容来决定,如何缓存资源。可能采用的是强缓存,也可能是弱缓存

    浏览器后续请求资源时的匹配流程:

    由上图可以知道当浏览器请求一个静态资源时的HTTP流程:

    1. 强缓存阶段:先在本地查找该资源,如果发现该资源,并且其他限制也没有问题(比如:缓存有效时间),就命中强缓存,返回200,直接使用强缓存,并且不会发送请求到服务器
    2. 弱缓存阶段:在本地缓存中找到该资源,发送一个http请求到服务器,服务器判断这个资源没有被改动过,则返回304,让浏览器使用该资源。
    3. 缓存失败阶段(重新请求):当服务器发现该资源被修改过,或者在本地没有找到该缓存资源,服务器则返回该资源的数据。

    强缓存与弱缓存的区别:

    获取资源形式: 都是从缓存中获取资源的。

    状态码: 强缓存返回200(from cache),弱缓存返回304状态码

    请求(最大区别)

    强缓存不发送请求,直接从缓存中取。

    弱缓存需要发送一个请求,验证这个文件是否可以使用(有没有被改动过)。


    强缓存:

    强缓存是利用Expires或者Cache-Control,让原始服务器为文件设置一个过期时间,在多长时间内可以将这些内容视为最新的。

    若时间未过期,则命中强缓存,使用缓存文件不发送请求。

    Cache-Control

    Cache-Control 是http1.1中为了弥补Expires的缺陷而加入的,当Expires和Cache-Control同时存在时,Cache-Control优先级高于Expires。

    选项

    可缓存性:

    public: 服务器端和浏览器端都能缓存

    private: 只能浏览器端缓存

    no-cache: 强制浏览器在使用cache拷贝之前先提交一个http请求到源服务器进行确认。http请求没有减少,会减少一个响应体(文件内容),这种个选项类似弱缓存。

    only-if-cached: 表明客户端只接受已缓存的响应,并且不要向原始服务器检查是否有更新的拷贝。

    到期设置:

    max-age=60:设置缓存存储的最大周期,超过这个时间缓存被认为过期(单位秒)。 这里是60秒

    其他设置:

    no-store: 不缓存,使用协商缓存

    must-revalidate: 缓存必须在使用之前验证旧资源的状态,并且不可使用过期资源。

    更多设置,移动MDN

    // 示例
    Cache-Control: no-cache, no-store, must-revalidate
    Cache-Control:public, max-age=31536000
    Cache-Control: max-age=3600, must-revalidate

    http1.0时代的缓存 Expires+Pragma

    Expires用于设置缓存到期时间

    指定缓存到期GMT的绝对时间,如果设了max-age,max-age就会覆盖expires,如果expires到期需要重新请求。

    Expires:Sat, 09 Jun 2018 08:13:56 GMT

    有一个问题是由于使用具体时间,如果时间表示出错或者没有转换到正确的时区都可能造成缓存生命周期出错。

    Pragma禁用缓存:

    Pragma : no-cache 表示防止客户端缓存,需要强制从服务器获取最新的数据;

    Pragma : no-cache  //只有这一个用法 禁用缓存,强制从服务器获取最新的数据; 

    强缓存命中 from memory cache & from disk cache

    在测试的时候,看到命中强缓存时,有两种状态,200 (from memory cache) cache & 200 (from disk cache),于是去找了一下这两者的区别:

    memory cache: 将资源存到内存中,从内存中获取。

    disk cache:将资源缓存到磁盘中,从磁盘中获取。

    二者最大的区别在于:当退出进程时,内存中的数据会被清空,而磁盘的数据不会

    更详细的介绍推荐这篇文章


    弱缓存:

    如果强缓存时间过期,或者没有设置,导致未命中的话。就进入到了弱缓存的阶段了,

    Last-Modified & if-modified-since:

    Last-Modified与If-Modified-Since是一对报文头,属于http 1.0。

    last-modified是web服务器认为文件的最后修改时间,last-modified是第一次请求文件的时候,服务器返回的一个属性。

    Last-Modified: Sat, 09 Jun 2018 08:13:56 GMT 

    第二次请求这个文件时,浏览器把If-Modified-Since发送给服务器,询问该时间之后文件是否被修改过。

    If-Modified-Since: Sat, 09 Jun 2018 08:13:56 GMT // 跟Last-Modified的值一样

    ETag & If-None-Match

    ETag与If-None-Match是一对报文,属于http 1.1。

    ETag是一个文件的唯一标志符。就像一个哈希或者指纹,每个文件都有一个单独的标志,只要这个文件发生了改变,这个标志就会发生变化。

    ETag机制类似于乐观锁机制,如果请求报文的ETag与服务器的不一致,则表示该资源已经被修改过来,需要发最新的内容给浏览器。

    ETag也是首次请求的时候,服务器返回的:

    ETag: "8F759D4F67D66A7244638AD249675BE2" // 长这样

    If-None-Match也是浏览器发送到服务器验证,文件是否改变的:

    If-None-Match: "8F759D4F67D66A7244638AD249675BE2" // 跟ETag的值一样

    Etag/lastModified过程如下:

    1. 客户端第一次向服务器发起请求,服务器将附加Last-Modified/ETag到所提供的资源上去
    2. 当再一次请求资源,如果没有命中强缓存,在执行在验证时,将上次请求时服务器返回的Last-Modified/ETag一起传递给服务器
    3. 服务器检查该Last-Modified或ETag,并判断出该资源页面自上次客户端请求之后还未被修改,返回响应304和一个空的响应体

    同时使用两个报文头:

    同时使用这两个报文头,两个都匹配才会命中弱缓存,否则将重新请求资源。

    Etag 主要为了解决 Last-Modified 无法解决的一些问题:

    1. 一些文件也许内容并不改变(仅仅改变的修改时间),这个时候我们不希望文件重新加载。(Etag值会触发缓存,Last-Modified不会触发)
    2. If-Modified-Since能检查到的粒度是秒级的,当修改非常频繁时,Last-Modified会触发缓存,而Etag的值不会触发,重新加载。
    3. 某些服务器不能精确的得到文件的最后修改时间。

    用户操作行为与缓存

    F5刷新导致强缓存失效。

    ctrl+F5强制刷新页面强缓存,弱缓存都会失效。

    图片出自网络

    如何设置?

    一般是服务器端设置这些请求头的,我自己试了用阿里云服务器设置Cache-Control,设置一下很方便的。


    小结

    通过网络重复请求资源既缓慢,成本又高,缓存和重用以前获取的资源的能力成为优化性能很关键的一个方面,也是大厂面试时很频繁出现的内容,掌握好这块知识点是非常重要的,希望本文能给你带来些收获。

    文章如有不正确的地方欢迎各位路过的大佬鞭策!喜欢的话,赶紧点波订阅关注/喜欢。

    鼓励我一下:

    觉得还不错的话,给我的项目点个star

    展开全文
  • HTTP缓存与协商缓存(弱缓存

    千次阅读 2019-09-04 15:19:21
    浏览器缓存的优点 浏览器将用户最近请求过的文档存储在本地磁盘,当用户再次访问时直接在本地加载,这样...首次响应时,服务器会把last-Modified(页面最后修改时间)Etag一起发送给客户端。 浏览器再次请求时: ...
  • 强缓存和协商缓存

    千次阅读 2018-07-29 16:38:19
    浏览器缓存包含两种类型,即强缓存(也叫本地缓存协商缓存,浏览器在第一次请求发生后,再次请求时: 浏览器在请求某一资源时,会先获取该资源缓存的header信息,判断是否命中强缓存(cache-controlexpires...
  • 浏览器的强缓存和协商缓存

    千次阅读 2018-04-14 17:40:41
    原文地址:HTTP强缓存与协商缓存 浏览器缓存 浏览器缓存是指浏览器在本地磁盘对用户最近请求过的文档进行存储,当访问者再次访问同一页面时,浏览器就可以直接从本地磁盘加载文档。 浏览器缓存有以下优点: 1....
  • HTTP强缓存和协商缓存

    千次阅读 2017-12-01 03:35:44
    浏览器缓存 浏览器缓存是浏览器在本地磁盘对用户最近请求过的文档进行存储,当访问者再次访问同一页面时,浏览器就可以直接从本地磁盘加载文档。 所以根据上面的特点,浏览器缓存有下面的优点: 减少冗余...
  • http缓存机制-强缓存和对比缓存

    千次阅读 2018-12-24 00:17:29
    强制缓存 使用Expires;Cache-Control max-age Expires:到期时间;如Expires: Wed, 02 Jan 2019 12:12:03 GMT Cache-control :max-age=864000 (10天) nginx 中设置expires , 返回的响应中除了expires的头部...
  • 它使用LRU / LFU(LRFU)到期来保留引用的数据,然后,一旦数据处于非活动状态,它将使用引用(终结注册表)来允许GC作为正常GC周期的一部分删除缓存的数据,但仍然继续只要数据仍驻留在内存中并且尚未被收集,...
  • 缓存策略:首次加载的时候通过网络加载,获取图片,然后保存到内存 SD 卡中。之后运行 APP 时,优先访问内存中的图片缓存。如果内存没有,则加载本地 SD 卡中的图片。内存缓存的原理:使用LruCache缓存类 ,其内部...
  • Mybatis中有一级缓存和二级缓存,默认情况下一级缓存是开启的,而且是不能关闭的。一级缓存是指SqlSession级别的缓存,当在同一个SqlSession中进行相同的SQL语句查询时,第二次以后的查询不会从数据库查询,而是直接...
  • 使用缓存就是为了提高性能,如果要求缓存喝数据库的数据是一致的,那么就违背了使用缓存的初衷了,所以建议数据库和缓存数据只需要保持一致性。
  • mybaits提供一级缓存二级缓存。 一级缓存是SqlSession级别的缓存。在操作数据库时需要构造 sqlSession对象,在对象中有一个(内存区域)数据结构(HashMap)用于存储缓存数据。不同的sqlSession之间的缓存数据...
  • mybatis系统缓存(一级缓存和二级缓存) ,自定义缓存
  • mybaits提供一级缓存二级缓存。 一级缓存是SqlSession级别的缓存。在操作数据库时需要构造 sqlSession对象,在对象中有一个(内存区域)数据结构(HashMap)用于存储缓存数据。不同的sqlSession之间的缓存数据...
  • MyBatis一级缓存和二级缓存

    万次阅读 多人点赞 2018-09-05 22:44:30
    MyBatis自带的缓存有一级缓存和二级缓存 一级缓存 Mybatis的一级缓存是指Session缓存。一级缓存的作用域默认是一个SqlSession。Mybatis默认开启一级缓存。 也就是在同一个SqlSession中,执行相同的查询SQL,第一次...
  • 内存缓存和硬盘缓存

    2016-08-22 22:00:38
    防止多图OOM的解决技术是使用LruCacheDiskLruCache两种技术。 一 LruCache内存缓存 在Android中,这个LruCache类专门用做图片缓存处理的。当缓存的图片达到预先设置的值得时候,那么近期使用次数最少的图片就会...
  • 【MyBatis】MyBatis一级缓存和二级缓存

    千次阅读 2018-01-27 19:35:53
    MyBatis自带的缓存有一级缓存和二级缓存 一级缓存Mybatis的一级缓存是指Session缓存。一级缓存的作用域默认是一个SqlSession。Mybatis默认开启一级缓存。 也就是在同一个SqlSession中,执行相同的查询SQL,第一次会...
  • Mybatis的一级缓存和二级缓存详解

    千次阅读 多人点赞 2018-11-19 19:11:59
    注:本笔记是根据尚硅谷的MyBatis视频记录的 对于任何一个持久层框架,都有缓存机制;... 两个关于mybatis缓存额外的链接: ...关于Mybatis的一级缓存和二级缓存执行顺序具体可参考:Mybatis的一级缓存和二级缓存执行...
  • 查询缓存缓存的意义将用户经常查询的数据放在缓存(内存)中,用户去...mybatis持久层缓存mybatis提供一级缓存和二级缓存mybatis一级缓存是一个SqlSession级别,sqlsession只能访问自己的一级缓存的数据,二级缓存是跨
  • 虽互不曾谋面,但希望能您成为笔尖下的朋友以读书,技术,生活为主,偶尔撒点鸡汤不作,不敷衍,意在真诚吐露,用心分享点击左上方,可关注本刊标星公众号(ID:itclanCoder)如果不知...
  • 文章目录一、前言二、一级缓存三、二级缓存3.1、开启二级缓存:四、测试一下五、总结: 一、前言 先说缓存,合理使用缓存是优化中最常见的,将从数据库中查询出来的数据放入缓存中,下次使用时不必从数据库查询,...
  • Mybatis 一级缓存和二级缓存的使用

    万次阅读 2021-01-19 10:28:52
    Mybatis中默认定义了两级缓存:一级缓存和二级缓存 默认情况下,只启用了一级缓存(sqlSession级别的缓存),它仅仅对一个会话中的数据进行缓存。 二级缓存需要手动开启和配置,它是基于 namespace级别的缓存 为了...
  • 因为之前项目同事使用了图片三级缓存,今天整理项目的时候发现同事还是使用了软引用(SoftRefrerence)和弱引用(WeakReference),来管理在内存中的缓存。看到这个我就感觉不对了。脑海中有一句之前文章出现的“因为从 ...
  • 一级缓存和二级缓存(面试题)

    千次阅读 2019-09-22 20:35:40
    一级缓存基于sqlSession默认开启,在操作数据库时需要构造SqlSession对象,在对象中有一个HashMap用于存储缓存数据。不同的SqlSession之间的缓存数据区域是互相不影响的。 一级缓存的作用域是SqlSession范围的,当在...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 90,040
精华内容 36,016
关键字:

强缓存和弱缓存