-
强缓存和弱缓存
2019-02-22 12:27:39 -
认认强缓存和弱缓存(协商缓存)这两个小伙伴
2020-10-24 15:14:24这就涉及到了强缓存和弱缓存这两位兄弟喽 1.首先看看强缓存和弱缓存是怎么来的 **强缓存: **在http协议请求头中设置Expires或者Cache-Control cache-control: max-age=3600 Expires是用来设置缓存过期时间,cache-...经常开发大哥改完bug,重新部署测试环境后,我这个菜鸟测试都会刷新下页面,但是发现有时候bug并没有修复,这个时候开发大哥就会让我清下缓存。那么问题就来了:刷新页面没有清缓存嘛?
这就涉及到了强缓存和弱缓存这两位兄弟喽
1.首先看看强缓存和弱缓存是怎么来的
**强缓存:
**在http协议请求头中设置Expires或者Cache-Controlcache-control: max-age=3600
Expires是用来设置缓存过期时间,cache-control的参数可以设置缓存的过期时间等。
若浏览器发起请求的时候,缓存没有过期,则会直接读取本地缓存
弱缓存:
若未命中强缓存,则会向服务器发起请求:服务器判断页面有没有更新,若没有则会返回304,浏览器去读取本地缓存2.在读取缓存的时候状态码后面会跟(from memory cache)或者(from disk cache)
(from memory cache):从内存中读取缓存
(from disk cache):从硬盘中读取缓存至于缓存是存储在哪里这是由后端或者是在nginx等容器或者中间件服务中设置的
3.回答我一开始的问题:刷新页面没有清缓存嘛?
刷新页面是清除的强缓存,但是弱缓存并没有清除。 -
HTTP强缓存与协商缓存(弱缓存)
2019-09-04 15:19:21浏览器缓存的优点 浏览器将用户最近请求过的文档存储在本地磁盘,当用户再次访问时直接在本地加载,这样...首次响应时,服务器会把last-Modified(页面最后修改时间)和Etag一起发送给客户端。 浏览器再次请求时: ...浏览器缓存的优点
浏览器将用户最近请求过的文档存储在本地磁盘,当用户再次访问时直接在本地加载,这样可以减少服务器的压力,加快用户访问网页的加载速度,提升用户体验。
浏览器缓存的过程
第一次请求:
首次响应时,服务器会把last-Modified(页面最后修改时间)和Etag一起发送给客户端。浏览器再次请求时:
用户行为与缓存
F5刷新导致强缓存失效。
ctrl+F5强制刷新页面强缓存,弱缓存都会失效。
参数说明
Last-Modified
在浏览器第一次请求某一个URL时,服务器端的返回状态会是200,内容是你请求的资源,同时有一个Last-Modified的属性标记此文件在服务期端最后被修改的时间,格式类似这样:
Last-Modified: Fri, 12 May 2006 18:53:33 GMT
客户端第二次请求此URL时,会在头部加入一个属性,询问该时间之后文件是否有被修改过:
If-Modified-Since: Fri, 12 May 2006 18:53:33 GMT
ETag
和Last-Modified类似,由于RFC2616(也就是HTTP/1.1)中没有说明ETag该是什么格式的,只要确保用双引号括起来就行了,所以你可以用文件的hash,甚至是直接用Last-Modified,以下是服务器端返回的格式:
ETag: “50b1c1d4f775c61:df3”
客户端的查询更新格式是这样的:
If-None-Match: W/“50b1c1d4f775c61:df3”
Expires
这个属性就如我们在ASP中使用HttpResponse.ExpiresAbsolute一样直接,声明某某时刻过期之后浏览器就应该重新请求该URL,使用格式为:
Expires: Sun, 10 Feb 2002 16:00:00 GMT
注意HttpResponse.ExpiresAbsolute在ASP.NET中是不建议使用的,现在我们应该使用的是HttpResponse.Cache.SetExpires。
Pragma
通常我们用到的值就是no-cache,这和在Cache-Control中使用no-cache值是一样的,Cache-Control在下面讲。Pragma的使用格式如下:
Pragma: no-cache
Cache-Control
这是一个集合型属性,它里面能够包含很多子属性,并且允许用户扩展新的子属性。常见的子属性包括:
max-age - 以秒为单位的超时,覆盖Expires属性。
public - 允许保存在共享缓存中。
private - 只允许保存在私有缓存中。
no-cache - 不允许缓存。
no-store - 不允许缓存在持久介质中。
no-transform - 不允许转换存储系统。最后
个人总结,有不对的地方希望大家留言指正,一起进步!
推荐一篇关于浏览器缓存总结的很不错的文章:https://juejin.im/entry/5ad86c16f265da505a77dca4 -
前端协商缓存强缓存如何使用_缓存策略:强缓存&协商缓存
2020-12-31 07:50:00如果对缓存机制不了解,可以根据后面的一些详细介绍做一个系统理解浏览器缓存主要分为强缓存(本地缓存)和协商缓存(弱缓存)如上图,在浏览器第一次发送请求后,需要再次发送请求时,浏览器会首先获取该资源缓存的...本文是对浏览器的缓存机制做了一个较为系统的探讨。如果已经了解了缓存,可以只看第一部分,结合配图一起看。如果对缓存机制不了解,可以根据后面的一些详细介绍做一个系统理解
浏览器缓存主要分为强缓存(本地缓存)和协商缓存(弱缓存)
如上图,在浏览器第一次发送请求后,需要再次发送请求时,浏览器会首先获取该资源缓存的header信息,然后根据Cache-Control和expires来判断是否过期。若没过期则直接从缓存中获取资源信息,包括缓存的header的信息,所以此次请求不会与服务器进行通信。如果缓存过期,浏览器会向服务器发送请求,本次请求会带着第一次请求返回的有关缓存的header字段信息,比如以下两种情况:
1。Etag
客户端会通过
If-None-Match
头将先前服务器端返回的Etag发送给服务器,服务器会对比这个客户端发过来的Etag是否与服务器的相同,若相同,就将If-None-Match
的值设为false,返回状态304,客户端继续使用本地缓存,不解析服务器端发回来的数据。若不相同就将If-None-Match
的值设为true,返回状态为200,客户端重新机械服务器端返回的数据;2。If-Modified-Since
客户端还会通过
If-Modified-Since
头将先前服务器端发过来的最后修改时间戳发送给服务器,服务器端通过这个时间戳判断客户端的页面是否是最新的,如果不是最新的,则返回最新的内容,如果是最新的,则返回304,客户端继续使用本地缓存。强缓存:
强缓存是利用http头中的
Expires
和Cache-Control
两个字段来控制的,用来表示资源的缓存时间- Expires:是http1.0的规范,它的值是一个绝对时间的GMT格式的时间字符串。比如网页的
Expires
值是:
expires:Mar, 06 Apr 2020 10:47:02 GMT。
这个时间代表这这个资源的失效时间,只要发送请求时间是在
Expires
之前,那么本地缓存始终有效,则在缓存中读取数据。所以这种方式有一个明显的缺点,由于失效的时间是一个绝对时间,所以当服务器与客户端时间偏差较大时,就会导致缓存混乱。2. Cache-Control: 是http1.1中出现的,一般利用该字段的max-age来判断,这个值是一个相 对时间。例如:
Cache-Control:max-age=3600 // 代表着资源的有效期是3600秒
除了该字段还有其他的几个常用的值。
- no-cache:不使用本地缓存。需要使用缓存协商,先与服务器确认返回的响应是否被更改,如果之前的响应中存在ETag,那么请求的时候会与服务端验证,如果资源未被更改,则可以避免重新下载。
- no-store:直接禁止游览器缓存数据,每次用户请求该资源,都会向服务器发送一个请求,每次都会下载完整的资源。
- public:可以被所有的用户缓存,包括终端用户和CDN等中间代理服务器。
- private:只能被终端用户的浏览器缓存,不允许CDN等中继缓存服务器对其缓存。
Cache-Control与Expires的优先级
Cache-Control与Expires可以在服务端配置同时启用,同时启用的时候Cache-Control优先级高。比如:cache-control:max-age=691200 expires:Fri, 06 Mar 2020 10:47:02 GMT
那么表示资源可以被缓存的最长时间为691200秒,会优先考虑
max-age
。协商缓存
协商缓存是由服务器确定缓存资源是否可用。主要涉及到两组header字段:
Etag
和If-None-Match
Last-Modified
和If-Modified-Since
Last-Modify/If-Modify-Since
浏览器第一次请求一个资源的时候,服务器返回的header中会加上Last-Modify,Last-modify是一个时间标识该资源的最后修改时间,例如Last-Modify: Thu,31 Dec 2037 23:59:59 GMT。
当浏览器再次请求该资源时,request的请求头中会包含If-Modify-Since,该值为缓存之前返回的Last-Modify。服务器收到If-Modify-Since后,根据资源的最后修改时间判断是否命中缓存。如果命中缓存,则返回304,并且不会返回资源内容,并且不会返回Last-Modify。
Etag/If-None-Match
从上面看可能会觉得使用Last-Modified已经足以让浏览器知道本地的缓存副本是否足够新,为什么还需要Etag呢?
首先,Etag/If-None-Match 是“实体标签”(Entity Tag)的缩写,是资源的一个唯一标识,资源变化都会导致ETag变化。服务器根据浏览器上送的If-None-Match值来判断是否命中缓存。
因此,Etag的出现主要是为了解决几个Last-Modified比较难解决的问题:
- 一些文件也许会周期性的更改,但是他的内容并不改变(仅仅改变的修改时间),这个时候我们并不希望客户端认为这个文件被修改了,而重新GET;
- 某些文件修改非常频繁,比如在秒以下的时间内进行修改,(比方说1s内修改了N次),If-Modified-Since能检查到的粒度是s级的,这种修改无法判断(或者说UNIX记录MTIME只能精确到秒);
- 某些服务器不能精确的得到文件的最后修改时间。
Last-Modified与ETag是可以一起使用的,服务器会优先验证ETag,一致的情况下,才会继续比对Last-Modified,最后才决定是否返回304。
浏览器刷新问题
当你点“刷新”按钮的时候,浏览器会在请求头里加一个“Cache-Control: maxage=0”。因为 max-age 是“生存时间”,而本地缓存里的数据至少保存了几秒钟,所以浏览器就不会使用缓存,而是向服务器发请求。服务器看到 max-age=0,也就会用一个最新生成的报文回应浏览器。
Ctrl+F5 的“强制刷新”又是什么样的呢?
它其实是发了一个“Cache-Control: no-cache”,含义和“max-age=0”基本一样,就看后台的服务器怎么理解,通常两者的效果是相同的。
参考链接:
HTTP强缓存和协商缓存 - JavaScript学习笔记 - SegmentFault 思否segmentfault.com大公司里怎样开发和部署前端代码?www.zhihu.com - Expires:是http1.0的规范,它的值是一个绝对时间的GMT格式的时间字符串。比如网页的
-
图片的三级缓存,强引用,弱引用,软引用,虚引用
2018-07-15 13:51:00缓存策略:首次加载的时候通过网络加载,获取图片,然后保存到内存和 SD 卡中。之后运行 APP 时,优先访问内存中的图片缓存。如果内存没有,则加载本地 SD 卡中的图片。内存缓存的原理:使用LruCache缓存类 ,其内部... -
对象的强、软、弱和虚引用 利用软引用实现java对象的高缓存
2017-08-03 14:31:19本文介绍对象的强、软、弱和虚引用的概念、应用及其在UML中的表示。 1.对象的强、软、弱和虚引用 在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象。也就是说,只有对象处于... -
Java对象的强、软、弱和虚引用原理+结合ReferenceQueue对象构造Java对象的高速缓存器
2015-08-18 09:14:061.Java对象的强、软、弱和虚引用 在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象。也就是说,只有对象处于可触及(reachable)状态,程序才能使用它。这 就像在日常生活中,... -
三级缓存之弱引用概念
2017-08-23 08:43:09弱引用和软引用概念一样,只是袋子里的东西是在系统调用GC的时候清空; 虚引用的袋子基本为空,只是可以起到一个回收资源的作用,我自己感觉 安卓2.3.x 之后,软引用也就成了弱引用,google推荐是LruCache ... -
使用缓存最好只保持弱一致性
2020-07-13 12:29:03使用缓存就是为了提高性能,如果要求缓存喝数据库的数据是强一致的,那么就违背了使用缓存的初衷了,所以建议数据库和缓存数据只需要保持弱一致性。 -
C# 强引用和弱引用
2013-04-01 17:08:49.NET框架提供了另一有趣的特色,...ASP.NET高速缓存就使用了弱引用。如果内存使用率太高,高速缓存将被清除。 强制垃圾收集 .NET框架为开发者提供System.GC类来控制垃圾收集器的一些方面。垃圾收集可以通过调用GC.Col -
Java对象的强、软、弱和虚引用原理+结合ReferenceQueue对象构造Java对象的高速缓存器...
2016-07-24 16:25:001.Java对象的强、软、弱和虚引用 在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象。也就是说,只有对象处于可触及(reachable)状态,程序才能使用它。这 就像在日常生活中... -
java中的强,软,弱,虚引用(及利用软引用实现高速缓存)
2016-01-19 17:18:06在java中引用的类型一共有四种,分别是:强引用,软引用,弱引用和虚引用。 那么他们各自的定义是什么呢? 1.强引用(StrongReference): 强引用是使用最普通的应用。如果一个对象具有强引用,那么gc绝不会回收... -
Java对象的强、软、弱和虚引用原理+结合ReferenceQueue对象构造Java对象的高速缓存器 ...
2014-12-31 14:48:30分类: Android学习 Java复习 2012-09-03 19:03 3160人阅读 评论(2) 收藏 举报 javaoutofmemoryerrorsocketsreferencenull虚拟机 转自:...1.Java对象的强、软... -
缓存和 DB 的一致性保证(一)
2019-03-08 21:12:10弱一致:缓存设定过期时间,过期后自动从db中更新缓存; 强一致:使用分布式锁; 1、线程A先对该key加上分布式锁(锁一定要设置过期时间!!!) 2、线程A删除缓存 (其他线程在查询到缓存数据为空时,尝试去... -
使用WeakReference 与 ReferenceQueue 简单实现弱引用缓存
2013-06-03 08:56:00本文介绍对象的强、软、弱和虚引用的概念、应用及其在UML中的表示。1.对象的强、软、弱和虚引用 在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象。也就是说,只有对象处于可触及...
-
华为1+X认证——网络系统建设与运维(初级)
-
Hive数据仓库之全量表、增量表、快照表、切片表和拉链表
-
使用 Linux 平台充当 Router 路由器
-
最简单的线性回归(一维输入,一维输出)
-
01-虚拟机的安装使用.pdf
-
力扣 51. N 皇后(困难)
-
Kubernetes概述.pdf
-
2019年-华启学院中级通信工程师综合能力真题及答案(完整版).pdf
-
Liunx 优化思路与实操步骤
-
从Docker到Kubernetes之技术实战.pdf
-
1052. 爱生气的书店老板
-
2021-03-01
-
完美解决稀疏卷积报错spconv/box_iou.h:: boost/geometry.hpp:
-
2012-2015年中级互联网技术真题.pdf
-
基于Qt的LibVLC开发教程
-
Unity RUST 逆向安全开发
-
Android Handler源码分析
-
잘났어 정말
-
ansys electronic 19
-
鲇鱼1000-2000.txt