什么是缓存?
Web缓存是可以自动保存常见文档副本的HTTP 设备。 当Web请求抵达缓存时, 如果本地有“已缓存的”副本, 就可以从本地设备而不是服务器中提取这个文档。
为什么使用缓存?
缓存减少了冗余的数据传输, 节约了网络费用
缓存缓解了网络瓶颈的问题, 对于带宽的要求
缓存降低了对原始服务器的要求, 降低服务器压力
缓存加速了页面的展示
缓存的分类:
缓存分为服务端侧(比如 Nginx,redis,memcached) 和客户端侧(比如 web browser) 。
服务端缓存又分为 代理服务器缓存 和 反向代理服务器缓存(也叫网关缓存, 比如 Nginx反向代理就可以设置缓存)
客户端侧缓存一般指的是浏览器缓存、 app缓存等等, 目的就是加速各种静态资源的访问, 降低服务器压力。
浏览器缓存
- 浏览器的缓存规则
- 第一次访问某个网站
response headers
etag:xxxx
last-modified:xxx
request headers
cache-control:no-cache - 第二次访问某个网站
response headers
etag:xxxx
last-modified:xxx
request headers
if-modified-since:xxx
if-none-match:xxx
HTTP 缓存控制头介绍
HTTP 中最基本的缓存机制, 涉及到的 HTTP 头字段, 包括 Cache-Control, Last-Modified, If-Modified-Since, Etag, If-None-Match 等
- Last-Modified/If-Modified-Since
Last-Modified : 标示这个响应资源的最后修改时间。 web服务器在响应请求时, 告诉浏览器资源的最后修改时间。
If-Modified-Since : 当资源过期时(使用Cache-Control标识的max-age) , 发现资源具有 Last-Modified 声明, 则再次向web服务器请求时带上头 If-Modified-Since , 表示请求时间。 web服务器收到请求后发现有头 If-Modified-Since 则与被请求资源的最后修改时间进行比对。 若最后修改时间较新, 说明资源又被改动过, 则响应整片资源内容(写在响应消息包体内) , HTTP 200; 若最后修改时间较旧, 说明资源无新修改, 则响应 HTTP 304 (无需包体, 节省浏览), 告知浏览器继续使用所保存的 cache 。
- f5刷新:
此处发送时有一个 If-Modified-Since 请求头, 其值就是上次请求响应的 Last-Modified响应状态码为304 - Ctrl+f5强制刷新
Pragma行是为了兼容 HTTP1.0 , 作用与 Cache-Control: no-cache 是一样的
- Etag/If-None-Match
Etag : web服务器响应请求时, 告诉浏览器当前资源在服务器的唯一标识(生成规则由服务器觉得) 。
If-None-Match : 当资源过期时(使用Cache-Control标识的max-age) , 发现资源具有Etage声明, 则再次向web服务器请求时带上头 If-None-Match (Etag的值) 。 web服务器收到请求后发现有头 If-None-Match 则与被请求资源的相应校验串进行比对, 决定返回200或304。
Last-Modified 标注的最后修改只能精确到秒级, 如果某些文件在1秒钟以内, 被修改多次的话, 它将不能准确标注文件的修改时间。
如果某些文件会被定期生成, 当有时内容并没有任何变化, 但 Last-Modified 却改变了, 导致文件没法使用缓存。
有可能存在服务器没有准确获取文件修改时间, 或者与代理服务器时间不一致等情形 。
Etag是服务器自动生成或者由开发者生成的对应资源在服务器端的唯一标识符, 能够更加准确的控制缓存。
Last-Modified 与 ETag 是可以一起使用的, 服务器会优先验证 ETag , 一致的情况下, 才会继续比对 Last-Modified , 最后才决定是否返回304。