HTTP缓存
Web缓存是可以自动保存常见文档副本的HTTP设备。当Web请求到达缓存时,如果本地有“已经缓存”的副本,就可以从本地存储设备,而不是原始服务器中获取这个文档。具有如下优点:
- 减少了冗余的数据传输
- 缓解了网络瓶颈问题(瞬间拥塞,Flash Crowds)
- 降低了对原始服务器的要求
- 降低了距离时延
一些概念
- 缓存命中(cache hit):可用所请求资源的本地副本为到来的请求提供服务
-
缓存未命中(cache miss):到达的请求由于没有所请求资源的可用本地副本而被转发给原始服务器。

-
再验证(revalidation):HTTP设备对其缓存在本地的资源副本进行“新鲜度检测”(检测是否仍与原始服务器上的资源一致)

缓存分类以及拓扑结构
缓存包括私有缓存和公有缓存。
-
公有缓存是特殊的共享代理服务器,被称为缓存代理服务器(caching proxy server)或代理缓存(proxy cache)
-
公有缓存接受来自多个用户的访问,缓存用户群体中不同的兴趣点,能更好的减少冗余流量
缓存的拓扑结构包括层次结构(herarchy)和网状结构(cache mesh)。更常用的是层次结构,如下图所示。

已缓存的资源副本的使用策略

- 当一个GET Request到来时,首先查询设备上是否已存储对应的资源,如果没有,则通过网络向原始服务器请求资源
- 对于从网络中获取到的资源,iOS设备需要决定是否在本地存储该资源(本文下一部分内容)
- 如果本地有缓存,查看如果Request是否要求进行再验证
- 如果Request要求再验证,则通过HEAD方式进行再验证
- 如果Request不要求再验证,当本地存储的Resonse足够新鲜时,直接返回缓存的资源,否则通过HEAD请求进行再验证
- 对于HEAD请求,如果服务器上的该资源被更改了,服务器返回的响应实体中包含有新鲜的资源内容,否则返回Body为空的response.
缓存控制
服务器可通过在响应中添加缓存控制首部,以控制发生在文档对象上的缓存行为。
指令 | 目的 |
---|---|
Cache-Control:max-stale 或Cache-Control:max-stale
= <s> | 可以提供随意过期的资源 |
Cache-Control:min-fresh
= <s> | 至少在未来s秒内资源要保持新鲜 |
Cache-Control:max-age
= <s> | 不能使用缓存时间长于s秒的资源 |
Cache-Control:no-cache 或Pragma:no-cache | 除非资源进行了再验证,否则这个客户端不会接受已缓存的资源 |
Cache-Control:no-store | 缓存应该尽快从存储器中删除资源的痕迹 |
Cache-Control:only-if-cached |
只有当缓存中有副本存在时,客户端才会获取一份副本 |