聊一聊HTTP缓存机制
前言
- 在说缓存之前先简单说一下HTTP报文。HTTP报文是在HTTP应用程序之间发送的数据块。报文的结构由起始行、头部(header)和主体(body)组成。报文的类型又有请求报文和响应报文。
缓存
- 当浏览器第一次向服务器请求资源时会去询问服务器这个资源该不该缓存,用什么方法缓存。假设服务器同意浏览器缓存,并告诉浏览器一个资源失效时间,这个时间存放在
Expires
中如:Mon,10 Dec 1990 02:25:22GMT。那么这个资源在这个时间之前都能使用。那么有一个问题是:客户端的时间是可以被修改的,而且客户端和服务器时间未必一致。 - 既然返回一个绝对时间不好用,那么服务器就返回一个相对时间好了,这个时间在
Cache-Control:max-age=300
单位是秒(s)。现在好了300秒内这个资源就不会过期。那么有一种可能是300秒后我再次去服务器拿这个资源发现资源并没有被改变过,服务器又再次返回了同样的资源给我,这样的话就浪费了一次带宽。其实可以返回一条信息给浏览器表明缓存资源可以继续使用。 - 现在回到浏览器第一次请求的时候,服务器响应头中多了一个
ETag:W/"e-cbxLFQW5zapn79tQwb/g6Q"
。这个ETag是服务器根据资源计算出的唯一标识,通常配合max-age
使用。当时间过期以后浏览器会将标识放在请求头中的If-None-Match
,服务器收到请求以后会拿请求中的标识与服务器根据资源计算的Etag进行比较,若一致则返回响应头其中包含状态码304。不一致就返回新的资源。但是在分布式系统中每个机器生成的ETag不一样。 - 既然ETag也不是那么的靠谱,那么服务器第一次返回时在响应头中又加了一个字段
Last-Modified
。当资源过期时浏览器发现资源有Last-Modified
,然后发请求时便在请求头增加了一个字段If-Modified-Since
表示发送的请求时间,服务器拿到这个时间与资源的最后修改时间比较,如果修改时间比较新那么返回新的资源,否则返回Http 304。
补充
1.当Expires
与Cache-Control:max-age
同时存在时max-age的优先级高。
2.[Last-Modified,If-Modified-Since]和[ETag、If-None-Match]经常会放在一起使用。
聊一聊HTTP缓存机制相关推荐
- 聊一聊浏览器缓存机制
相信很多前端童鞋对于浏览器缓存都不太陌生,但是如果没有系统的归纳总结,可能三言两句很难说明白.如何才能完美的回答,这是一个值得思考的问题. 当然,我们不能为了应对面试才去掌握,而应该当作技能储备起来, ...
- Django缓存机制
Django缓存机制三个粒度:1 全站缓存 settings.py 全局配置文件用中间件:MIDDLEWARE = [# 'django.middleware.cache.UpdateCacheMid ...
- MyBatis复习笔记6:MyBatis缓存机制
MyBatis缓存机制 MyBatis 包含一个非常强大的查询缓存特性,它可以非常方便地配置和定制.缓存可以极大的提升查询效率. MyBatis系统中默认定义了两级缓存. 一级缓存和二级缓存. 默认情 ...
- java设置缓存机制
2019独角兽企业重金招聘Python工程师标准>>> java设置缓存机制 所谓缓存,就是将程序或系统经常要调用的对象存在内存中,一遍其使用时可以快速调用,不必再去创建新的重复的实 ...
- Mybait缓存机制
MyBatis同大多数ORM框架一样,提供了一级缓存和二级缓存的支持. 一级缓存:其作用域为session范围内,当session执行flush或close方法后,一级缓存会被清空. 二级缓存:二级缓 ...
- LeetCode实战:LRU缓存机制
背景 为什么你要加入一个技术团队? 如何加入 LSGO 软件技术团队? 我是如何组织"算法刻意练习活动"的? 为什么要求团队的学生们写技术Blog 题目英文 Design and ...
- 微服务架构下静态数据通用缓存机制
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源 | my.oschina.net/u/3971241/bl ...
- 微服务架构下的静态数据通用缓存机制!
什么是静态数据 为什么需要缓存 通用缓存机制 总结 后记 在分布式系统中,特别是最近很火的微服务架构下,有没有或者能不能总结出一个业务静态数据的通用缓存处理机制或方案,这篇文章将结合一些实际的研发经验 ...
- 深入浅出 MyBatis 的一级、二级缓存机制
一.MyBatis 缓存 缓存就是内存中的数据,常常来自对数据库查询结果的保存.使用缓存,我们可以避免频繁与数据库进行交互,从而提高响应速度. MyBatis 也提供了对缓存的支持,分为一级缓存和二级 ...
- ecshop的缓存机制更改
ecshop是一个不错的平台,其中有一些地方可以改进一下 总体上看,就是一个大sql,global变量传来传去的,所有的只要取数据的时候,执行一个sql语句就可以了,但是一些需要缓存的地方,它使用的是 ...
最新文章
- React-生命周期杂记
- #define 的换行问题
- 0x0F19B7EC (ucrtbased.dll)处(位于 ex6.exe 中)引发的异常: 0xC0000005: 写入位置 0x00740000 时发生访问冲突。...
- 【ARM】Tiny4412裸板编程之 printf函数
- TensorFlow 2.0 - Checkpoint 保存变量、TensorBoard 训练可视化
- javascript解析机制——预解析
- 国外虚拟机下linux及mysql常用命令
- 保护公民信息安全 中国在行动
- cdc工具 postgresql_SQLServer CDC数据通过Kafka connect实时同步至分析型数据库 AnalyticDB For PostgreSQL及OSS-阿里云开发者社区...
- MacOSX 下.app支持同时运行多个实例
- 停掉暴风影音stormliv.exe进程
- 鸟哥的linux私房菜 简书,《鸟哥的linux私房菜》学习笔记
- 电子秤PCBA方案的功能及设计
- Web2.0浪潮下的广播电视业
- 怎样用52单片机做计算机,利用串口小助手实现AT89S52单片机简易计算器完整程序(Keil)...
- ps制作动态html,PS制作动态海报教程
- 【Applied Algebra】可满足性模理论(Satisfiability Modulo Theories)入门
- 基于4G工业路由器的智慧厕所管理方案
- 一年中有12个月,每个月的天数是不一样的,其中有7个月为31天称为大月,分别为1,3,5,7,8,10,12月, 有4个月为30天,称为小月,分别为4,6,9,11月,还有二月较特殊,平年的二月有28
- window 10 安装node.js时遇到2502 2503错误解决方法
热门文章
- Hive启动报错: Found class jline.Terminal, but interfac
- 申请XenCenter许可证
- C# Stream 和 byte[] 之间的转换[转]
- IC卡读写器VB.NET源代码
- Java6开发WebService进阶
- 有关DataForm组件的研究_显示多重数据模型集合——Silverlight学习笔记[24]
- ubuntu系统工具记录
- Linux内核中增加一个新的驱动模块
- Audio播放流程(一)---MediaPlayer流程
- Shell脚本定义变量和重新赋值