Http 缓存机制

http 缓存主要分两种:
一、服务器缓存
二、客户端缓存

因为做的是Android 开发,服务缓存不是重点(只知道Nginx反向代理啥的),主要了解一下客户端缓存。
关键设置:
cache-control:是指明当前资源的有效期,客户端是否直接从缓存取数据还是重新发请求到服务器取数据
各个值的指令含义如下:
1.public指示响应可被任何缓存区缓存。
2.private指示对于单个用户的整个或部分响应消息,不能被共享缓存处理。这允许服务器仅仅描述当用户的部分响应消息,此响应消息对于其他用户的请求无效。
3.no-cache指示请求或响应消息不能缓存,该选项并不是说可以设置”不缓存“,容易望文生义~
4.no-store用于防止重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用缓存,完全不存下來。
5.max-age指示客户机可以接收生存期不大于指定时间(以秒为单位)的响应。
6.min-fresh指示客户机可以接收响应时间小于当前时间加上指定时间的响应。
7.max-stale指示客户机可以接收超出超时期间的响应消息。如果指定max-stale消息的值,那么客户机可以接收超出超时期指定值之内的响应消息。
etag:当前资源在服务器的唯一标识
if-none-match:当前资源在服务器的唯一标识
Last-Modified:标示这个响应资源的最后修改时间
If-Modified-Since:当资源过期时(使用Cache-Control标识的max-age),发现资源具有Last-Modified声明,则再次向web服务器请求时带上头 If-Modified-Since,表示请求时间。web服务器收到请求后发现有头If-Modified-Since 则与被请求资源的最后修改时间进行比对。若最后修改时间较新,说明资源又被改动过,则响应整片资源内容(写在响应消息包体内),HTTP 200;若最后修改时间较旧,说明资源无新修改,则响应HTTP 304 (无需包体,节省浏览),告知客户端继续使用所保存的cache。

缓存流程.png

引用网上大家都使用的流程图如上。
简单来说
1.当我们第一次请求的时候,本地没有缓存,所以直接向服务器发起请求,此时服务器带回cache-control,etag,last-modified等,用于后续请求判断。
2.当我们发起第二次请求的时候,先行判断本地的缓存有没有过期,如果没有过期自然不用向服务器发起请求,如果过期则把if-none-match(对应第一次接收到的etag),if-modified-since(对应第一次接收到的last-modified)等发送给服务器,服务器先判断if-none-match,与被请求资源的唯一标识进行比对,不同,说明资源又被改动过,则响应整片资源内容,返回状态码200;相同,说明资源无新修改,则响应HTTP 304,告知客户端继续使用所保存的cache。同理,if-modified-since可自行推理,返回的code也是200或者304。
强制缓存.png

对比缓存.png

参考:https://www.cnblogs.com/chenqf/p/6386163.html

你可能感兴趣的:(Http 缓存机制)