简述http缓存

简介

网站性能第一优化定律:优先考虑使用缓存优化性能。合理的使用缓存,对网站的性能优化的意义重大。以下对于缓存,都是指http缓存。

缓存的优点

使用缓存能节约带宽,能降低后端服务器的访问压力,如果把缓存放在离用户越近的地方,那能极大的加快响应的速度。

哪些数据应该被缓存

网站数据访问遵循二八定律,即80%的访问落在20%的数据上,缓存主要用来存放那些读写比高,变化少的数据。根据数据性质有分为私有数据和公共数据,私有数据指例如用户账号密码信息等数据或带有用户cookie的数据,此类数据一般不缓存,对于公共数据,一般缓存热区数据,热区数据指那些经常被访问到的数据,缓存下来后,命中率高。热区数据需要通过“热身”生成,而“热身”是需要时间的,所以在大型站点中上线缓存服务器前,为了加快缓存热身,会复制线上流量对缓存做压测,构建热区数据,然后再上线。
并且对于动态生成的数据,一般也不缓存,当然不是所有的动态数据都不能缓存,有些动态数据其实是可以静态化的,在生产环境中,把动态数据转成静态,也是一种有效的优化手段。

缓存的特征

前面说了,并不是所有数据都应该被缓存,被缓存的数据一般都具有以下的特征

  • 时间局部性
    时间局部性是指,一个数据被访问过后,可能很快的将会被再次访问。此类缓存往往命中率高。
  • 空间局部性
    空间局部性是指,一个数据被访问时,该数据周边的数据也可能会被访问到,所以预加载到缓存中,加快速度。

缓存的有效性

缓存的有效性一般使用缓存命中率来指标衡量,缓存命中率计算公式:
缓存命中率=hit/(hit+mixx)
hit=缓存被命中
miss=缓存没命中
衡量缓存命中率的方法有2个
页面命中率:从命中的页面数量衡量
字节命中率:基于大小进行衡量

缓存的有效判断机制

数据被缓存下来后,并不是一直都是有效的,缓存作用仅仅是为了加速,当用户有请求来了以后,我们应该确保回应的缓存有效的,对于http缓存是否有效,一般用以下两种方法判断缓存是否有效。过期时间和条件式请求。过期时间容易理解,就是缓存设置一个过期时间,一但过期,则清除,而条件式请求是指,当请求到来以后,如果本地有缓存的话,先发报文到后端服务器,询问该缓存是否有效,如果有效,则用次缓存回复给客户端。不过一般都是把2个判断机制联合起来使用,即缓存如果没到期,直接使用缓存响应,如果缓存到期之后,发送条件式请求给后端,询问该缓存是否继续生效。

http报文首部控制缓存的字段

http报文分为“请求报文”和“响应报文”,2种报文对于缓存的控制是有区别的。
前面说了缓存的有效判断机制可以是过期时间和条件式请求。
过期时间:Expires
对于HTTP/1.0,对于缓存的控制只有Expires字段,由响应报文返回该字段内容,内容是以绝对时间,例如:


image_1chnb15tg1a6eho1fadu4vnpf9.png-27.5kB
image_1chnb15tg1a6eho1fadu4vnpf9.png-27.5kB

如图,由服务器响应的报文种,指定了该数据能缓存到2027年。

后来在HTTP/1.1种增加了Cache-Control字段,能更灵活的控制缓存。

请求报文的Cache-Control

请求报文关于缓存的字段作用是用于通知缓存服务器如果使用缓存来响应请求
Cache-Control常见的指令

cache-request-directive = 
    "no-cache"  #当字段内容包含no-cache时,表示不能用缓存响应该请求         
    "max-age"   #请求报文的max-age通常用于条件式请求,即向服务器询问该缓存是否可用.
    

响应报文的Cache-Control

响应报文关于缓存的字段作用是指示如何存储服务器的响应的内容。
Cache-Control常见的指令

cache-response-directive =
    "no-cache"  #可缓存,但响应给客户端之前需要revalidation,即必须发出条件式请求进行缓存有效性验正;
    "no-store"  #不允许存储响应内容于缓存中;  
    "public"    #用于指示该资源是公共数据
    "private"   #用于指示该资源是私有数据
    "max-age"   #用于指示该资源能被缓存多久,相对时间
    

条件式请求(新鲜度检查)

条件式请求通常用于向服务器询问该资源是否有效,常见的条件式询问指令有2个,能用于请求报文和响应报文种,但它们的意思是不一样的.

Last-Modityed/If-Last-Modityed

通常,在服务器回复的响应报文种,会携带该资源的时间戳,如图:


image_1chncfpb912om4fi22043g1cj4m.png-54.7kB
image_1chncfpb912om4fi22043g1cj4m.png-54.7kB

如果客户端要发送条件式请求时,在请求报文中,Cache-Control设置为:max-age=0,并且在首部中添加If-Last-Modityed字段,内容是服务器响应时的Last-Modityed值.意思就是要求服务器把该资源的最后修改时间和客户端提供的时间是否一致,如果一致,则返回状态码304(not modityed),如果有更新,则发送状态码200,并且把新资源响应给客户端.

Etag/If-None-Match

在服务器响应的报文中,也可以使用Etag标记,Etag是hash出来的,所以是第一无二的.如图:


image_1chncssf814m6ukrvr815mpiib13.png-33.6kB
image_1chncssf814m6ukrvr815mpiib13.png-33.6kB

如果客户端要发送条件式请求时,在请求报文中,Cache-Control设置为:max-age=0,并且在首部中添加If-None-Match字段,服务器会匹配客户端发来的和本地的Etag是否一致,如果一致,则返回304

有了时间戳为什么还需要Etag呢?

1、一些文件也许会周期性的更改,但是他的内容并不改变(仅仅改变的修改时间),这个时候我们并不希望客户端认为这个文件被修改了,而重新GET;
2、某些文件修改非常频繁,比如在秒以下的时间内进行修改,(比方说1s内修改了N次),If-Modified-Since能检查到的变化时秒为单位的,这种修改无法判断。因此需要Etag来判断。
3、某些服务器不能精确的得到文件的最后修改时间;

如果Last-Modified与ETag一起使用时,优先验证ETag;为了兼容HTTP/1.0,报文还有Expires字段,但它的优先级低于Last-Modified.
总结:优先级
ETag>Last-Modified>Expires

http缓存总结

当浏览器第一次发送http请求时,本地一般没有改资源的缓存,所以请求会发到服务器上获取对应资源,服务器在构建响应报文时,通过Cache-Control向客户端说明对于该资源的缓存控制,要如何进行,客户端根据响应报文,下次再请求该资源时,如果该缓存未过期,则直接从缓存中读取,如果过期,发送条件式请求到服务器询问该资源是否有效,如果有效,服务器返回304,缓存继续有效,如果失效,则响应200,和新的资源.

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容