缓存加速

news/2025/3/16 0:58:27/文章来源:https://www.cnblogs.com/meme-/p/18773718

http状态码

  • 1xx 信息响应

  • 2xx 成功响应

  • 3xx 重定向

    • 304(Not Modified)
      客户端缓存了请求的文件(Last Modified),那么在请求中会包含 If Modified Since Last Modified 。服务端判断这个时间和当前请求的文件的修改时间返回 304 or 200 。
      静态文件服务器会自动完成这个过程,但是对于动态页面要做类似的缓存加速的话就得自定义这个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:*当且仅当资源先前并不存在的情况下请求的操作才会成功执行

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/899490.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

三分钟教学:手把手教你实现Arduino发布第三方库

Arduino 发布第三方库的流程包括:构建库的基本框架后将其打包并上传至 GitHub,在 GitHub 上创建 Tag 和 Release 后,提交到 Arduino 库管理器,最后在Arduino IDE进行验证。三分钟教学:手把手教你实现Arduino发布第三方库原文链接: 手把手教你实现Arduino发布第三方库 摘要…

2025-315晚会总结

🔖简介 2025年315晚会曝光了多个行业的消费乱象和违法侵权行为。 主题:“共铸诚信 提振消费”,聚焦食品安全、公共安全、金融安全、数字经济等领域。 核心诉求:打击消费陷阱,推动构建公平、诚信的消费环境。 📢曝光现象 🔒数据安全与隐私侵权非法窃取个人信息涉事企业…

再破难关(BFS)

问题 F: 再破难关 题目描述 OIBH组织派出的黄金十二人+青铜五小强还没有到, 他们只能指望原先的机关能够阻拦住柯南的脚步。柯南打开大门之后发现里面还有一个门, 门上还有一个神奇的锁(-,-) 这是一个4*4的锁, 上面有8个凸起的格子和8个被按下的格子,当且仅当两个格子有公共边…

LLM大模型:OpenManus原理

继deepseek之后,武汉一个开发monica的团队又开发了manus,号称是全球第一个通用的agent!各路自媒体企图复刻下一个deepseek,疯狂报道!然而manus发布后不久,metaGPT团队5个工程师号称耗时3小时就搞定了一个demo版本的manus,取名openManus,才几天时间就收获了34.4K的start…

Day14_TCP三次握手

每日一题 TCP三次握手详解 三次握手(Three-Way Handshake) 是TCP协议建立可靠连接的核心过程,确保通信双方能够正常收发数据并同步初始序列号。以下是详细步骤和原理:1. 第一次握手:SYN(客户端 → 服务器)动作:客户端发送一个TCP报文,设置SYN=1(同步标志位),并生成…

Paimon merge into 实现原理

语法 MERGE INTO target USING source ON source.a = target.a WHEN MATCHED THEN UPDATE SET a = source.a, b = source.b, c = source.c WHEN NOT MATCHED THEN INSERT (a, b, c) values (a, b, c)merge into 实际上是一个语法糖, 相对应的语义也可以通过其他的 sql…

MACD

目录背景和价值用法快线在0轴上方 - 多头较强,否则多头较弱快线上穿慢线 形成金叉,形成多头信号。 快线下穿慢线 形成死叉,形成空头信号顶背离和底背离参考资料 背景和价值 指数平滑移动平均线两个(12和26)均线相交,12EMA上穿26EMA形成金叉,快线从0轴下方上穿0轴上方 用…

python 文件打包成 whl

首先需要安装 wheel, setuptools pip install setuptools wheel简单进行一个打包的例子,项目目录结构如下:# __init__.py def pytest_collection_modifyitems(session, config, items):for item in items:# item.name 用例名称item.name = item.name.encode(utf-8).decode(un…

cmake识别不到vcpkg安装的包的解决(以libssh为例)

承接上篇 vcpkg 跨平台的c/c++库包管理工具(以libssh为例) - 夕西行 - 博客园 vcpkg安装libssh后,vs2022创建的cmake项目竟然不能find_package到libssh 问题出在CMakeLists.txt,注意位置1、2、3的顺序一定不能变cmake_minimum_required (VERSION 3.20)#vcpkg————位置1 …

昆工昆明理工大学冶金最新复试真题及答案

--冶金工程考研809冶金物理化学有色冶金学有色金属冶金冶金过程及设备F002钢铁冶金学冶金调剂

《Transformer自然语言处理实战 : 使用Hugging Face Transformers库构建NLP应用》PDF免费下载

《Transformer自然语言处理实战》聚焦 Hugging Face Transformers 库,系统讲解 Transformer 模型在 NLP 任务中的应用。涵盖文本分类、命名实体识别、机器翻译等核心技术,并提供实践案例,帮助读者快速掌握模型微调与部署。适合 NLP 初学者及希望深入理解 Transformer 的开发…