一、 简述

Web网站一般包含了HTML、CSS、Javascript、Image、Flash等各种各样的资源。如果客户端每次都要去请求这些东西,那么占用的带宽非常大,响应的时间也会非常的长。所以我们有必要对一些网页元素进行缓存。缓存可以用在很多环节中,基本原理是缓存会根据进来的请求保存输出内容的副本,例如html页面, 图片,文件(统称为副本),然后,当下一个请求来到的时候:如果是相同的URL,缓存直接使用副本响应访问请求,而不是向源服务器再次发送请求。

使用缓存主要有2大理由:

l  减少相应延迟:因为请求从缓存服务器(离客户端更近)而不是源服务器被相应,这个过程耗时更少,让web服务器看上去相应更快

l  减少网络带宽消耗:当副本被重用时会减低客户端的带宽消耗;客户可以节省带宽费用,控制带宽的需求的增长并更易于管理。

那么到底哪些请求可以缓存,哪些页面元素可以被缓存,这些内容缓存多长时间呢?这就涉及本文要探讨的问题:缓存策略

二、 缓存的基本规则

1.  如果响应头信息:告诉缓存器不要保留缓存,缓存器就不应该缓存相应内容;

2. 如果请求信息是需要认证或者安全加密的,相应内容也不会被缓存;

3. 如果在响应中不存在校验器(ETag或者Last-Modified头信息),缓存服务器会认为缺乏直接的更新度信息,内容将会被认为不可缓存。

4. 一个缓存的副本如果含有以下信息:内容将会被认为是足够新的

* 含有完整的过期时间和寿命控制头信息,并且内容仍在保鲜期内;

* 服务器近期内已经使用过缓存副本,并且内容的最后更新时间在上次使用期之前;Last-Modified

三、 响应头信息简单介绍

一个典型的http1.1响应头信息:

HTTP/1.1 200 OK
Date: Fri, 30 Oct 1998 13:19:41 GMT
Server: Apache/1.3.3 (Unix)
Cache-Control: max-age=3600, must-revalidate
Expires: Fri, 30 Oct 1998 14:19:41 GMT
Last-Modified: Mon, 29 Jun 1998 02:28:12 GMT
ETag: "3e86-410-3596fbbc"
Content-Length: 1040
Content-Type: text/html

1、 Cache-control

HTTP 1.1引入的头信息属性:Cache-Control响应头信息,让网站的发布者可以更全面的控制他们的内容,并定位过期时间的限制。(在HTTP/1.0中可能部分没实现,仅仅实现了Pragma: no-cache)

有用的Cache-Control响应头信息包括:

* max-age=[秒] — 执行缓存被认为是最新的最长时间。类似于过期时间,这个参数是基于请求时间的相对时间间隔,而不是绝对过期时间,[秒]是一个数字,单位是秒:从请求时间开始到过期时间之间的秒数。

* s-maxage=[秒] — 类似于max-age属性,除了他应用于共享(如:代理服务器)缓存

* public — 标记认证内容也可以被缓存,一般来说: 经过HTTP认证才能访问的内容,输出是自动不可以缓存的;

* Private — 指示对于单个用户的整个或部分响应消息,不能被共享缓存处理。这允许服务器仅仅描述当用户的部分响应消息,此响应消息对于其他用户的请求无效。一般登录后的个性化页面是private的。

* no-cache — 强制每次请求直接发送给源服务器,而不经过本地缓存版本的校验。这对于需要确认认证应用很有用(可以和public结合使用),或者严格要求使用最新数据的应用(不惜牺牲使用缓存的所有好处);HTTP/1.0用Pragma的no-cache替换

* no-store — 强制缓存在任何情况下都不要保留任何副本

* must-revalidate — 告诉缓存必须遵循所有你给予副本的新鲜度的,HTTP允许缓存在某些特定情况下返回过期数据,指定了这个属性,一旦缓存的内容过期,一定要向服务器询问是否有新版本。

* proxy-revalidate — 和 must-revalidate类似,除了他只对缓存代理服务器起作用

举例:Cache-Control: max-age=3600, must-revalidate

2、 Expires

