HTTP 缓存技术 - 认识缓存

简介: HTTP 缓存技术 - 认识缓存

HTTP 缓存技术 - 认识缓存

缓存技术出现在HTTP1.1当中,目的是尽可能的减少对于服务器进行请求。为了实现缓存技术,HTTP设计者在头部字段增加针对缓存的头部字段。HTTP 缓存有两种方式,强制缓存协商缓存

认识缓存

介绍具体的缓存技术之前首先我们先来认识一下HTTP中的缓存特点。

值得需要注意的是缓存是只对获取文件有效,从服务器上拿到文件然后放入本地缓存,下次再获取条件允许则从本地缓存区获取文件,这样可以减轻服务器压力。

缓存没有实际上并没有一套强制要求和限制,而是通过几个请求字段的配合,按照一定的判断流程控制。

HTTP1.1主要通过下面三个请求头部信息判定缓存:

  • Cache-Control:服务器可以返回此字段指定浏览器和中间缓存应该存活多久。
  • ETag:浏览器缓存过期的时候,通过Etag令牌检查文件是否出现改变。Etag是比对内容(文件哈希)对比差异。
  • Last-Modified:和Etag用途相同,但是它是基于时间的策略检查是否更改。

这三个字段基本囊括大部分HTTP缓存技术的应用场景。

缓存位置

缓存位置通常存在下面几种:

  • Service Work
  • Memory Cache
  • Disk Cache(常用)
  • Push Cache

Service Work

通常运行在浏览器的后台,主要功能是实现缓存,使用此组件需要请求协议为HTTPS,因为Service Work 本身会拦截请求,需要 HTTPS保证安全才能使用。

Memory Cache

内存中的缓存,主要是当前页面已经捕获的资源。比如图片,脚本等,这种方式要比Disk Cache 要快上非常多,但是注意这个缓存寿命非常短,一旦关闭Tab,内存会随着页面的关闭立马释放。

内存缓存中有一块重要的缓存资源是 preloader 相关指令,也是页面优化的手段之一,可以做到解析脚本和CSS文件的同时请求下一个资源。

Disk Cache

Disk Cache 存在于磁盘的缓存,读取虽然慢一点,但是可以实现持久化存储,并且容量比内存缓存要宽泛很多。

DISK CACHE的覆盖面在浏览器中占用比重很大,通常结合HTTP头部字段进行判断,如果跨站点下载文件,已经下载过的文件不会再次请求,而是直接从Disk Cache 获取。

如何判断缓存进内存还是进磁盘? 通常有两个依据:

  1. 如果是大文件,通常会进入磁盘当中进行缓存
  2. 如果是频繁访问的文件,也会放入磁盘

Push Cache

推送缓存是HTTP/2 新加入的内容,上面三种没有命中的时候才会尝试使用。它是会话级别缓存。一旦会话结束,也会释放缓存,生命周期只比内存缓存长一点点。

缓存过程

缓存的大致流程如下:

  1. 客户端发起HTTP请求访问浏览器缓存,浏览器不存在缓存,告知客户端。
  2. 客户端再次发起HTTP请求到原始服务器,原始服务器返回结果和缓存规则。
  3. 客户端再次发起请求,从浏览器的缓存中获取请求结果。

注意第一步是隐式处理的,但是可以在本地临时缓存文件中摸索导处理流程。缓存过程有两个要点:

  • 每次请求都会检查浏览器是否存在缓存标识,以及请求的缓存结果。
  • 如果没有特殊字段禁用缓存,缓存将会把请求结果和缓存表示存在浏览器缓存当中。

缓存判定主要依赖两项技术:强制缓存协商缓存,也是HTTP缓存技术的要点。将在下文进行进行介绍。

Pragma 头部

Pragma 于 HTTP1.0 中定义,单词含义叫做“编译指令”,几乎可以包含任何内容,目的是再给浏览器发送请求,但是主要的应用场景是缓存操控。

Pragma主要作用是保持 HTTP1.0 向后兼容,因为缓存技术是在HTTP1.1中才出现的。

比如让一些HTTP1.0的源服务识别客户端理解”无缓存“的请求头部。当缓存当中请求头部存在并且被理解时,Pragma 头部会被忽略掉。

Pragma 如果被发送,将会应用于所有的应用程序和客户端。如果存在HTTP1.1缓存技术的相关请求头部字段,在服务器可以识别的前提下,会优先解析HTTP1.1的请求头部,从而忽略Pragma头部。

但是这里介绍的所有内容内容都是 HTTP1.0 约定俗成的东西。HTTP1.0 本身不能算作标准,只能算作“草稿”,所以 Pragma 既没有明确规范,也没有可靠性,现在的网络环境这个字段基本不用了。仅仅是有可能的向后兼容场景中用到。

介绍这些内容,只是让大家知道点历史。

Pargma 头部使用方式

基本语法  Pragma: 1# pragma-directive 举例  Pragma: no-cache(实际上也是唯一取值)


相关文章
|
1月前
|
测试技术 网络架构
【技术干货连载 一】业务经过WAF HTTP 400问题排查
教你如何排查和解决业务经过WAF 七层代理HTTP 400问题原因?
34 1
|
3月前
|
存储 缓存 前端开发
HTTP的缓存机制是什么?
HTTP的缓存机制是什么?
28 1
|
2月前
|
存储 缓存 NoSQL
作者推荐 | 企业级缓存技术解析,你必须知道的“9“大技术问题与常见误区
本文将深入剖析导致上述问题的九大根源,并提供相应的解决方案。请注意,本文以Java为例进行代码演示,但同样适用于其他技术平台的朋友。只需根据相应技术平台替换相关代码即可!
456 0
作者推荐 | 企业级缓存技术解析,你必须知道的“9“大技术问题与常见误区
|
2天前
|
存储 缓存 开发框架
Flutter的网络请求:使用Dart进行HTTP请求的技术详解
【4月更文挑战第26天】了解Flutter网络请求,本文详述使用Dart进行HTTP请求
|
4天前
|
存储 缓存 运维
软件体系结构 - 缓存技术(5)Redis Cluster
【4月更文挑战第20天】软件体系结构 - 缓存技术(5)Redis Cluster
136 10
|
4天前
|
存储 缓存 NoSQL
软件体系结构 - 缓存技术
【4月更文挑战第20天】软件体系结构 - 缓存技术
36 7
|
30天前
|
缓存 应用服务中间件 数据库
【分布式技术专题】「缓存解决方案」一文带领你好好认识一下企业级别的缓存技术解决方案的运作原理和开发实战(多级缓存设计分析)
【分布式技术专题】「缓存解决方案」一文带领你好好认识一下企业级别的缓存技术解决方案的运作原理和开发实战(多级缓存设计分析)
37 1
|
1月前
|
存储 NoSQL Redis
陌陌技术分享:陌陌IM在后端KV缓存架构上的技术实践
在本文中,陌陌数据库负责人冀浩东将聚焦探讨陌陌的 KV 系统架构选型思路,深入解析如何进行此类系统的甄选决策,同时进一步分享陌陌团队在采用 OceanBase(OBKV)过程中所经历的探索与实践经验。
33 0
|
1月前
|
存储 数据采集 负载均衡
建立HTTP代理IP池的技术和工具支持
建立HTTP代理IP池的技术和工具支持
45 0
|
3月前
|
Go
深度探讨 Golang 中并发发送 HTTP 请求的最佳技术
深度探讨 Golang 中并发发送 HTTP 请求的最佳技术
85 0