强缓存

Cache-Control 在请求头中的值
max-age 超出max-age则缓存失效
max-stale 即使缓存不再新鲜,但是陈旧秒数未超过仍可使用
max-stale后没有值,则无论过期多久客户端都可使用
min-fresh 至少经过min-fresh秒后缓存才可使用
no-cache 不可直接使用缓存,除非协商304才能使用
no-store 不缓存
no-transform 代理服务器不能修改包体内容
Cache-Control 在响应头中的值
must-revalidate 一旦过期不可直接使用,需要协商304才能使用缓存
no-cache 不可直接使用缓存,除非协商304才能使用
no-store 不缓存
max-age 超出max-age则缓存失效
public 共享缓存(代理服务器内存)和私有缓存(浏览器缓存),皆可缓存该资源
private 代理服务器之类的共享缓存不能缓存
no-transform 代理服务器不能修改包体内容

协商缓存

服务端响应:Last-ModifiedEtag
客户端请求头带上:If-Modified-SinceIf-None-Match

如果命中协商缓存,返回304 Not Modified
如果没命中,返回200 OK以及响应体

Range 请求协商缓存

客户端请求体带上:If-Unmodified-SinceIf-Match

如果命中协商缓存,则返回206 Partial Content当前段的内容
如果没命中协商缓存,则返回412 Precondition Failed之前状态失效

If-Match匹配协商缓存,如失败则需要第二次才会返回正确内容
可以使用If-Range传递Etag,如失效则返回新内容,如有效则返回后续内容

乐观锁

当多个客户端同时PUT修改相同内容时,在发起PUT请求时也需要带上If-Unmodified-SinceIf-Match,如果资源已被更新则返回412 Precondition Failed,这个操作称为乐观锁

image.png

乐观锁解决首次上传问题

首次上传,服务端没有资源,则If-None-Match默认为*
image.png

协商缓存的过程

先匹配If-Unmodified-SinceIf-Match
再匹配If-Modified-SinceIf-None-Match

缓存实现

一般以URL作为keykey指向LRU中的某个节点
Http响应消息构成LRU链表