表示存在时间,允许客户端在这个时间之前不去检查(发请求),等同max-age的效果。但是如果同时存在,则被Cache-Control的max-age覆盖。

过期时间头信息属性值只能是HTTP格式的日期时间,HTTP的日期时间必须是格林威治时间(GMT),而不是本地时间。

举例:Expires: Fri, 30 Oct 1998 14:19:41 GMT

3、 Last-Modified/If-Modified-Since

在浏览器第一次请求某一个URL时,服务器端的返回状态会是200,内容是你请求的资源,同时有一个Last-Modified的属性标记此文件在服务期端最后被修改的时间,格式类似这样:

Last-Modified: Fri, 12 May 2006 18:53:33 GMT

客户端第二次请求此URL时,根据 HTTP 协议的规定,浏览器会向服务器传送 If-Modified-Since 报头,询问该时间之后文件是否有被修改过:

If-Modified-Since: Fri, 12 May 2006 18:53:33 GMT

如果服务器端的资源没有变化,则自动返回 HTTP 304 (Not Changed.)状态码,内容为空,这样就节省了传输数据量。当服务器端代码发生改变或者重启服务器时,则重新发出资源,返回和第一次请求时类似。从而保证不向客户端重复发出资源,也保证当服务器有变化时,客户端能够得到最新的资源。

4、 Etag/If-None-Match

HTTP 协议规格说明定义ETag为“被请求变量的实体值” 另一种说法是,ETag是一个可以与Web资源关联的记号(token)。典型的Web资源可以一个Web页,但也可能是JSON或XML文档。服务器单独负责判断记号是什么及其含义,并在HTTP响应头中将其传送到客户端,以下是服务器端返回的格式:

  ETag: "50b1c1d4f775c61:df3"

  客户端的查询更新格式是这样的:

  If-None-Match: W/"50b1c1d4f775c61:df3"

如果ETag没改变,则返回状态304然后不返回,这也和Last-Modified一样。

这两个属性的使用过程如下:

1. 客户端请求一个页面(A)。

2. 服务器返回页面A,并在给A加上一个Last-Modified/ETag。

3. 客户端展现该页面,并将页面连同Last-Modified/ETag一起缓存。

4. 客户再次请求页面A,并将上次请求时服务器返回的Last-Modified/ETag一起传递给服务器。

5. 服务器检查该Last-Modified或ETag,并判断出该页面自上次客户端请求之后还未被修改,直接返回响应304和一个空的响应体。

四、 缓存方案(web缓存)

1、只缓存GET请求,并且响应值是200的数据

2、加密或受保护的套接字不缓存(ssl)请求头里有connect的不缓存。不保存不完整的网页。1.1转成1.0。

3、判断头信息Cache-Control(1.0是Pragma),以下面的顺序

no-cache:不缓存

no-store:不缓存

private:不缓存

max-age=120 代表过期时间是120秒,该数据将在120秒后过期。

4、判断头信息Expires(在Cache-Control没有指定max-age前提下)

过期时间为该属性值。在 Expires 标头字段中的日期必须晚于日期Date。如果是0,代表不缓存。

5、如果以上不成立,默认一个比较长的过期时间。

6、Last-Modified或ETag该如何处理?

判断request的头部是否含有If-Modified-Since、If-None-Match、If-Unmodified-Since、If-Match,如果有,判断缓存中的数据的Last-Modified或ETag和请求中的是否相同,相同的话只要是该数据没有过期,直接返回给客户端304响应。如果以上不成立,则转发请求。

