什么是缓存?
缓存的定义
缓存就是数据交换的缓冲区(称做Cache),这个概念最初是来自于内存和CPU。当某一硬件要读取数据时,会首先从缓存中查找须要的数据,若是找到了则直接执行,找不到的话则从内存中找。因为缓存的运行速度比内存快得多,故缓存的做用就是帮助硬件更快地运行html
web缓存是什么
请求的本质是从客户端发送请求,从获取服务器资源(图片、文件、数据)。web
web缓存就是根据请求保存响应内容,当发起下一个相同资源的请求时,直接使用上次保存的内容来响应请求。数据库
web缓存的类型
强缓存
浏览器第一次请求数据时,服务器会将文件的过时时间和文件一块儿返回给客户端,客户端将两者备份至缓存数据库中。再次请求数据时,客户端将根据文件的过时时间去判断,文件是否过时。文件未过时,则直接使用缓存数据库中文件,文件过时了,则从新从服务器上获取。浏览器
Expires
- Expires是http1.0提出的一个表示资源过时时间的header,它描述的是一个绝对时间,由服务器返回。
- Expires第二次请求时,将和本地时间比对。
Expires 第一次请求服务器是,响应头会返回一个Expires的文件过时时间。 以下图所示:缓存
Expires 第二次请求,客户端使用本地时间和文件的过时时间进行比对,若是文件未过时则直接使用本地缓存,返回状态码200(from memory cache)或200(from disk cache)。 以下图所示:服务器
Expires Cache-Control
- Cache-Control: no-cache 必须先与代理服务器确认是否更改,而后在在决定使用缓存仍是请求,相似于协商缓存(304)
- Cache-Control: no-store 才是真正的不缓存数据到本地
- Cache-Control: public 能够被全部用户缓存(多用户共享),包括终端和CDN等中间代理服务器
- Cache-Control: private 只能被终端浏览器缓存(并且是私有缓存),不容许中继缓存服务器进行缓存
- Cache-Control: must-revalidate若是缓存内容失效,请求必须发送服务器进行验证
- Cache-Control: max-age=s 缓存内容在s秒后失效,仅HTTP1.1可用
max-gae 第一次请求服务器时,响应头会返回一个 max-age,是文件多少时间后过时。 以下图所示:网络
max-gae 第二次请求,客户端会校验文件是否过时,若是文件未过时则直接使用本地缓存,返回状态码200(from memory cache)或200(from disk cache)。 以下图所示:负载均衡
协商缓存
>浏览器第一次请求数据时,服务器会将缓存标识与数据一块儿返回给客户端,客户端将两者备份至缓存数据库中。 再次请求数据时,客户端将备份的缓存标识发送给服务器,服务器根据缓存标识进行判断,判断成功后,返回304状态码,通知客户端比较成功,可使用缓存数据。
Last-Modified/If-Modified-Since
经过文件的最后修改时间判断该不应读取缓存,服务端设置响应头Last-Modified,客户端把上次服务端响应头中的Last-modified值经过if-modified-since 传递给服务端 , 服务端经过比较当前文件的修改时间和上次修改时间(上次传给客户端的值),若是相等那么说明文件修改时间没变也就是没变化。运维
Last-Modified的一次请求时,服务器返回的响应头里面包含缓存标识Last-Modified工具
Last-Modified的第二次请求时,请求头包含If-Modified-Since,服务器获取到该缓存标识后,用该标识和文件进行比对。若是缓存文件未过时则返回304状态码,客户端使用缓存问题。若是缓存过时则返回新文件,状态码为200。
Etag / If-None-Match
经过文件的内容来判断该不应读取缓存,服务端经过把文件内容读取出来,经过md5进行base64加密得出hash值,把这个值设置响应头Etag,客户端下一次请求经过if-none-match带过来,服务端再比对当前文件内容加密得出的hash值和上次是否同样,若是同样说明文件内容没有发生改变,这种方式是最准确的方式,可是也是最耗性能。
Etag的一次请求时,服务器返回的响应头里面包含缓存标识Etag
Etag的第二次请求时,请求头包含If-None-Match,服务器获取到该缓存标识后,用该标识和文件进行比对。若是缓存文件未过时则返回304状态码,客户端使用缓存问题。若是缓存过时则返回新文件,状态码为200。
CDN代理服务器缓存
CDN的全称是Content Delivery Network,即内容分发网络。CDN是构建在网络之上的内容分发网络,依靠部署在各地的边缘服务器,经过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,下降网络拥塞,提升用户访问响应速度和命中率。(CDN网络是在用户和服务器之间增长Cache层,如何将用户的请求引导到Cache上得到源服务器的数据,主要是经过接管DNS实现)
- 当用户点击网站页面上的内容URL,通过本地DNS系统解析,DNS系统会最终将域名的解析权交给CNAME指向的CDN专用DNS服务器。
- CDN的DNS服务器将CDN的全局负载均衡设备IP地址返回用户。用户向CDN的全局负载均衡设备发起内容URL访问请求。CDN全局负载均衡设备根据用户IP地址,以及用户请求的内容URL,选择一台用户所属区域的区域负载均衡设备(边缘节点),告诉用户向这台设备发起请求。均衡设备把服务器的IP地址返回给用户。
- 用户向缓存服务器发起请求,缓存服务器响应用户请求,将用户所需内容传送到用户终端。若是这台缓存服务器上并无用户想要的内容,而区域均衡设备依然将它分配给了用户,那么这台服务器就要向它的上一级缓存服务(多级缓存)器请求内容,直至追溯到网站的源服务器将内容拉到本地(回源)。
服务端缓存
- 页面缓存,这种缓存技术通常用于不会常常变更信息,而且访问次数较多的页面,这样就不用每次都动态加载。
- 模板缓存,有些语言程序运行时动态对程序进行编译,为了不每次请求都进行编译,则会缓存编译后的一个模板文件。
- 数据缓存,页面数据来自DB时,每次DB操做是须要消耗时间和资源的。将高频操做的数据放入到内存中,避免频繁的操做数据库。
黑科技
- Service workers 本质上充当Web应用程序与浏览器之间的代理服务器,也能够在网络可用时做为浏览器和网络间的代理。它们旨在(除其余以外)使得可以建立有效的离线体验,拦截网络请求并基于网络是否可用以及更新的资源是否驻留在服务器上来采起适当的动做。在目前阶段,ServiceWorker的主要能力集中在网络代理和离线缓存上。具体的实现上,能够理解为ServiceWorker是一个能在网页关闭时仍然运行的WebWorker。
缓存的优点和问题
为何使用缓存?
- 提升响应速度,减小响应延迟
- 减小资源消耗(服务器、带宽)
使用缓存可能致使的问题?
- 缓存雪崩,是指缓存使用不合理时,某一时间缓存失效,大量请求会直接到达向服务器,服务器没法承载大量请求,就致使服务器崩溃
- 缓存更新不及时,是指缓存使用不合理时,服务器文件更新,用户获取到的仍是旧的错误的缓存文件。
合理使用缓存
- 分离变化的部分,常常变化的业务逻辑和基础工具库抽离。
- 对基础工具库能够设置长缓存Cache-Control: max-age=31536000
- 对常常变化的由于逻辑可使用短缓存时间+must-revalidate 或者使用协商缓存
- 使用文件戳控制缓存
参考文章:
三种缓存方式,不再用麻烦运维小哥哥了!!!
完全弄懂HTTP缓存机制及原理
设计一个无懈可击的浏览器缓存方案:关于思路,细节,ServiceWorker,以及HTTP/2
CDN学习笔记一(CDN是什么?)