当前位置: 首页 > news >正文

在图片URL后面添加一个参数以清理缓存

在图片URL后面添加一个参数(如a=1)以清理缓存的原理: HTTP缓存

HTTP缓存是一种优化技术,用于减少重复的网络请求和降低服务器的负载。当浏览器请求一个资源(如图片)时,它会首先检查本地缓存中是否已经有这个资源的副本。如果有,并且这个资源被认为是“新鲜”的(即没有过期,或者通过验证服务器上的版本仍然是相同的),那么浏览器就会直接从缓存中加载这个资源,而不是从服务器重新下载。

在图片URL后面添加时间戳,可以清理缓存并强制浏览器从服务器加载最新资源。由于每次请求时生成的时间戳都不一样(即修改了URL),因此浏览器会认为这是一个新的请求,不会从缓存中加载资源,而是会向服务器发送请求以获取最新的资源。因此,它通常只在资源确实更新但URL没有改变的情况下才使用。

HTTP协议

一、缓存头(Cache Headers)

缓存头是HTTP请求和响应中包含的元数据,用于控制缓存的行为。关键的缓存头包括:

  • Expires:由服务器发送,定义了响应过期的时间,告诉浏览器在过期时间之前可以继续使用缓存的副本。
  • Cache-Control:这是一个比Expires更强大的缓存控制指令,它可以设置缓存的具体行为,如max-age(资源可被缓存的最长时间)、no-cache(强制每次请求都向服务器验证缓存的有效性)、no-store(禁止一切缓存)等。
  • Last-Modified:服务器响应请求时,会告诉浏览器资源的最后修改时间。
  • ETag:由服务器发送,是一个特定资源的版本标识符,用于比较资源的版本是否发生变化。

二、缓存策略

  • 强制缓存:当缓存数据未失效时,直接使用缓存数据,不再请求服务器。这主要依赖于Expires和Cache-Control头。
  • 协商缓存:当缓存数据已过期但可能仍然有效时,向服务器发送请求并附带验证信息(如If-Modified-Since和If-None-Match),由服务器判断缓存是否仍然有效。如果有效,服务器返回304 Not Modified响应,告知客户端继续使用缓存数据。

三、缓存命中与失效

  • 缓存命中:当浏览器再次请求相同的资源时,如果该资源已经在缓存中可用且未过期(或经协商后确认仍然有效),则浏览器会直接从缓存中获取资源,而不是向服务器发送请求。
  • 缓存失效:当浏览器无法从缓存中找到请求的资源,或缓存资源已过期且经协商后确认无效时,浏览器将向服务器发送请求以获取最新的资源。

四、缓存回收与一致性

  • 缓存回收:当浏览器需要更新缓存中的资源时,可以通过发送带有验证信息的请求来避免不必要的网络传输。
  • 缓存一致性:在分布式系统中,多个缓存节点可能存储着相同资源的副本。为了保证缓存一致性,需要使用一些机制来同步不同缓存节点之间的数据。

五、缓存替换策略

缓存空间是有限的,因此需要有一种策略来替换旧的缓存条目以容纳新的条目。常见的缓存替换策略包括最近最少使用(LRU)、最不经常使用(LFU)等。

六、代理缓存与CDN缓存

  • 代理缓存:在分布式系统中,代理服务器可以作为客户端和服务器之间的中间代理,帮助缓存和转发请求。
  • CDN缓存:内容分发网络(CDN)可以将资源缓存在全球各地的边缘服务器上,以便更快地向用户提供服务。CDN缓存技术可以减少网络延迟和提高用户体验,同时减轻原始服务器的负载。

七、浏览器缓存

浏览器负责管理本地缓存,包括存储HTTP响应、HTML文档中的链接资源等。浏览器可以根据HTTP头中的Cache-Control指令来决定如何处理缓存请求。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • [Unity实战]Mirror网络与Addressable场景管理
  • 多租户系统数据隔离方案
  • 深入理解SQL中的窗口函数
  • Android顶部标题栏自定义,添加按钮
  • springboot多媒体内容管理系统-计算机毕业设计源码08580
  • Linux学习笔记:Linux基础知识汇总(个人复习版)
  • 2435. 矩阵中和能被 K 整除的路径(leetcode)
  • 详解Xilinx FPGA高速串行收发器GTX/GTP(5)--详解8B10B编解码
  • Mojo中值的所有权简介
  • 区块链的搭建和运维4
  • 数据可视化Axure大屏原型制作分享
  • CAN 应用编程基础-I.MX6U嵌入式Linux C应用编程学习笔记基于正点原子阿尔法开发板
  • 华为OD-D卷找座位
  • 计算机毕业设计选题推荐-生活垃圾治理系统-Java/Python项目实战
  • 苹果应用程序清理卸载工具:App Cleaner Uninstaller Pro for Mac
  • 〔开发系列〕一次关于小程序开发的深度总结
  • android 一些 utils
  • CentOS 7 防火墙操作
  • Django 博客开发教程 16 - 统计文章阅读量
  • Git初体验
  • Vue2 SSR 的优化之旅
  • yii2权限控制rbac之rule详细讲解
  • 关于 Cirru Editor 存储格式
  • 关于字符编码你应该知道的事情
  • 基于Android乐音识别(2)
  • 基于MaxCompute打造轻盈的人人车移动端数据平台
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 使用 5W1H 写出高可读的 Git Commit Message
  • 使用API自动生成工具优化前端工作流
  • 做一名精致的JavaScripter 01:JavaScript简介
  • No resource identifier found for attribute,RxJava之zip操作符
  • ​ssh免密码登录设置及问题总结
  • ###项目技术发展史
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • #Z0458. 树的中心2
  • #我与Java虚拟机的故事#连载05:Java虚拟机的修炼之道
  • (1)(1.8) MSP(MultiWii 串行协议)(4.1 版)
  • (52)只出现一次的数字III
  • (Charles)如何抓取手机http的报文
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现
  • (四)【Jmeter】 JMeter的界面布局与组件概述
  • (四)汇编语言——简单程序
  • (转)为C# Windows服务添加安装程序
  • .bat批处理(二):%0 %1——给批处理脚本传递参数
  • .MSSQLSERVER 导入导出 命令集--堪称经典,值得借鉴!
  • .NET gRPC 和RESTful简单对比
  • .NET的微型Web框架 Nancy
  • .NET开源项目介绍及资源推荐:数据持久层 (微软MVP写作)
  • .stream().map与.stream().flatMap的使用
  • [20161214]如何确定dbid.txt
  • [android] 看博客学习hashCode()和equals()
  • [Android]将私钥(.pk8)和公钥证书(.pem/.crt)合并成一个PKCS#12格式的密钥库文件
  • [Bug]使用gradio创建应用提示AttributeError: module ‘gradio‘ has no attribute ‘inputs‘
  • [C#]OpenCvSharp 实现Bitmap和Mat的格式相互转换