后端http缓存策略相关推荐

  1. 前端web:浏览器静态资源缓存策略

    浏览器静态资源缓存策略 浏览器其实提供了两种控制策略,分别是强制缓存和协商缓存 强制缓存 强制缓存:就是强制使用浏览器缓存下来的资源; 在指定的一段时间内用自己缓存的文件就行,不需要再次发出请求. 具 ...

  2. Java Caching(缓存)-策略和JCache API

    This Article Is From:https://dzone.com/refcardz/java-caching Written byAbhishek GuptaSenior Product ...

  3. 小程序图片缓存策略(不改代码更换OSS图片)

    昨天,后端给我提了一个问题:他更换了CDN上的图片,但是他打开小程序来看,还是旧图片,他尝试过删除小程序,重新进,还是旧图片. 我第一反应是:"你有没有清CDN缓存?" 他说:&q ...

  4. 通过 Node.js 小示例学习浏览器缓存策略

    单纯讲一些理论性的东西可能会很难理解,本文结合一些 Node.js 小示例来学习浏览器缓存策略. 在后端为了加速服务的访问速度,通常可以使用 Memcached.Redis 做数据缓存,那么在浏览器端 ...

  5. 什么是缓存,缓存策略有哪些?

    1.什么是缓存?       ☞ 缓存就是数据交换的缓冲区(称作:Cache),当某一硬件要读取数据时,会首先从缓存汇总查询数据,有则直接执行,不存在时从内存中获取.由于缓存的数据比内存快的多,所以缓 ...

  6. Web开发基本准则-55实录-缓存策略(转)

    原文地址:http://www.cnblogs.com/zhengyun_ustc/p/rule2.html 续上篇<Web开发基本准则-55实录-Web访问安全>. Web开发基本准则- ...

  7. 电子商务网站比较常用的缓存策略架构

    缓存是分布式系统中的重要组件,主要解决高并发,大数据场景下,热点数据访问的性能问题.提供高性能的数据快速访问. 这次主要是分享下自己觉得比较通用的一个缓存策略的架构方案,也是比较 容易理解的.欢迎吐槽 ...

  8. 字节二面,让写一个LFU缓存策略算法,懵了

    LRU全称 "Least Recently Used",最近最少使用策略,判断最近被使用的时间,距离目前最远的数据优先被淘汰,作为一种根据访问时间来更改链表顺序从而实现缓存淘汰的算 ...

  9. okhttp配置缓存策略_网站的缓存控制策略最佳实践及注意事项

    对于一个网站来讲,性能关乎用户体验,你在更短的时间内打开网站,你将会留住更多的用户.如果你的页面十秒才能打开,那再好的用户交互也是徒然. 缓存控制是网站性能优化中至为常见及重要的一环,好的缓存控制,除 ...

最新文章

  1. 警惕黑客破坏网络安全
  2. 简单网页制作html语言,html基本操作,看了这些你就能做简易网页
  3. wpf 点击某控件范围之外的区域 该控件隐藏_iOS平台设计规范(八)控件Controls...
  4. Angular之ngx-permissions的角色管理
  5. bash内部命令-1
  6. android小球移动代码,Android中如何绘制一个跟随手指移动的小球
  7. Tensorflow:variable变量和变量空间
  8. PHP中H5棋牌开发的异常处理
  9. hibernate 逆向工程对数据库进行CRUD操作
  10. 我卖掉北京500万的房产,在老家生活的这两年……
  11. 联想微型计算机拆装图解,联想昭阳e43g拆机教程【详细介绍】
  12. 关于Windows-Linux双系统的启动引导
  13. C语言字符串去空格(最简单版本)
  14. 庄子 “唯至人乃能游于世不避,顺人而不失己。”
  15. 办公技巧 original 设置自适应画布,让图像大小跟图形保持一致
  16. python如何读取下一行_python读取行停止,然后在下一行继续
  17. win10重置此电脑卡在99%的解决方法(6种)
  18. bios设置计算机用户,电脑security设置图解
  19. 快手短视频引流,新手如何运营好快手号:国仁楠哥
  20. 微信扫描二维码调用手机默认浏览器打开APP(APK)应用链接下载

热门文章

  1. linux 运行jar main,Maven打包生成jar包并在linux下启动main方法
  2. php-fpm 的参数,php-fpm启动参数配置详解
  3. lnmp 1.4 mysql_lnmp1.4配置https教程
  4. sql server查询某一字段不重复的数据_初识数据库
  5. 3像素尺寸是多少_纸张的尺寸
  6. 报错,nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException??
  7. 重启服务器导致网站系统错误,win10怎么总是莫名其妙重启?_网站服务器运行维护...
  8. datefromstring 转换不准确_免费的在线OCR工具,将图片内容转换为文本内容
  9. 2017.6.5 YY的GCD 失败总结
  10. python爬取数据情感分析_爬虫再探实战(五)———爬取APP数据——超级课程表【四】——情感分析...