在图片URL后面添加一个参数(如a=1)以清理缓存的原理: HTTP缓存
HTTP缓存是一种优化技术,用于减少重复的网络请求和降低服务器的负载。当浏览器请求一个资源(如图片)时,它会首先检查本地缓存中是否已经有这个资源的副本。如果有,并且这个资源被认为是“新鲜”的(即没有过期,或者通过验证服务器上的版本仍然是相同的),那么浏览器就会直接从缓存中加载这个资源,而不是从服务器重新下载。
在图片URL后面添加时间戳,可以清理缓存并强制浏览器从服务器加载最新资源。由于每次请求时生成的时间戳都不一样(即修改了URL),因此浏览器会认为这是一个新的请求,不会从缓存中加载资源,而是会向服务器发送请求以获取最新的资源。因此,它通常只在资源确实更新但URL没有改变的情况下才使用。
一、缓存头(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指令来决定如何处理缓存请求。