什么是缓存
计算机已经接收过一次,然后保存以备将来使用的数据
为什么需要缓存
因为网络请求相比于 CPU 的计算和页面渲染是非常非常慢的。
哪些东西可以被缓存?
静态资源,比如css,js,img
缓存机制的设置
HTTP的缓存机制主要在HTTP响应头中设置,响应头中相关字段为Expires、Cache-Control、Last-Modified、Etag。
缓存的优点
- 减少服务器压力
- 减少网络延迟
- 减少网络带宽的消耗
HTTP的缓存策略
强制缓存 + 协商缓存
强制缓存
缓存的是除首页的其他静态资源,每一次都会请求首页,没有解决根资源的缓存问题
Cache-Control在 Response Headers响应头中,用来控制强缓存逻辑
Cache-Control的值有:
no-cache:指示浏览器忽略缓存副本,强制到服务器获取资源(浏览器缓存了,只是获取资源不从缓存里面拿)
no-store: 强制不缓存,在任何情况下都不要保留任何副本(浏览器没有缓存)
max-age: 指示缓存副本的有效时长,从请求时间开始到过期时间之间的秒数,max-age=313567890
public: 表明响应可以被任何对象(包括:发送请求的客户端,代理服务器等)缓存
private:表明只能被单个用户缓存,不能作为共享缓存
协商缓存
因为强制缓存存在首页不缓存的问题,是一种服务端缓存策略,服务端判断客户端资源是否和服务端资源一样,一致返回304,否则返回200和最新资源
Response Headers响应头中资源标识有两者
Etag: 资源的唯一标识(一个字符串,类似于人类的指纹)。
Last-Modified: 资源的最后修改时间,只能精确到秒级。
如果服务器返回的是Etag,那么浏览器再次请求的时候Request Headers上会携带字段if-None-Match,if-None-Match的值就是Etag,服务端会将其与现在的资源计算出来的唯一标识做比较,根据比较结果是否一致进行返回。
如果服务器返回的是Last-Modified,那么浏览器再次请求的时候Request Headers携带字段if-Modified-Sinc, if-Modified-Sinc的值就是Last-Modified。
Etag 的优先级高于Last-Modified,如果资源被重复生成和内容不变, Etag 更精确