简单分析下强缓存与协商缓存

强缓存与协商缓存

  • 什么是缓存?
缓存就是数据交换的缓冲区(称作Cache),是存贮数据(使用频繁的数据)的临时地方。当用户查询数据,首先在缓存中寻找,如果找到了则直接执行。如果找不到,则去数据库中查找。
  • 缓存的作用
缓存的本质就是用空间换时间,牺牲数据的实时性,以服务器内存中的数据暂时代替从数据库读取最新的数据,减少数据库IO,减轻服务器压力,减少网络延迟,加快页面打开速度。
  • 缓存的出现场景
1.CPU缓存
是位于CPU与内存之间的临时存储器,它的容量比内存小的多但是交换速度却比内存要快得多。(选用存储介质,提高访问速度:高速缓存>内存;减少重复量)
2.浏览器缓存
浏览器可以缓存一些静态资源,比如图片、js、css等,这些都是不常变化的内容,所以没有必要每次都去请求。(减少网络IO消耗,提高访问速度)
3.CDN缓存
客户端会先检查浏览器的缓存,若缓存过期则会像CDN发送请求(Request),CDN检查缓存数据还未过期,那么直接返回响应(Response),只需两步搞定。
4.数据库缓存
(选用存储介质,提高访问速度:内存>>磁盘;减少磁盘IO的操作,减少重复查询,提高吞吐量)
5.业务层缓存
除了上面介绍的缓存场景,我们还可能需要更细粒度的缓存,就是业务层缓存
  • 什么是强缓存
强缓存通过Expires和Cache-Control两种响应头实现
服务器通过设置http中hdader的Expires和cache-control字段告诉浏览器换存的有效期。
强缓存就是利用http协议头的expres(时间字符串)和cache- control(相对时间)两个字段来控制的,看协议头上有没有用来表示资源的缓存时间;强缓存中,如果普通刷新会忽略他,不会清除他,需要强制刷新。带上cache- control:no-cache(不使用本地缓存),和pargma:no-cache;
  • 什么是协商缓存
当浏览器对某个资源的请求没有命中强缓存,就会发一个请求到服务器,验证协商缓存是否命中,如果 协商缓存命中,请求响应返回的http状态为304并且会显示一个Not Modified的字符串,协商缓存是利 用的是【Last-Modified,If-Modified-Since】和【ETag、If-None-Match】这两对Header来管理的
上面说到的强缓存就是给资源设置个过期时间,客户端每次请求资源时都会看是否过期;只有在过期才会去询问服务器。所以,强缓存就是为了给客户端自给自足用的。而当某天,客户端请求该资源时发现其过期了,这是就会去请求服务器了,而这时候去请求服务器的这过程就可以设置协商缓存。这时候,协商缓存就是需要客户端和服务器两端进行交互的。
  • 他们的基本原理
1)浏览器在加载资源时,根据请求头的expires和cache-control判断是否命中强缓存,是则直接从缓 存读取资源,不会发请求到服务器。
2)如果没有命中强缓存,浏览器一定会发送一个请求到服务器,通过last-modified和etag验证资源是 否命中协商缓存,如果命中,服务器会将这个请求返回,但是不会返回这个资源的数据,依然是从缓存 中读取资源 
3)如果前面两者都没有命中,直接从服务器加载资源
  • 强缓存和协商缓存的区别
获取资源形式: 都是从缓存中获取资源的。

状态码: 强缓存返回200(from cache),弱缓存返回304状态码

请求(最大区别):

强缓存不发送请求,直接从缓存中取。

弱缓存需要发送一个请求,验证这个文件是否可以使用(有没有被改动过)。

缓存位置
缓存的位置有两种一种是:

memory cache:将资源缓存到内存里面。刷新页面就会情况

disk cache:将资源缓存到磁盘中,刷新页面不会清空
  • 相同点
如果命中,都是从客户端缓存中加载资源,而不是从服务器加载资源数据;
  • 不同点
强缓存不发请求到服务器,协商缓存会发请求到服务器。
  • 总结
协商缓存
	协商缓存每次请求都会与服务器交互,第一次是拿数据和标识的过程,第二次开始,就是浏览器询问服务器资源是否有更新的过程。每次请求都会传输数据,如果命中缓存,则资源的 Status 状态码为 304 而不是 200 。同样的,一般来讲为了兼容,两个版本的协商缓存都会被实现,http 1.1 版本的实现优先级会高于 http 1.0 版本的实现。

强缓存
	强制缓存只有首次请求才会跟服务器通信,读取缓存资源时不会发出任何请求,资源的 Status 状态码为 200,资源的 Size 为 from memory 或者 from disk ,http 1.1 版本的实现优先级会高于 http 1.0 版本的实现。

你可能感兴趣的:(前端,http,服务器,缓存)