强缓存
| 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-Modified 和 Etag
客户端请求头带上:If-Modified-Since 和 If-None-Match
如果命中协商缓存,返回304 Not Modified
如果没命中,返回200 OK以及响应体
Range 请求协商缓存
客户端请求体带上:If-Unmodified-Since 和 If-Match
如果命中协商缓存,则返回206 Partial Content当前段的内容
如果没命中协商缓存,则返回412 Precondition Failed之前状态失效
If-Match匹配协商缓存,如失败则需要第二次才会返回正确内容
可以使用If-Range传递Etag,如失效则返回新内容,如有效则返回后续内容
乐观锁
当多个客户端同时PUT修改相同内容时,在发起PUT请求时也需要带上If-Unmodified-Since 和 If-Match,如果资源已被更新则返回412 Precondition Failed,这个操作称为乐观锁
乐观锁解决首次上传问题
首次上传,服务端没有资源,则If-None-Match默认为*
协商缓存的过程
先匹配If-Unmodified-Since和If-Match
再匹配If-Modified-Since和If-None-Match
缓存实现
一般以URL作为key, key指向LRU中的某个节点Http响应消息构成LRU链表
