缓存存放
缓存的资源文件存放有两种方式,一种是存放在硬盘中,一种是存放在内存中;
disk cache:存放在硬盘中
memory cache:存放在内存中
区别:硬盘缓存当进程退出或者结束的时候缓存不会被清除,但是读取速度较慢
缓存的作用:
1.减少了冗余的数据传输
2.减少了服务器的负担,大大提升了网站的性能
3.加快了客户端加载网页的速度
缓存分为强制缓存和协商缓存
协商缓存:
通过请求头和响应头的某些字段实现;
第一次请求的时候,服务器会返回一个特殊的字段给客户端,下次请求的时候请求头会带上这个字段,服务端会验证这个字段,如果相同则会返回304状态码,即使用缓存,否则会重新请求
字段分为两种:ETag/if-None-Match 和 Last-Modified/if-Modify-Since
Last-Modified/if-Modify-Since
第一次请求的时候,服务器会返回一个last-modified的header(响应头),内容是该资源最后的修改时间, 当再次发送该请求的时候请求头会带上if-modify-since,值为上次响应头的last-modified,服务器会校验该值是否和当前last-modified相同(当前资源最后修改的时间),如果相同则会返回304状态码,如果不同则返回200,并且更新last-modified
Etag/if-None-Match
原理和上一个字段类似,但是值是字符串或者其他内容。
对比
1. 在精度上,Etag要优先于 last-modified。
-
在性能上,Etag要逊于Last-Modified,Last-Modified只需要记录时间,而Etag需要服务器通过算法来计算出一个hash值。
-
在优先级上,服务器校验优先考虑Etag。
为什么需要Etag
当某些资源最后修改日期不同但是其内容没有发生变化的时候,可以通过etag判断可以继续使用缓存
强制缓存
浏览器在加载资源的时候,会先根据本地缓存资源的header中的信息(Expires 和 Cache-Control)来判断是否需要强制缓存。如果命中的话,则会直接使用缓存中的资源。否则的话,会继续向服务器发送请求。
Expires
http1.0的规范
值是一个时间字符串,代表该资源的失效时间,如果在失效之前请求该资源的话是直接从缓存中读取,否则会重新向服务器发送请求(缺点是当服务器时间和本地时间不同的时候会失效)
Cache-Control
http1.1规范
利用值max-age进行判断是否失效
max-age=60 表示60秒后该资源失效
出了ma-age字段,还有其他字段:
no-cache:可以在本地缓存,但是每次使用前要同时协商缓存进行校验该缓存是否过期(不是不缓存,而是不缓存过期的资源)
no-store:禁止浏览器缓存数据,每一次都要重新请求资源
public:可以被所有的用户缓存(终端用户和CDN等中间代理服务器)
private: 只能被终端用户的浏览器缓存,不允许 CDN 等中继缓存服务器对其缓存。
**Cache-Control 与 Expires 同时启用的时候 Cache-Control 优先级高。
**
\