🍪🧁🍧

缓存加速

http状态码

  • 1xx 信息响应

  • 2xx 成功响应

  • 3xx 重定向

    • 304(Not Modified)
      客户端缓存了请求的文件(Last Modified),那么在请求中会包含 If Modified Since:时间戳 。服务端判断这个时间和当前请求的文件的修改时间返回 304 or 200 。
      静态文件Web服务器会自动完成这个过程,nginx,node.js express但是对于动态页面要做类似的缓存加速的话就得自定义这个Last Modified
      静态页面的Last-Modified就是他在文件系统中的修改时间,对于动态页面,要想添加这个Last Modified一般是在你的数据库中定义,因为动态页面主要就是你的数据会发生变化,并不断渲染新的页面,客户端向服务端确认已缓存的数据是否发生了变化
      • flask
    if_modified_since = request.headers.get("If-Modified-Since")
      if if_modified_since and if_modified_since == article["last_modified"]:
          return "", 304  # 资源未修改
    
      response = make_response(jsonify(article))
      response.headers["Last-Modified"] = article["last_modified"]
      return response
    
    • 手动配置nginx
    location /static/ {
      root /var/www/html;
      expires 30d;
      add_header Last-Modified $date_gmt;
    }
    
    • 对于短时间内的相同请求要想实现缓存加速,可以将后端的响应缓存到Nginx
    http {
      proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m inactive=60m; 
      #反向代理缓存路径 目录层级结构 共享缓存区域名称:大小,存储缓存键(key)和元数据(如缓存有效期)缓存非活动过期时间(优先级高于proxy_cache_valid)
    
      server {
          location / {
              proxy_pass http://backend_server;
              proxy_cache my_cache;
              proxy_cache_valid 200 302 10m;  # 缓存成功响应 10 分钟
              proxy_cache_valid 404 1m;
              proxy_cache_valid any 5m;
              add_header X-Proxy-Cache $upstream_cache_status; 
      # 查看缓存命中状态 HIT MISS BYPASS 配置:proxy_cache_bypass $condition1 $condition2 ...; EXPIRED
          }
      }
    }
    
  • 4xx 客户端错误

    • 405请求方法not allowed
    • 403Forbidden
  • 5xx 服务端错误

    • 请求的url不存在

http条件请求

前置知识

  • 验证器
    在请求中传递的描述资源版本的值,两大类

    • last-modified
    • etag (实体标签)
  • ETag 是服务器(Server)发送的,用于标识资源的版本或唯一标识符。
    If-Match 是客户端(Client)发送的请求方式

  • 条件首部

    • If-Match 未发生修改返回200 已修改返回412 Precondition Failed
    • If-None-Match 未修改 302 Not Modified 已修改200并加载修改的资源
    • If-Unmodified-Since
    • If-Range 只能含有一个实体标签或者日期值。匹配失败返回200及完整的资源
      那其他的头部要那么多标签干嘛?因为一次请求可以包含很多个资源呀
  • 应用场景(缓存或断点续传和锁机制)

    • 缓存更新
      这个很简单
    • 增量下载的完整性
      支持增量下载的服务器会通过 Accept-Ranges 首部来广播这项能力,如过下载中断了客户端就发送Ranges首部字段及缺失的范围值进行断点续传
      防止续传时文件已发生变化记得加If-Modified-SinceIf-Match 首部,也可以用If-Range,这样只需要一次请求
      注意不能用If-None-Match+Range
      这种情况下,如果Etag匹配直接返回304,要是不匹配就从Range开始下载,完全颠倒
    • 更新丢失
      乐观锁在并发情况下只允许第一个客户端的修改提交 If-Modified-SinceIf-Match
    • 资源首次上传的竞态
      If-None-Match:*当且仅当资源先前并不存在的情况下请求的操作才会成功执行
posted @ 2025-03-16 00:56  不想吃fun  阅读(35)  评论(0)    收藏  举报