后端http缓存策略
一、 简述
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缓存策略相关推荐
- 前端web:浏览器静态资源缓存策略
浏览器静态资源缓存策略 浏览器其实提供了两种控制策略,分别是强制缓存和协商缓存 强制缓存 强制缓存:就是强制使用浏览器缓存下来的资源; 在指定的一段时间内用自己缓存的文件就行,不需要再次发出请求. 具 ...
- Java Caching(缓存)-策略和JCache API
This Article Is From:https://dzone.com/refcardz/java-caching Written byAbhishek GuptaSenior Product ...
- 小程序图片缓存策略(不改代码更换OSS图片)
昨天,后端给我提了一个问题:他更换了CDN上的图片,但是他打开小程序来看,还是旧图片,他尝试过删除小程序,重新进,还是旧图片. 我第一反应是:"你有没有清CDN缓存?" 他说:&q ...
- 通过 Node.js 小示例学习浏览器缓存策略
单纯讲一些理论性的东西可能会很难理解,本文结合一些 Node.js 小示例来学习浏览器缓存策略. 在后端为了加速服务的访问速度,通常可以使用 Memcached.Redis 做数据缓存,那么在浏览器端 ...
- 什么是缓存,缓存策略有哪些?
1.什么是缓存? ☞ 缓存就是数据交换的缓冲区(称作:Cache),当某一硬件要读取数据时,会首先从缓存汇总查询数据,有则直接执行,不存在时从内存中获取.由于缓存的数据比内存快的多,所以缓 ...
- Web开发基本准则-55实录-缓存策略(转)
原文地址:http://www.cnblogs.com/zhengyun_ustc/p/rule2.html 续上篇<Web开发基本准则-55实录-Web访问安全>. Web开发基本准则- ...
- 电子商务网站比较常用的缓存策略架构
缓存是分布式系统中的重要组件,主要解决高并发,大数据场景下,热点数据访问的性能问题.提供高性能的数据快速访问. 这次主要是分享下自己觉得比较通用的一个缓存策略的架构方案,也是比较 容易理解的.欢迎吐槽 ...
- 字节二面,让写一个LFU缓存策略算法,懵了
LRU全称 "Least Recently Used",最近最少使用策略,判断最近被使用的时间,距离目前最远的数据优先被淘汰,作为一种根据访问时间来更改链表顺序从而实现缓存淘汰的算 ...
- okhttp配置缓存策略_网站的缓存控制策略最佳实践及注意事项
对于一个网站来讲,性能关乎用户体验,你在更短的时间内打开网站,你将会留住更多的用户.如果你的页面十秒才能打开,那再好的用户交互也是徒然. 缓存控制是网站性能优化中至为常见及重要的一环,好的缓存控制,除 ...
最新文章
- 警惕黑客破坏网络安全
- 简单网页制作html语言,html基本操作,看了这些你就能做简易网页
- wpf 点击某控件范围之外的区域 该控件隐藏_iOS平台设计规范(八)控件Controls...
- Angular之ngx-permissions的角色管理
- bash内部命令-1
- android小球移动代码,Android中如何绘制一个跟随手指移动的小球
- Tensorflow:variable变量和变量空间
- PHP中H5棋牌开发的异常处理
- hibernate 逆向工程对数据库进行CRUD操作
- 我卖掉北京500万的房产,在老家生活的这两年……
- 联想微型计算机拆装图解,联想昭阳e43g拆机教程【详细介绍】
- 关于Windows-Linux双系统的启动引导
- C语言字符串去空格(最简单版本)
- 庄子 “唯至人乃能游于世不避,顺人而不失己。”
- 办公技巧 original 设置自适应画布,让图像大小跟图形保持一致
- python如何读取下一行_python读取行停止,然后在下一行继续
- win10重置此电脑卡在99%的解决方法(6种)
- bios设置计算机用户,电脑security设置图解
- 快手短视频引流,新手如何运营好快手号:国仁楠哥
- 微信扫描二维码调用手机默认浏览器打开APP(APK)应用链接下载
热门文章
- linux 运行jar main,Maven打包生成jar包并在linux下启动main方法
- php-fpm 的参数,php-fpm启动参数配置详解
- lnmp 1.4 mysql_lnmp1.4配置https教程
- sql server查询某一字段不重复的数据_初识数据库
- 3像素尺寸是多少_纸张的尺寸
- 报错,nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException??
- 重启服务器导致网站系统错误,win10怎么总是莫名其妙重启?_网站服务器运行维护...
- datefromstring 转换不准确_免费的在线OCR工具,将图片内容转换为文本内容
- 2017.6.5 YY的GCD 失败总结
- python爬取数据情感分析_爬虫再探实战(五)———爬取APP数据——超级课程表【四】——情感分析...