HTTP缓存笔记(1)

HTTP缓存

笔记来自:MDN

主要有两种,私有缓存(private caches)或者共享缓存(shared caches)。

缓存示意图

缓存控制头Cache-Control header
  • 禁止缓存

每次请求都会下载完整的响应内容

Cache-Control: no-store,
Cache-Control: no-cache, no-store, must-revalidate
复制代码
  • 强制确认缓存

每次请求发出时,缓存会将此请求发送到服务器,该请求会带有与本地缓存相关的验证字段,服务器端会根据验证信息判断是否使用本地缓存。

Cache-Control: no-cache
复制代码
  • 私有缓存和公共缓存

"public" 指令表示该响应可以被任何中间人(译者注:比如中间代理、CDN等)缓存。若指定了"public",则一些通常不被中间人缓存的页面(译者注:因为默认是private)(比如 带有HTTP验证信息(帐号密码)的页面 或 某些特定影响状态码的页面),将会被其缓存。

而 "private" 则表示该响应是专用于某单个用户的,中间人不能缓存此响应,该响应只能应用于浏览器私有缓存中。

Cache-Control: private
Cache-Control: public
复制代码
  • 缓存过期机制

max-age=, 表明这个缓存相对于上次请求的时间间隔内是可以继续使用的,否则就应该失效。

Cache-Control: max-age=31536000
复制代码
  • 缓存验证

当使用must-revalidate时,表示在使用缓存前必须验证旧资源是否过期了。详情

Cache-Control: must-revalidate
复制代码

为什么需要刷新缓存(freshness)

一旦资源被存储在缓存中,理论上应该一直存储着,但是由于缓存的空间是有限的,所以会周期性的移除一些已被缓存的资源,这个过程被称为缓存清除(cache eviction)。并且服务器上的资源可能已经更新了,所以cache也应该被更新。由于HTTP是一个client-server协议,当资源改变时服务器无法通知cache和client;它们只能通过过期机制(expiration),在没过期之前,这个资源是新的(fresh);过期后资源是stale(陈旧)状态。清除算法优先清理旧资源,但是实际上旧资源不是被清除算法清除的,当缓存系统收到一个对旧资源的请求时,它会将这个request带上If-None-Match字段去检查这个资源到底是新的还是旧的。如果是fresh状态,则返回304(Not Midified)header,并且response body不会包含请求的资源,这样的话还可以节省一些带宽。

下面是典型的缓存处理过程:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值