Head Frist Web缓存

2018-06-06  本文已影响31人  tangyefei

参考资源

关于缓存的文章能搜索到很多,标题通常包含关键字 HTTP缓存浏览器缓存Web缓存。本篇尝试以易懂的、容易操作方式介绍Web缓存的基础知识。

1. 通用概念

1.1 什么是Web缓存

顾名思义Web缓存就是一个Web资源(html、js、图片等)在客户端和服务器之间的副本。研究Web缓存就是研究它们的机制,然后在实际应用中通过合理使用Web缓存提高便利性。

1.2 Web缓存的分类

Web缓存的分类可以按照数据请求过程分为:

其中,HTTP缓存在实际应用受到的关注最多,也是本篇重点介绍的部分。

1.3 Web缓存的作用

2. 准备

2.1 HTTP基础

2.1.1 HTTP的请求报文

2.1.2 响应报文中的状态码

记录在HTTP中的规范多大40多种,最近常使用的有14中,用途的大致介绍如下:

后文中需要特别留意的是200和304状态,分别表示请求正常返回和使用浏览器的缓存。

2.2 调试工具Fiddler

2.2.1 安装和配置Fiddler

Fiddler是一款流行的抓包工具,最初只运行在Windows上,但是现在也提供了在其他环境的安装包,但是需要首先安装Mono,基于Mono才能运行Fiddler。如果是在Mac上,可以参考如下这篇文章对Fiddler进行配置:

注:原文存在一些问题和说明不够细致的地方,如下步骤有所补充说明

// 下载受信任的证书
/Library/Frameworks/Mono.framework/Versions/5.10.1/bin/mozroots --import --sync

// 打开.bash_profile 文件
sudo vi ~/.bash_profile

// 增加执行目录
export MONO_HOME=/Library/Frameworks/Mono.framework/Versions/5.10.1
export PATH=$PATH:$MONO_HOME/bin

// 使.bash_profile应用有效
source ~/.bash_profile

2.2.2 使用Fiddler

运行Fiddler以后,可以看到所有的请求的报文信息,也可以在Fiddler下的执行命令行中输入形如 bpu localhost:8080的命令来调试特定的请求。比如我们访问了 localhost:8080以后,Fiddler会默认在Request请求中出现断点。

可以修改请求首部,也可以通过break on response将断点停在响应中来修改响应首部,也可以直接break complete跳过断点。

如上的使用方法可以用来对下文中提到的各种缓存首部字段进行模拟,从而模拟出效果。

3. HTTP缓存

2.1 HTTP缓存的的分类

强缓存

浏览器在加载资源时,先根据这个资源的一些首部判断它是否命中,如果命中,浏览器直接从自己的缓存中读取资源,不会发请求到服务器。

协商缓存

当强缓存没有命中的时候,浏览器一定会发送一个请求到服务器,通过服务器端依据资源的另外一些首部验证这个资源是否命中协商缓存,如果协商缓存命中,服务器会将这个请求返回,但是不会返回这个资源的数据,而是告诉客户端可以直接从缓存中加载这个资源。

一些特点

2.2 强缓存

在Chrome浏览器上打开常用的站点,打开network查看请求,可以看到请求的返回状态是200,但是size一栏显示的是 from disk cache 或 from memory cache的请求,这些请求的响应就属于命中了强缓存。

2.2.1 强缓存的实现

强缓存是利于ExpiresCache-Control这两个通用首部中的字段来控制的。这两个首部字段可以都使用也可以只启用一个,同时存在时Cache-Control的优先级更高。

Expires

Cache-Control

2.2.2 强缓存的配置

(1)可以通过代码来设置是否启用强缓存。

java.util.Date date = new java.util.Date();    

response.setDateHeader("Expires",date.getTime()+20000); // 缓存一定时间
response.setDateHeader("Expires", 0);   // 不缓存

// 浏览器和缓存服务器都(public:可以缓存, no-cache:不缓存)
response.setHeader("Cache-Control", "public/no-cache"); 

(2)也可以通过Web服务器来设置是否启用强缓存

多数服务器都提供了配置项可以对是否启用强缓存进行配置,使用时可自行查阅。

2.3 协商缓存

在Chrome的network中查看请求,发现不少是状态为304状态描述为Not Modified,这意味请求命中了协商缓存。

2.3.1 协商缓存的实现

当浏览器请求某个资源没有命中强缓存,就会发请求到服务器去验证协商缓存,如果命中,服务器会返回304告知浏览器使用协商缓存,即使用浏览器的缓存中加载。

协商缓存可以使用 Last Modified 和 If-Modified-Since,以及 Etag 和 If-None_match 这两种方式来实现。

Last Modified 和 If-Modified-Since

ETag 和 If-None-Match

说明:

2.3.2 协商缓存的管理

多数Web服务器都会开启协商缓存,并且是同时启用 Last Modified 和 If-Modified-Since,以及 ETag 和 If-None-Match

分布式系统应该保证多台机器的文件Last-Modified一致,应该尽量关闭掉ETag(因为每台机器生成的ETag都不一样),否则会导致对比失败。

协商缓存必须配合强缓存一起使用,因为不设置强缓存,意味着协商缓存每次都要请求服务器资源会加大服务器的负荷。

2.4 缓存的实践

实践中的积累太少,需要在开发中不断积累实例,待补充...

3 应用层(浏览器)缓存

3.1 应用层缓存介绍

3.1.1 manifest

manifest离线缓存技术是为了在网络连接断开时候也能正常浏览网站,因为设计实时的数据请求部分无法缓存,因此该技术的适用场景有限,即只适用于哪些内容相对固定的页面。

实现上分为客户端和服务器端两个配置:

3.1.2 Storage, Database, Cache

Storage: localStorage, sessionStorage

两者都是比较新的API,在每个浏览器上的具体使用可能会有不同,这里以Chrome为例。除了可以通过在Application中的对应栏中编辑Storage以外,还可以通过代码来添加和删除属性对。

localStorage 和 sessionStorage的区别碍于作用方位,localStorage会存在浏览器端跨Tab通用,并且不会随着浏览器关闭而丢失;sessionStorage则只在当前的浏览器Tab中有效,关闭以后就丢失了(但是刷新以后仍旧能保持)。

Database: IndexDB, Web SQL

IndexDB是一个客户端的用于存储结构化数据的API,它所涉及的概念跟关系型数据库中非常类似,可以使用前端代码来方便地进行仿数据库方式的数据管理。可以参考 working-with-indexdb进一步了解IndexDB.

Cache: Service Worker Caches, Application Cache

待补充...

3.2 应用层缓存实践

待补充...

上一篇 下一篇

猜你喜欢

热点阅读