Home / cs-notes / Network / CDN / HTTP 缓存
缓存定义
- 
    
本地副本
 - 
    
优点
- 降低距离时延
 - 本地网络带宽通常大于远程带宽
 - 减少长途的数据传输,节省费用
 - 降低原始服务器符合
 
 
缓存命中/未命中
- 容量有限
    
- 本地有副本:cache hit
 - 本地无副本:cache miss
 
 
- 缓存再验证
    
- 验证副本与原始内容是否一致
        
- 新鲜度检测
 - revalidation
 
 - 
        
If-Modified-Since (IMS)
 - 通常在用户发起请求,且副本足够旧时,才发起对副本的再验证
 
 - 验证副本与原始内容是否一致
        
 
- 再验证命中
    
- revalidate hit
 - 内容无变化
 - HTTP 304: Not Modified
 - 标记副本为新鲜
 - 比缓存命中慢
        
- 需要与原始服务器核对
 
 - 比再验证未命中快
        
- 不需要从原始服务器拉取对象
 
 
 - 再验证未命中
    
- 传输完整对象内容
 - HTTP 200: OK
 
 - 删除
    
- 原始服务器已将对象删除
 - HTTP 404: Not Found
 - 缓存将副本删除
 
 
- 命中率(cache hit rate)
    
- 文档命中率(document hit rate)
        
- 请求命中比率
 
 - 字节命中率
        
- 对于大文件,访问次数少,流量占用高,统计字节命中率比文档命中率更有意义
 
 
 - 文档命中率(document hit rate)
        
 
- 区分命中/未命中
    
- 响应码
        
- 都是 200
 - 无法区分
 
 - 首部
        
- Date
 - Age
 - 相当于判断数据版本
 
 
 - 响应码
        
 
缓存拓扑结构
- 私有缓存
    
- 单个用户
 - 浏览器内
 
 - 公有缓存
    
- 某用户群体共享
 - 缓存代理服务器(caching proxy server)
 
 
缓存处理步骤
- 接收
    
- 请求
 
 - 解析
    
- URL
 - 首部
 
 - 查询
    
- 本地有没有副本
 
 - 新鲜度检测
    
- 如果数据足够旧,需要缓存再验证,判断是否需要更新
 
 - 创建响应
 - 发送
 - 日志
 
缓存相关首部
- Cache-Control
    
- public: 响应可以被缓存(默认)
 - private: 浏览器可以缓存,不允许中继缓存
 - no-store: 禁止缓存
 - no-cache: 浏览器可以缓存,但是未经新鲜度检查之前不可使用
 - max-age: 相对时间,单位秒
        
- Date + max-age 为绝对过期时间
 
 
 - Expires
    
- value: date
 - HTTP/1.0
 - 绝对时间
 
 - Date
    
- value: date
 - response 报文
 - 响应时的时间
 
 - Last-Modified
    
- value: date
 - response 报文
 - 最后被修改的时间
 
 - If-Modified-Since
    
- value: date
 - request 报文
 - 用于新鲜度检查
        
- 如未修改,更新缓存文档的 Date,并提供缓存副本
 - 如已修改,重新缓存新的文档,并提供新缓存的副本
 
 
 - If-None-Match
    
- value: tag
 - request 报文
 - 告知服务器,这些版本有对应的缓存
 - 配合 Etag 使用
 - Response Code
        
- 304: Not Modified
            
- 响应头与 200 OK 的情况一样
 
 - 200: OK
            
- Cache-Control
 - Content-Location
 - Date
 - ETag
 - Expires
 - Vary
 
 - 412: Precondition Failed
            
- 能够引发服务器状态改变
 
 
 - 304: Not Modified
            
 
 - Pragma
    
- value: no-cache 等
 - HTTP/1.0
 - 相当于 Cache-Control
 
 
过期时间相关响应首部
- Expires
    
- HTTP/1.0+
 - 响应头
 - 绝对过期时间
 - 弊端:电脑本地时间可能不准确
 - 例
        
- Expires: Thu, 15 Apr 2020 20:00:00 GMT
 
 
 - Cache-Control
    
- HTTP/1.1
 - 响应头
 - 相对过期时间
 - 优先级高于 Expires
 - max-age: 单位秒
 - 例
        
- Cache-Control: max-age=135360000
 
 
 - Pragma
    
- HTTP/1.0
 - 很少用
 
 
再验证相关请求首部
常用
- If-Modified-Since
    
- 配合 Last-Modified
 - 例
        
- If-Modified-Since: Fri, 12 May 2006 18:53:33 GMT
 
 
 - If-None-Match
    
- 最后修改时间验证弊端
        
- 周期性重写,内容不变
 - 已修改,但是不重要,不需要同步
 - 有些服务器无法判断最后修改日期
 - 文档修改时间周期低于 1s
 
 - 配合 Etag 使用
        
- 如果已缓存标签和服务器文档的标签有所不同
            
- If-None-Match 首部就会执行所请求的方法
 
 
 - 如果已缓存标签和服务器文档的标签有所不同
            
 - 例
        
- If-None-Match: “abcd1234…abcd1234” (Etag)
 
 - 如果 HTTP/1.1 服务器收到的请求同时有 If-Modified-Since 和 If-None-Match
        
- 需要两个都满足才能返回 304
 
 
 - 最后修改时间验证弊端
        
 
不常用
- If-Unmodified-Since
 - If-Range
 - If-Match