CDN内容更新机制

发布时间:2020-07-07 21:05:57   来源:网络


在很长一段时间里,网站管理员们是很小心“缓存”这件事的,因为怕网上敌友难辨的代理会通过缀存“隐藏”掉他们的用户,让他们难以了解到底有多少人、什么样的人在使用他们的网站。事实上,无论管理员们是否喜欢,网上的代理服务器和用户的浏览器都可能自主启用缓存。幸运的是,他们不用对CDN的Cache有这种担心,CDN只会为希望被缓存的网站服务,才不会傻到去缓存其他非客户网站的内容。
 
网站关于Web cache缓存的另一点担心是怕给用户过期或失效的内容。这就是我们要讨论的问题:如何选择合适的Web cache内容更新机制。好的内容更新机制可以较为准确地判断或预测内容的冷热程度,从而实现高效新旧更替,在有限的存储空间中实现更高的命中率。
 
Web cache内容更新机制主要涉及两方面的内容:哪些内容需要缓存、缓存内容如何更新。这两方面的内容有些是在HTP协议中进行定义(HTTP1.0和HTTP1.1),也有一些由CDN管理平台对Cache进行设置。
 
一般来说,Web cache会遵循以下基本规则。
 
1.如果HTTP响应头信息告诉Cache不要缓存,那么Cache就不会缓存相应内容。
 
2.如果对某内容的请求信息是需要认证或者安全加密的,Cache也不会缓存相应内容。
 
3.如果在HTTP响应中没有ETag或者Last-Modified头信息,Cache会认为缺乏直接的更新度信息,默认该内容不可缓存。
 
4.一个缓存的副本如果含有以下信息,Cache会认为它是足够新的,会直接从绶存中送出,而不会向源服务器发送请求:含有完整的过期时间和寿命控制的头信息,并且内容仍在生存期内。浏览器已经使用过这个缓存副本,并且在同一个会话中已经检查过内容的新鲜度。
 
5.如果缓存的内容副本已经旧了,Cache将向源站服务器请求校验,用于确定是否可以继续使用当前副本继续服务。如果经校验后发现副本的原件没有变化,Cache会避免从源站服务器重新获取副本。
 
根据经验,通常HTML文件、图片、css、xml、js、音频、流媒体等静态资源会被缓存,而动态地址、asp、aspx、py、Jsp、php等动态资源不被缓存。
 
这里我们重点讨论一下Cache与源站服务器之间的校验。
 
校验的概念是在HTTP11中提出的,目的是检验缓存内容是否可用。HTTP1.1把这种验证后再决定是否返回消息内容的方式叫“有条件”的请求返回方法。校验的工作原理如下。
 
(1).源站服务器向Cache返回内容响应消息时,会附带一个验证信息 Cache在缓存内容时保存这个验证信息。
 
(2).当有用户请求该内容时,如果Cache发现缓存内容过期,就使用验证信息生成一个“有条件”的请求来向源服务器请求验证。
 
(3).源服务器在收到这样的请求以后,将请求中包含的验证信息与自已本地的验证信息进行比较。如果两个验证信息相等,那么返回一个带有特定状态码(比如304 Not modified,表示内容未修改过)且消息主体内容为空的响应消息,表示副本可以继续使用;如果两个验证信息不相等,源站服务器就会向Cache传输一个包含新内容的完整响应消息。
 
前面提到了“有条件”的请求,其实所谓“有条件”的请求和普通的请求是一样的,只是它包含了一个特殊的验证信息。并且“有条件”的验证包括正验证和负验证,如果请求中要求服务器与消息附带的验证信息必须相等(使用请求消息的“If-match”头)的则是正验证,如果要求两者不相等(使用请求消息的“if-none-match"头)的是负验证。
 
HTTP1.1协议描述的验证信息主要包括last-modified和Entity tag两种,分别对应了“Last-modified”和“ETag"两个头信息,其中“Last- Modifie属于实体头,ETag属于响应头。通常,不管是“last-modified”还是“ETag”,这些验证信息都是由源服务器在产生实体内容或者内容更新时一起产生的,然后在返回内容时起返回给提出请求的Cache。
 
在对内容是否发生变化进行验证时,如果缓存内容在“last-modified”所标识的时间之后没有被修改过,则认为它是有效的,所以“Last- Modified"是种有效的验证信息。一般“last-modified”头的值可以被包含在请求头if-modified-since”和“if-unmodified- Since"中。
 
last-modified”在时间精度上有一定的缺陷,因为HTTP协议的时间值是以秒为单位的,如果一个响应消息在一秒内被修改了两次,那么通过这个来验证某个内容是否发生变化就不准确了。在这种情况下可以用另外一个验证信息“ETag”。“ETag”可以由源服务器指定计算方法,根据访问的内容来生成,它是一个不透明的验证信息。请求消息在要求源服务器进行验证时,可以将“ET吗的值包含在请求头“if-match”、“if-none-Match”或“if-rance中。
 
验证可以分为强验证或弱验证。强验证是要验证所访问内容的每一个字节都没有变化,因为有任何的变化都会使相应的验证信息发生变化;而弱验证只验证所访问内容的语义有没有发生大的变化,验证信息只有在内容语义有明显改变时才会发生变化。弱验证信息可以应用于不要求精确一致的情况下,通常一个访问内容的修改时间可以被认为是弱验证信息强验证信息应用比较广泛,比如使用ETag,几乎所有的场合都可以用。如果用户提交的请求只需要验证实体内容的一部分是否发生了改变,那么应该使用强验证以获得正确的数据。
 
所有新一代的Web源服务器都对静态内容(比如文本文件)自动生成ETag和Last- Modified头信息,源站运营者不必做任何额外的设置。但是,源服务器对于动态内容(例如CGI、ASP或数据库生成的网站),并不知道如何生成这些信息,这就需要源站运营者自己考虑进行设置。像ASP、JSP或PHP源站吐出的动态内容,需要由ASP、JSP、PHP脚本程序控制HTTP协议返回头字段属性。对于那些频繁变化的内容,比如电子商务网站上关于某热
销产品的评论,或者体育赛事的即时比分文件,源站会告诉浏览器不要缓存,但会通过设置max-age告诉 Cache缓存1秒,这样算是在动态和缓存之间取一个折中吧。
 
网站的开发者们应该尽量让自己的网站级存友好,这里不妨再讲述几条对于源站的建议。
 
1.尽量保持内容URL稳定:如果在不同的页面上提供相同的内容,应该使用相同的URL,这使网站内容便于被缀存。
 
2.使用公共库存放每页都引用的元素,可以提高缓存效率。
 
3.对于不经常改变的图片和其他页面元素,给cache-control:max-age属性设置一个较长的过期时间,这样可以尽可能多地利用Cache的缓存。
 
4.对定期更新的内容设量一个Cache可识别的Cache-Control:max-age过期时间。
 
5.只在必要的时候使用Cookie,Cookie是非常难被缓存的,如果使用Cookie,控制在动态网页上。
 
6. 尽量避免使用POST,除非万不得已。POST模式的返回内容通常不会被Cache缓存,使用GET模式会好很多。
 
CDN互联专业提供国内外高防cdn加速服务
 
猜你喜欢
延伸阅读: