返回

为什么我总弄不懂缓存?

前端

为什么我总弄不懂缓存?

HTTP缓存是一种减少从服务器下载数据的技术,它可以提高网络传输的效率,降低服务器的负荷,提高用户浏览网页的速度。

HTTP缓存的工作原理非常简单,当浏览器第一次请求一个资源时,服务器会将资源发送给浏览器,同时会在响应头中包含一些缓存控制指令,这些指令告诉浏览器如何缓存这个资源。浏览器收到响应后,会将资源存储在本地缓存中。当浏览器再次请求同一个资源时,它会先检查本地缓存中是否有这个资源,如果有,则直接从本地缓存中获取,而不会再向服务器发送请求。

HTTP缓存有很多好处,包括:

  • 提高网络传输的效率:由于浏览器可以直接从本地缓存中获取资源,因此可以减少网络传输的数据量,提高网络传输的效率。
  • 降低服务器的负荷:由于浏览器可以直接从本地缓存中获取资源,因此可以减少服务器的请求量,降低服务器的负荷。
  • 提高用户浏览网页的速度:由于浏览器可以直接从本地缓存中获取资源,因此可以减少用户等待的时间,提高用户浏览网页的速度。

然而,HTTP缓存也有一些缺点,包括:

  • 可能会导致数据不一致:由于浏览器是从本地缓存中获取资源,因此可能会导致数据不一致的情况,例如,当服务器上的数据更新后,浏览器仍然从本地缓存中获取旧的数据。
  • 可能会导致安全问题:由于浏览器是从本地缓存中获取资源,因此可能会导致安全问题,例如,攻击者可以在本地缓存中注入恶意代码,当浏览器从本地缓存中获取资源时,恶意代码就会被执行。

为了解决这些问题,HTTP协议定义了多种缓存策略,这些策略可以帮助浏览器更好地控制缓存。

HTTP缓存策略主要有两种:

  • 强缓存:强缓存是指浏览器从本地缓存中获取资源而不需要向服务器发送请求。强缓存的条件是:
    • 浏览器收到响应后,响应头中包含了Cache-Control: max-age=xxx指令,其中xxx是资源的缓存时间。
    • 浏览器收到响应后,响应头中包含了Expires: xxx指令,其中xxx是资源的过期时间。
  • 协商缓存:协商缓存是指浏览器在本地缓存中找不到资源时,向服务器发送请求,服务器根据请求头中的If-Modified-Since或If-None-Match指令判断资源是否更新,如果资源更新,则服务器会将资源发送给浏览器,否则服务器会返回304 Not Modified状态码。

HTTP缓存的失效条件主要有两种:

  • 强制失效:强制失效是指浏览器必须从服务器重新获取资源,无论本地缓存中是否有该资源。强制失效的条件是:
    • 浏览器收到响应后,响应头中包含了Cache-Control: no-cache指令。
    • 浏览器收到响应后,响应头中包含了Expires: 0指令。
  • 自然失效:自然失效是指浏览器可以从本地缓存中获取资源,但必须先向服务器发送请求,由服务器决定是否返回资源。自然失效的条件是:
    • 浏览器收到响应后,响应头中包含了Cache-Control: max-age=0指令。
    • 浏览器收到响应后,响应头中包含了Expires: xxx指令,并且当前时间已经超过了xxx。