浏览器缓存

739 阅读3分钟

最近的想记录的话

人生有时候会比较迷茫,明明有很多重要的事情要去做,但是仍然不想计划去做。曾经我总是以进大公司为目标,但似乎对于现在的我来说,好像没有那么有动力了。我到底该怎么做?其实我还是不知道。我当初是因为开发程序有意思,所以决定认真学习这些知识,可我现在是为了什么?为了面子?为了生活?我不知道,但我知道如果我对一个东西失去兴趣,我是肯定学不会的。或许我应该天真一点,船到桥头自然直,未来的事情谁又能说的准呢?

前言

还是不要想那么多,我想所有事情都可以解决的。

浏览器缓存是浏览器将用户请求过的静态资料(html, css, js),存储到电脑本地磁盘中, 当浏览器再次访问时, 就可以直接从本地加载了, 不需要再去请求服务端了。

缓存的优点:

  • 减少了冗余的数据传输
  • 减少服务器的负担, 提升网站性能
  • 加快了客户端加载网页的速度

缓存地址

  • 不会向服务器发送请求, 直接从缓存中读取资源
  • 返回200状态码
  • 两个缓存地方:
    • disk cache 硬盘中的缓存
    • memory cache 内存中的缓存
  • 读取顺序为 memory => disk 一般情况下,在浏览器中,浏览器会在js和图片等文件解析执行后直接存入内存缓存中,那么当刷洗页面时只需要从内存缓存中读取(from memory cache); 而css文件则会存入硬盘中, 渲染页面从硬盘读取缓存(from disk cache)

缓存过程

浏览器的缓存一般分为 2种情况

  • 强缓存
  • 协商缓存

强缓存

主要看 response headers 中的

  • Cache-Control
  • Expires

Cache-Control 的取值:

  • max-age : 过期时间
  • no-cache :不进行强缓存

协商缓存

协商缓存就是强缓存失效后,浏览器携带缓存标识向服务器发请求, 由服务器根据缓存标识决定是否使用缓存的过程

具体来说协商缓存涉及两种http头部

last-modified 和 if-modified-since

  • 浏览器一次访问资源时,服务器返回资源的同时,在 response header 中添加 last-modified 的header, 这个值是这个资源在服务器上最后的修改时间。
  • 浏览器在下一次请求这个资源的时候, 浏览器检测到有 last-modified 这个header, 于是添加到 request header 中的 if-modified-since 上。
  • 器再次收到这个资源请求, 会根据 if-modified-since 中的值与 服务器中这个资源的最后修改时间对比, 没有改变, 返回 304 和 空的响应体, 然后从缓存中读取资源。 如果服务器的更新时间大于 if-modified-since ,返回 200和 新的资源文件

缺点

  1. 文件修改了,但文件内容没有改变

etag和 if-none-match

  • Etag是上一次加载资源时,服务器返回的response header,是对该资源的一种唯一标识,只要资源有变化,Etag就会重新生成。

  • 浏览器在下一次加载资源向服务器发送请求时,会将上一次返回的Etag值放到request header里的If-None-Match里,服务器只需要比较客户端传来的If-None-Match跟自己服务器上该资源的ETag是否一致,就能很好地判断资源相对客户端而言是否被修改过了。

  • 如果服务器发现ETag匹配不上,那么直接以常规GET 200回包形式将新的资源(当然也包括了新的ETag)发给客户端;

  • 如果ETag是一致的,则直接返回304知会客户端直接使用本地缓存即可。

etag的优先级比last-modified高

总结

最后来个流程图