客户端会为资源标记上该信息,下次再次请求时,会把该信息附带在请求头中一并带给服务器去做检查,若传递的时间值与服务器上该资源最终修改时间是一致的,则说明该资源没有被修改过,直接返回304状态码,内容为空 。
如果两个时间不一致,则服务器会发回该资源并返回200状态码,和第一次请求时类似 。这样保证不向客户端重复发出资源,也保证当服务器有变化时,客户端能够得到最新的资源 。
文章插图
也类似ETag,客户端请求报文头,两种参数
1、If-Modified-Since: Last-Modified-value
If-Modified-Since: Sun, 28 Apr 2019 02:23:05 GMT当前各浏览器均是使用的该请求参数来向服务器传递保存的 Last-Modified 值 。
该请求首部告诉服务器如果客户端传来的最后修改时间与服务器上的一致,则直接回送304 和响应报头即可 。
2、If-Unmodified-Since: Last-Modified-value
该值告诉服务器,若Last-Modified没有匹配上(资源在服务端的最后更新时间改变了),则应当返回412(Precondition Failed) 状态码给客户端 。Last-Modified 存在一个问题,如果在服务器上,一个资源被修改了,但其实际内容根本没发生改变,但修改时间变化了,会导致Last-Modified时间匹配不上而返回了整个实体给客户端(跟客户端缓存里有个一模一样的资源);就是错误的判断内容改变了 。
请求流程图
文章插图
上面的图就是总结了一下之前所讲的,比较容易理解,不理解回头重新看 。
浏览器刷新方式1、在URI输入栏中输入然后回车
看cache-control对应的max-age是否有效,根据上面的流程图,进入协商机制2、F5/点击工具栏中的刷新按钮/右键菜单重新加载
去掉max-age或设置max-age=0,进入上面的流程图,进入协商机制3、Ctl+F5/commond+shift+R
去掉cache-control和协商头,不管有没有缓存,强制刷新,都要到Server服务器上面获取数据,返回200状态码协商机制再次说明:比较ETag和Last-Modified到服务端,若服务端一致,没有变化,则返回状态码304,不返回数据;否则返回状态码200,返回数据 。
动态数据根据上面的知识,我们去取动态数据时(如:ajax动态请求),服务端就可以利用上面的规则控制客户端不要缓存,设置cache-control为max-age=0;且不设置ETag和Last-Modified就可以达到不缓存;反之如果要缓存数据,设置相关的值就行了 。
CDN自定义缓存策略1、可自定义目录的过期时间
不管源服务器的缓存过期是什么规则,CDN服务自定义目录过期时间,假如1个小时,那1个小时后,CDN设置的缓存目录里面的内容会过期,会再去源服务器那边获取新的信息(简称回源) 。2、可自定义后缀名过期时间
可根据后缀名设置缓存策略,如:html、js、css等3、可自定义对应权重
如设置了后缀名的权重比目录过期高,那么就遵循后缀名过期规则4、可通过界面或API强制CDN对应的目录进行刷新(不一定会成功)
总结现在的CDN产品已经比较成熟,有后台控制台管理进行缓存的配置,如果需要程序控制相关的缓存过期规则,可以用上面介绍的知识点配合使用 。今天老顾就介绍到这里,谢谢!!!
推荐阅读
- Nginx网站使用CDN之后禁止用户真实IP访问的方法
- 6个常见的高并发缓存问题,你知道几个?
- 干茶含水量般控制在
- 风险防控怎么做 平台公司风险控制措施
- 防御DDOS攻击选高防CDN还是高防IP
- CDN原理 CDN技术是什么
- 没看这篇干货,别说你会使用“缓存”
- 控制欲太强的家庭,是一场灾难
- 图解一致性哈希算法,分布式缓存就是这么简单
- 投屏+电视盒+语音控制 电视果5S PLUS 奇异果特别版测评