HTTP cache

2018-07-05  本文已影响0人  查桐宁

cache是一种存储给定资源,当下次有请求时用副本代替重新从服务器拉取源数据的一种技术。一般只有GET请求的资源才会被缓存。

主要可以分为两大类:privateshared

1、Cache-control(HTTP/1.1)
    Cache-Control: no-store
    Cache-Control: no-cache, no-store, must-revalidate

no-cache意思不是do not cache, 而是说在每一次使用cache response之前需要revalidate with server

must-revalidate指当资源被过期之后必须revalidate之后才能被使用

    Cache-Control: no-cache
    Cache-Control: private // 只会被单个用户缓存,比如浏览器缓存,不会被存为 shared cache
    Cache-Control: public // 能被任何缓存机制缓存。在一些不能被缓存的情况下,比如HTTP授权或者非正常可缓存状态码(200, 301),缓存资源
    Cache-Control: max-age: 31536000 // 设置最大过期时间,相对于请求时间,在缓存静态文件时很有用
2、Pragma(HTTP/1.0)
    Pragma: no-cache

Cache-Control: no-cache一样作用,可作为其在HTTP/1.0向后兼容的方案。

3、Freshness(过期与否)

缓存驱逐(cache eviction):理论上缓存是能被永久存储的,但是考虑缓存空间是有限制的,所有会有资源定期被从缓存中移除。

有效期限(lifeTime)

    过期时间:
    expirationTime = responseTime + freshnessLifetime - currentAge
    // currentAge接近于0,会 `Age`头影响
    Last-Modified: <day-name>, <day> <month> <year> <hour>:<minute>:<second> GMT
    // Last-Modify需要配合 If-Modified-Since/If-None-Match
    // Last-Modify通常用来缓存与ETag无关的一些实体
4、缓存验证

点击重新加载按钮或者有Cache-control:must-revalidate头都会触发revalidation。而只有提供了强验证器和弱验证器才会验证。

强验证器:当Entity改变时,哪怕只是1bit的改变,Entity Tag就会改变时就是Strong validator

弱验证器:当Entity改变时,但Entity Tag不一定变化时就是weak validator

在资源过期之后,validator能让客户端不直接拉取新资源而是在可以在请求头携带特定标识让服务器去验证该资源是否真正失效,如果无效返回200和新的资源,如果还有效则返回304让浏览器继续使用缓存,并更新过期时间。

    ETag: W/"<etag_value>"
    ETag: "<etag_value>
    
    Etag: "686897696a7c876b7e"
    If-None-Match: "686897696a7c876b7e"

ETag是用来标识特定版本的资源的响应头,客户端是不知道这些标识的含义的(opaque-to-the-useragent),配合
If-None-Match使用。

Last-Modified是一种weak validator,配合If-Modified-SinceIf-Unmodified-Since

上一篇下一篇

猜你喜欢

热点阅读