最近的想记录的话
人生有时候会比较迷茫,明明有很多重要的事情要去做,但是仍然不想计划去做。曾经我总是以进大公司为目标,但似乎对于现在的我来说,好像没有那么有动力了。我到底该怎么做?其实我还是不知道。我当初是因为开发程序有意思,所以决定认真学习这些知识,可我现在是为了什么?为了面子?为了生活?我不知道,但我知道如果我对一个东西失去兴趣,我是肯定学不会的。或许我应该天真一点,船到桥头自然直,未来的事情谁又能说的准呢?
前言
还是不要想那么多,我想所有事情都可以解决的。
浏览器缓存是浏览器将用户请求过的静态资料(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和 新的资源文件
缺点
- 文件修改了,但文件内容没有改变
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高
总结
最后来个流程图