通常对静态的资源,内存缓存/磁盘缓存1、原理: 在首次请求后,保存一份请求资源的响应副本,当用户再次发起相同请求后,如果判断缓存命中,则拦截请求,将之前存储的相应副本返回给用户,从而避免重新向服务器发起资源请求。
2、缓存的技术种类: 代理缓存,浏览器缓存,网关缓存,负载均衡器,内容分发网络
它们大致可以分为两类: 共享缓存,私有缓存
- 共享缓存:缓存的内容可以被多个用户使用。如公司内部架设的内部Web代理
- 私有缓存:只能单独被用户使用的缓存。如浏览器缓存
Expires
和Pragma
消息头。Cache-Control: no-store
4、http缓存可分为强制缓存和协商缓存
- 强制缓存不用判断缓存是否过期,可以直接使用。
- 协商缓存每次都要询问一下服务器,看一下内容有没有更新,如果没有更新就使用缓存中的资源,如果更新了就继续请求
文章图片
expires(http1.0版本)4.1、cache-control(http1.1)
cache-control
属性值:- no-cache 强制进行协商缓存
- no-store 不缓存
- max-age 表示缓存的过期时长
'cache-control': 'max-age=5' // 滑动时间,单位是秒
- private, public: 用以明确响应资源是否可以被代理服务器缓存。
- private 只能被浏览器缓存
- public 响应资源既可以被浏览器私有缓存,又可以被代理服务器公共缓存
cache-control: public, max-age=10;
文章图片
文章图片
文章图片
last-modified: ''
if-modified-since:
cache-control: no-cache
原理:是根据资源最后的修改时间来判断是否需要读取缓存
根据时间判断有局限性,比方说只改变文件命名,也会引起资源修改时间发生变化,但是对资源本身并没有改动4.2、?补充的方案是ETag(根据文件资源生成指纹)
- 安装
npm i etag
- 使用
const etag = require('etag')const data = https://www.it610.com/article/fs.readFilSeync('./img/04.jpg')
const etagContent = etag(data)const ifNoneMatch = req.headers['if-none-match']if (ifNoneMatch === etagContent) {
res.statusCode = 304
res.end()
return
}res.setHeader('etag', etagContent)
res.setHeader('Cache-Control','no-cache')
res.end(data)
- If-None-Match
- 强验证Etag,资源细微的改动都会引起指纹的变化
- 弱验证ETag, 相对灵活的过滤资源的某些变化
不会向服务器发送请求,直接从缓存中读取资源,在chrome控制台的Network选项中可以看到该请求返回200的状态码,并且Size显示
from disk cache
或from memory cache
。设置:
强缓存可以通过设置两种
HTTP Header
实现,分别是:Expires
和 Cache-Control
。Expires 是http1.0的产物,Cache-Control是http1.1的产物,两者同时存在的话,Cache-Control优先级高于Expires;6、协商缓存 介绍:
协商缓存就是强制缓存失效后,浏览器携带缓存标识向服务器发起请求,由服务器根据缓存标识决定是否使用缓存的过程,主要有以下两种情况:
- 协商缓存生效,返回
304
和Not Modified
- 协商缓存失效,返回
200
和请求结果
协商缓存可以通过设置两种 HTTP Header 实现, 分别是:
Last-Modified
和 ETag
。7、缓存机制
- 强制缓存优先于协商缓存进行,若强制缓存(Expires和Cache-Control)生效则直接使用缓存,若不生效则进行协商缓存(
Last-Modified / If-Modified-Since和Etag / If-None-Match
) - 协商缓存由服务器决定是否使用缓存,若协商缓存失效,那么代表该请求的缓存失效,返回200,重新返回资源和缓存标识,再存入浏览器缓存中;生效则返回304,继续使用缓存。
文章图片
文章图片
持续更文,关注我,你会发现一个踏实努力的宝藏前端,让我们一起学习,共同成长吧。
喜欢的小伙伴记得点赞关注收藏哟,回看不迷路
欢迎大家评论交流, 蟹蟹
【http缓存】本文由mdnice多平台发布
推荐阅读
- 我是咖啡师,在软件公司上班|ONES 人物
- 最佳实践|成都 Meetup |分布式数据库,企业降本增效新引擎
- java|程序员网吧写代码挨顿打(网友(想笑死我继承我的花呗?))
- Java|某程序员在网吧敲代码,出类拔萃,网友(为何我被打的却是我)
- 程序员|程序员在网吧写代码被打(网友(带个U盘你就以为网吧是自家的?))
- python|Python爬虫自动化爬取b站实时弹幕实例方法
- 阿里云的认证是不是最好的(考起来难不难?)
- 淘宝PC改版!我们跟一位背后付出6年的男人聊了聊……
- 读书笔记(《刑法学讲义》(一))