http面试必会的:强制缓存和协商缓存

本文将介绍http中强制缓存和协商缓存的区别

1. 什么是缓存?

浏览器缓存(Brower Caching)是浏览器对之前请求过的文件进行缓存,以便下一次访问时重复使用,节省带宽,提高访问速度,降低服务器压力

http缓存机制主要在http响应头中设定,响应头中相关字段为Expires、Cache-Control、Last-Modified、Etag。

HTTP 1.0协议中的。简而言之,就是告诉浏览器在约定的这个时间前,可以直接从缓存中获取资源(representations),而无需跑到服务器去获取。

另:

  • Expires因为是对时间设定的,且时间是Greenwich Mean Time (GMT),而不是本地时间,所以对时间要求较高。
2. 浏览器是如何判断是否使用缓存的

第一次请求:

第二次请求相同网页:

3. 缓存的类别

浏览器缓存分为强缓存和协商缓存

强缓存:浏览器不会像服务器发送任何请求,直接从本地缓存中读取文件并返回Status Code: 200 OK

200 form memory cache : 不访问服务器,一般已经加载过该资源且缓存在了内存当中,直接从内存中读取缓存。浏览器关闭后,数据将不存在(资源被释放掉了),再次打开相同的页面时,不会出现from memory cache。

200 from disk cache: 不访问服务器,已经在之前的某个时间加载过该资源,直接从硬盘中读取缓存,关闭浏览器后,数据依然存在,此资源不会随着该页面的关闭而释放掉下次打开仍然会是from disk cache。

优先访问memory cache,其次是disk cache,最后是请求网络资源

协商缓存: 向服务器发送请求,服务器会根据这个请求的request header的一些参数来判断是否命中协商缓存,如果命中,则返回304状态码并带上新的response header通知浏览器从缓存中读取资源;

4. 强缓存和协商缓存的header参数

强缓存:

Expires:过期时间,如果设置了时间,则浏览器会在设置的时间内直接读取缓存,不再请求

Cache-Control:当值设为max-age=300时,则代表在这个请求正确返回时间(浏览器也会记录下来)的5分钟内再次加载资源,就会命中强缓存。

cache-control:除了该字段外,还有下面几个比较常用的设置值:

(1) max-age:用来设置资源(representations)可以被缓存多长时间,单位为秒;
(2) s-maxage:和max-age是一样的,不过它只针对代理服务器缓存而言;
(3)public:指示响应可被任何缓存区缓存;
(4)private:只能针对个人用户,而不能被代理服务器缓存;
(5)no-cache:强制客户端直接向服务器发送请求,也就是说每次请求都必须向服务器发送。服务器接收到     请求,然后判断资源是否变更,是则返回新内容,否则返回304,未变更。这个很容易让人产生误解,使人误     以为是响应不被缓存。实际上Cache-Control:     no-cache是会被缓存的,只不过每次在向客户端(浏览器)提供响应数据时,缓存都要向服务器评估缓存响应的有效性。
(6)no-store:禁止一切缓存(这个才是响应不被缓存的意思)。
复制代码

cache-control是http1.1的头字段,expires是http1.0的头字段,如果expires和cache-control同时存在,cache-control会覆盖expires,建议两个都写。

协商缓存:

Last-Modifued/If-Modified-Since和Etag/If-None-Match是分别成对出现的,呈一一对应关系

Etag/If-None-Match:

Etag:

Etag是属于HTTP 1.1属性,它是由服务器(Apache或者其他工具)生成返回给前端,用来帮助服务器控制Web端的缓存验证。 Apache中,ETag的值,默认是对文件的索引节(INode),大小(Size)和最后修改时间(MTime)进行Hash后得到的。

If-None-Match:

当资源过期时,浏览器发现响应头里有Etag,则再次像服务器请求时带上请求头if-none-match(值是Etag的值)。服务器收到请求进行比对,决定返回200或304

Last-Modifued/If-Modified-Since:

Last-Modified:

浏览器向服务器发送资源最后的修改时间

If-Modified-Since:

当资源过期时(浏览器判断Cache-Control标识的max-age过期),发现响应头具有Last-Modified声明,则再次向服务器请求时带上头if-modified-since,表示请求时间。服务器收到请求后发现有if-modified-since则与被请求资源的最后修改时间进行对比(Last-Modified),若最后修改时间较新(大),说明资源又被改过,则返回最新资源,HTTP 200 OK;若最后修改时间较旧(小),说明资源无新修改,响应HTTP 304 走缓存。

  • Last-Modifued/If-Modified-Since的时间精度是秒,而Etag可以更精确。
  • Etag优先级是高于Last-Modifued的,所以服务器会优先验证Etag
  • Last-Modifued/If-Modified-Since是http1.0的头字段
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Mybatis-Plus是一个Mybatis框架的增插件,它提供了简单的配置和快速进行CRUD操作的功能。在Mybatis-Plus中,缓存级别分为一级缓存和二级缓存。 一级缓存是Mybatis框架默认开启的,它是指在同一个SqlSession中,如果执行相同的查询语句,那么Mybatis会将查询结果缓存起来,下次执行相同的查询语句时,直接从缓存中获取结果,而不会再次去数据库查询。一级缓存的作用范围是在同一个SqlSession中,当SqlSession被关闭后,缓存也会被清空。 二级缓存是全局缓存,也称为mapper级别的缓存,它可以在多个SqlSession之间共享缓存结果。二级缓存的默认机制是采用PerpetualCache和HashMap存储缓存结果,所以默认是本地缓存。不同之处在于二级缓存的存储作用域是Mapper(Namespace),可以供多个SqlSession共享。可以通过配置来启用二级缓存,并且可以自定义存储源,如Ehcache、Redis等。 总结来说,Mybatis-Plus提供了一级缓存和二级缓存两种缓存级别。一级缓存在同一个SqlSession中有效,而二级缓存在多个SqlSession之间共享。开发人员可以根据具体的需求选择是否启用缓存,并可以自定义缓存的存储源。 : MyBatis包含一个非常大的查询缓存特性,它可以非常方便地定制和配置缓存缓存可以极大地提升查询效率。 : Mybatis-Plus是一个Mybatis框架的增插件,根据官方描述,MP只做增不做改变。它提供了简单的配置和快速进行CRUD操作的功能,包括代码生成、分页、性能分析等。 : 二级缓存也称为全局缓存,是mapper级别的缓存。它可以在多个SqlSession之间共享缓存结果,存储作用域为Mapper(Namespace)。默认使用PerpetualCache和HashMap存储,可以自定义存储源。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值