缓存种类
- 浏览器缓存
- 静态页面缓存
- App缓存
- 应用级缓存
- CPU缓存
- CDN缓存
- DNS
- Web代理缓存
- 后端数据存储
- 数据库缓存
浏览器缓存
浏览器缓存。这个前端接触比较多一些。浏览器都是基于http协议传输数据的。有5类状态码,其中有一个304状态码。Last-Modified 、Etag。减少网络传输数据,省带宽。
静态页面缓存
静态页面缓存。静态缓存在 Web 1.0 时期是非常出名,它一般通过生成 Velocity 模板或者静态 HTML 文件,放置在nginx或squid等web服务器,这样用户在访问的时候会优先访问 Web 服务器上的静态页面,在一些门户网站,使用的较多。现在更多是动静结合的方式,将页面中低频变化的元素剥离出来,提前渲染静态页面,比如商详,动态数据通过ajax实时从后端计算获取,从而减轻像tomcat、weblogic等后台应用服务器的压力。
App缓存
APP缓存。刷抖音,流畅。其实播放器中有缓存组件,在播第一个视频时,后台静默线程已经将第二、三个视频提前缓存在本地。秒开。网络差的环境特别明显。
应用级缓存
应用级缓存。本地缓存(Guava、Caffieine、Ehcache、ConcurrentHashMap)、分布式缓存( Memcache、Redis)
本地缓存直接访问进程所属内存,不需要跨网络调度,避免网络交互带来的性能损耗,速度快
缓存内容不会改变。因为对多实例服务器来讲,当数据源更新后,每个单机很难感知,维护成本高。发布订阅模式
时效性要求低。能接受一定的延迟,设置较短过期时间,被动失效保持数据的新鲜度
注意事项:
控制数据条数,避免内存占用过多导致OOM,应用瘫痪。
数据时效性,写入后多久有效
实现简单,但潜在的坑比较多,选择成熟的开源框架,如 Guava Cache、Caffeine、Ehcache
Cpu缓存
CPU缓存(Cache Memory)是位于CPU与内存之间的临时存储器,它的容量比内存小的多但是交换速度却比内存要快得多。CPU高速缓存的出现主要是为了解决CPU运算速度与内存读写速度不匹配的矛盾,因为CPU运算速度要比内存读写速度快很多,这样会使CPU花费很长时间等待数据到来或把数据写入内存。在缓存中的数据是内存中的一小部分,但这一小部分是短时间内CPU即将访问的,当CPU调用大量数据时,就可先缓存中调用,从而加快读取速度。
当CPU需要读取数据并进行计算时,首先需要将CPU缓存中查到所需的数据,并在最短的时间下交付给CPU。如果没有查到所需的数据,CPU就会提出“要求”经过缓存从内存中读取,再原路返回至CPU进行计算。而同时,把这个数据所在的数据也调入缓存,可以使得以后对整块数据的读取都从缓存中进行,不必再调用内存。
缓存大小是CPU的重要指标之一,而且缓存的结构和大小对CPU速度的影响非常大,CPU内缓存的运行频率极高,一般是和处理器同频运作,工作效率远远大于系统内存和硬盘。实际工作时,CPU往往需要重复读取同样的数据块,而缓存容量的增大,可以大幅度提升CPU内部读取数据的命中率,而不用再到内存或者硬盘上寻找,以此提高系统性能。但是从CPU芯片面积和成本的因素来考虑,缓存都很小
- CPU的三级缓存
随着多核CPU的发展,CPU缓存通常分成了三个级别:L1,L2,L3。级别越小越接近CPU,所以速度也更快,同时也代表着容量越小。L1 是最接近CPU的, 它容量最小(例如:32K),速度最快,每个核上都有一个 L1 缓存,L1 缓存每个核上其实有两个 L1 缓存, 一个用于存数据的 L1d Cache(Data Cache),一个用于存指令的 L1i Cache(Instruction Cache)。L2 缓存 更大一些(例如:256K),速度要慢一些, 一般情况下每个核上都有一个独立的L2 缓存; L3 缓存是三级缓存中最大的一级(例如3MB),同时也是最慢的一级, 在同一个CPU插槽之间的核共享一个 L3 缓存。
下面是三级缓存的处理速度参考表:
从CPU到 | 大约需要的CPU周期 | 大约需要的时间(单位ns) |
---|---|---|
寄存器 | 1 cycle | |
L1 Cache | ~3-4 cycles | ~0.5-1 ns |
L2 Cache | ~10-20 cycles | ~3-7 ns |
L3 Cach | ~40-45 cycles | ~15 ns |
跨槽传输 | ~20 ns | |
内存 | ~120-240 cycles | ~60-120ns |
下图是Intel Core i5-4285U的CPU三级缓存示意图:
CPU三级缓存
就像数据库缓存一样,获取数据时首先会在最快的缓存中找数据,如果缓存没有命中(Cache miss) 则往下一级找, 直到三级缓存都找不到时,那只有向内存要数据了。一次次地未命中,代表取数据消耗的时间越长。
- 带有高速缓存CPU执行计算的流程
程序以及数据被加载到主内存
指令和数据被加载到CPU的高速缓存
CPU执行指令,把结果写到高速缓存
高速缓存中的数据写回主内存
目前流行的多级缓存结构如下图:
多级缓存结构
CDN缓存
一、CDN是什么?
http缓存是浏览器端缓存,cdn是服务器端缓存。
举个例子来说明cdn的作用:cdn就是代理。厂家给商家发货,你从商家买货,商家就是cdn,很方便。
二、CDN怎么缓存?
和Http类似,客户端请求数据时,先从本地缓存查找,如果被请求数据没有过期,拿过来用,如果过期,就向CDN边缘节点发起请求。CDN便会检测被请求的数据是否过期,如果没有过期,就返回数据给客户端,如果过期,CDN再向源站发送请求获取新数据。和买家买货,卖家没货,卖家再进货一个道理^^。
CDN边缘节点缓存机制,一般都遵守http标准协议,通过http响应头中的Cache-Control和max-age的字段来设置CDN边缘节点的数据缓存时间。
DNS
DNS 是域名系统 (Domain Name System) 的缩写,是因特网的一项核心服务,它作为可以将域名和IP地址相互映射的一个分布式数据库,能够使人更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。用户在遇到网络问题的时候,经常会先清除DNS缓存来解决。
Web代理缓存
—(待更新)
后端数据存储
—(待更新)
数据库缓存
—(待更新)