【HTTP】进程、线程与http缓存

一、线程与进程

1、常见进程、线程

  • http请求:通过一个线程发送;
  • JS:通过单线程执行;
  • 浏览器:多线程的进程

2、两者关系

  • 进程中某个线程执行出错导致整个进程崩溃;
  • 进程之间互相隔离,可通过IPC机制通信;
  • 进程所占资源在其关闭后被操作系统回收,即使某个线程产生内存泄漏,进程退出时相关内存资源也会被回收;(关机重启)
  • 线程之间通信更方便,共享进程的数据。

3、浏览器

  • 早期是单进程,一个线程出错浏览器崩溃;
  • 2008,谷歌浏览器:多进程,进程间IPC通信,浏览器不容易崩溃;
    • 主进程、GPU(图形处理单元)进程、插件进程、网络进程、渲染进程(内核):让每个标签页成为一个独立的进程;
    • 这样某个进程出错也不影响其他的进程;
  • shift+esc:打开浏览器的任务管理器,查看进程;

4、建立HTTP请求

  • 1、DNS解析
    在这里插入图片描述

  • 2、通信链路的建立(一次请求的过程);都是客户端先发。

    • TCP/IP面向有连接的通讯协议,数据传输前需要建立客户端与服务端的连接,于是【三次握手:客户端>服务端,服务端>客户端(证明能收到客户端消息),客户端再握手服务端(证明可以收到服务端消息),最后发送数据】
    • 【四次挥手】:确保请求与响应都发完了;
  • 3、反向代理服务器:负载均衡、防火墙、加密、压缩、静态资源缓存、解决跨域等,nginx、iis、apache;

  • 4、后端处理:验证、处理、响应;

  • 5、浏览器缓存

  • 6、关键渲染路径:解析html、css,构建DOM、CSSOM对象结构;

  • 7、渲染绘制:结合为render tree(要用于显示的具体对象,被隐藏的标签这里就没有了);

二、优化

1、DNS优化:

  • 减少DNS查找:
    • 浏览器自带缓存(1min);
    • 前端预解析,用于快速找到静态资源服务器如 <link ref="dns-prefetch" href="//tce.taobao.com" />(异步的);
    • 同一个服务器有2~4个域名比较合适,可以突破浏览器对单个域名同时可发送6个请求的限制;但域名过多也不好,会增加DNS查找;

2、http缓存

一般静态资源通过nginx设置缓存方式,动态资源就是后台能代码设置缓存;
总结:缓存配置都是服务端做,通过响应头;
强制缓存(优先级低):响应头Cache-control: maxage=3600;或优先级更低的Expires:***;
协商缓存(优先级高):响应头Cache-Control:no-cache; etag:***;、请求头if-none-match:***
ps:Cache-Control:no-store; 本请求不开启缓存(即不会被存储在浏览器或代理服务器),如用户敏感信息;

  • 强缓存:浏览器第一次请求后缓存资源,只要小于这个时间段就直接用缓存,不再发任何请求;
    • 怎么使用:服务端设置响应头【ExpiresCache-Control】;
    • 早期【Expires】:有缺点-设置的时间可能与客户端本地不一样,导致缓存失效;
    • 现在【Cache-Control】:http1.1新增,通过设置时长,解决上述缺点;
Response Headers //浏览器显示的响应头
Expires:Sat Mar 26 2022 21:06:46 GMT+0800 //后端发字符串形式
Cache-control: maxage=3600;//单位:秒
  • 协商缓存:当可以用本地缓存时,每次使用本地缓存之前,还是要发 get 请求询问一下;
    • 怎么开启:服务端设置【Cache-Control:no-cacheLast-modified】;
    • 过程:
      • 通过【no-cache`】,客户端知道使用浏览器缓存前先询问这个资源是否有效或过期;
      • 通过【Last-modified】会在询问的请求头自动设置【if-modified-since】,告诉服务器上次修改是这个时间,你对比一下是否是最后一次修改,如果是就返回304;如果不是就返回200+最新的资源;
      • Last-modified】:只是用这个字段也有问题,就是当资源改了名有改回来了,内容没有变但是因为修改时间变了,所以还是会导致使用缓存失败;所以引入了响应头【ETag】;
      • ETag】:通过文件内容生成hash字符串;内容不变值不变;同样的也是给后端用,客户端以请求头【if-none-match】传回来用于对比;
//服务端设置响应头
res.setHeader('Cache-Control','no-cache')
res.setHeader('last-modified',[获取文件修改时间字符串格式])

3、缓存策略
有时希望使用强缓存让客户端更快拿到,但又不能同步更新;
所以目前主流方案,针对不同资源进行分类:
协商缓存:html页面
强缓存:静态资源;如图片(因为一般同一个地址内容不会变,要改就直接换名地址也变了,随着html页面更新)、css文件(如果样式改变,打包的样式名也变了,地址改变就会重新请求,地址不变就可以直接用缓存文件)、js(同css,文件内容改变直接改文件名,另外如果有敏感信息不想让代理缓存,可以添加private属性);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值