一、数据库缓存:
数据库会在内存划分一个专门的区域,用来存放用户最近执行的查询,这块区域就是缓存。
二、应用层缓存:
- 缓存数据库的查询结果,减少数据的压力。
- 缓存磁盘文件的数据,常用的数据放到内存,不用每次都去读取磁盘。
- 缓存某个耗时的计算操作。
三、服务端缓存:
一般针对静态文件类型,比如图片、css、js、html等静态文件。
原因如下:
- 请求更快:通过将内容缓存在本地浏览器或距离最近的缓存服务器(CDN),在不影响网络交互的前提下可以大大加快网站加载速度。
- 节省带宽:对于已缓存的文件可以减少请求或者无需请求。
- 降低服务器的压力:在大量用户并发请求的情况下,此时将一些静态资源放置在网络的多个节点,可以起到均衡负载的作用。
四、客户端缓存:(浏览器缓存)
客户端缓存依赖于浏览器的实现:浏览器端的缓存,可以让用户请求一次之后,下一次不在从服务器端请求数据,直接从本地缓存读取,可以减轻服务器负担也可以加快用户的访问速度。
1、缓存过程分析:
浏览器与服务器通信的方式为应答模式。浏览器发起HTTP请求--服务器响应该请求。
- 浏览器每次发起请求,都会先在浏览器缓存中查找该请求的结果以及缓存标识。
- 浏览器每次拿到返回的请求结果都会将该结果和缓存标识存入浏览器缓存中。
根据是否需要向服务器重新发起HTTP请求将缓存过程分为两个部分,分别是强缓存和协商缓存。
2、强缓存:
不会像服务器发请求,直接从缓存中读取资源。
强缓存可以通过设置两种请求头实现:Expires和Cache-Control。
Expires:缓存过期时间,用来指定资源到期的时间,是服务器端的具体的时间点。在响应http请求时告诉浏览器在过期时间前浏览器可以直接从浏览器缓存取数据,而无需再次请求。
Cache-Control:主要用于控制网页缓存。
no-cache:浏览器在使用缓存数据时,需要先确认一下数据是否还跟服务器保持一致。
注:强缓存判断是否缓存的依据来自于是否超出某个时间或者某个时间段,而不关心服务器端文件是否已经更新,这可能会导致加载文件不是服务器最新的内容。此时我们需要使用协商缓存。
3、协商缓存:
就是强制缓存失效后,浏览器携带缓存标识向服务器发起请求,由服务器根据缓存标识决定是否使用缓存的过程。
协商缓存主要有以下两种情况:
(1)返回304和Not Modified:
浏览器向服务器发起请求,缓存数据库中的数据失效,则只返回缓存标识。浏览器再次携带该资源的缓存标识发起HTTP请求,若资源没有更新则返回304,返回该请求的缓存结果。
(2)返回200和请求结果:协商缓存失效,返回200和请求结果。
协商缓存可以通过设置两种请求头实现:Last-Moditify和Etag
http1.0(1)Last-Moditify:浏览器在第一次访问资源时,服务器返回资源的同时,在response header中添加Last-Modified的header,值是这个资源在服务器上的最后修改时间。
浏览器下一次请求这个资源时,检测到有Last-Modified,于是添加if-Modified-Since,值就是Last-Modified的值。会根据if-Modified-Since中的值与服务器中这个资源的最后修改时间对比,如果没有变化,返回304和空的响应体,直接从缓存中读取。如果if-Modified-Since的时间小于服务器中这个资源的最后修改时间,说明文件更新,返回新的资源和200;
http1.1(2) Etag和if-None-Match:Etage是服务器响应请求时,返回当前资源文件的一个唯一标识(由服务器生成)只要资源有变化,Etag就会重新生成。浏览器在下一次加载资源向服务器发送请求时,会将上一次返回的Etag值放到响应header里面的if-None-Match里,服务器只需要比较客户端传来的if-None-Match跟自己服务器上该资源的Etag是否一致。
强缓存与协商缓存区别:强缓存不发请求到服务器,协商缓存会发请求到服务器。
四、缓存机制:
强缓存优先于协商缓存,若强缓存的头部信息生效则直接使用缓存,若不生效则进行协商缓存。
协商缓存由服务器决定是否使用缓存,若协商缓存失效,那么代表该请求的缓存失效,返回200,重新返回资源和缓存标识;生效则返回301,继续使用缓存。