Push Cache(推送缓存)是针对HTTP/2标准下的推送资源设定的 ,是浏览器缓存的最后一道缓存机制,是在设置了Last-Modifed但没有设置Cache-Control或者Expires时触发,也就是只拿到最后更新时间,但没有设置过期时间,这种情况下浏览器会有一个默认的缓存策略push cache,自动设置过期时间:(Date - Last-Modified)*0.1,也就是当前时间减去最后更新时间后再乘10%。
这种策略只在会话session中存在,会话结束就被释放了。
这种策略也有个弊端,假设session存在的时间够长,如果该资源是在一个月前更新的,那么它再次更新的话用户只能在3天后才能拿到新资源。
推送缓存是session级别的,如果用户的session结束则资源被释放;即使URL相同但处于不同的session中也不会发生匹配。推送缓存的存储时间较短,Chromium浏览器中只有5分钟左右,同时它也并非严格执行HTTP头中的缓存指令
Jake Archibald有一篇很有意思的文章HTTP/2 push is tougher than I thought描述了他对HTTP/2推送缓存的一些测试,有一些结论可以放上来以供参考,有一些也和我们上面的结论是一致的
-
几乎所有的资源都能被推送,并且能够被缓存。测试过程是作者在推送资源之后尝试用fetch()、XMLHttpRequest、<link rel="stylesheet" href="…">、<script src="…">、<iframe src="…">获取推送的资源。Edge和Safari浏览器支持相对比较差
-
no-cache和no-store资源也能被推送
-
多个页面可以使用同一个HTTP/2的连接,也就可以使用同一个Push Cache。这主要还是依赖浏览器的实现而定,出于对性能的考虑有的浏览器会对相同域名但不同的tab标签使用同一个HTTP连接。
-
一旦Push Cache中的资源被使用即被移除
-
如果Push Cache或者HTTP Cache已经存在被推送的资源,则有可能浏览器拒绝推送
-
你可以为其他域名推送资源