缓存无处不在,所展示出的仅仅是服务器端的缓存,我们从细节层面一层层分析
但是在此之前,我们先要知道什么是缓存与为什么要使用缓存,是时候百度一波喽~
缓存就是数据交换的缓冲区(称作Cache),当某一硬件要读取数据时,会首先从缓存中查找需要的数据,如果找到了则直接执行,找不到的话则从内存中找。由于缓存的运行速度比内存快得多,故缓存的作用就是帮助硬件更快地运行。
当然缓存不仅限于存储在内存当中,所以我们可以理解成将数据存储在快介质中并优先在快介质中查找
so,缓存的好处显而易见了,那就是查询速度变快,并且不再进行之后的io操作了,合理的使用缓存可以极大的提升吞吐量,从而的好良好的性能!但是缺点也很明显那就是成本问题,一个简单的例子就是我们都知道固态盘比机械盘贵好几倍,当然我说的是企业级的固态盘,听说最近intel新出了一款黑科技固态盘速度已经可以干内存了,但是容量是不到150G而价格简直是天价,不过相信随着科技的不断提升,固态盘变成主流的时间不会太远
下面是现在主流介质的速度排列,容量早提升了可以忽略
其中寄存器是在cpu内的,有兴趣的可以看看计算机硬件方面的知识,高速缓存也就是L2级缓存,也是硬件方面的,intel的cpu之间是共享高速缓存的,而AMD则是每个cpu单独维护各自的高速缓存,so,AMD之间在保持高速缓存一致性上有极大的困难;当然图中每一层又可以细分出各自的速度比,好比磁盘ssd跟机械盘的速度那就差很多
再说一个题外话那就是Buffe与Cache的区别,最简单地说
Buffe是为了写,是写缓冲
Cache是为了读,是读缓存
好了,这里我们的缓存就是Cache了,我们从一个请求的开始分析
一.客户端本身的缓存
客户端访问页面后第一步就是去解析我们的域名,在正常情况下不配置hosts文件时都会去访问设置的dns服务器,然后获取解析出的ip,然后访问此ip,这时候才开始与我们的服务器开始真正开始进行通讯,然后获取我们提供的页面进行后续操作
在这些流程中,如果我之前访问过该网站,那么又会如何呢?
1.首先浏览器会从自己的缓存中读取dns,看看有木有,不同的浏览器过期时长不同,然后还有客户端本身操作系统也会看看自己是否开启了dns缓存,然后去验证,还有就是我们服务端的语言也是可以在访问页面时给客户端写缓存的
2.如果都没有的话,我们就去dns服务器解析吧,dns服务器也分很多种,也许我们访问dns服务器就是一台缓存dns,他其实本身不解析,就是记缓存,如果有此缓存就会直接返回,如果没有,一般就会去递归长训返回了
3.Ok,到此我们终于拿到了正确的目标ip了,我们与该ip进行连接拿页面啦~但是页面上有三类内容,html、css、js,而且还有好多的外部链接指向图片啊,uri啊,甚至还有ifname,这些内容我们也都要请求一遍嘛?如果我们是首次访问,那么很可惜,答案是肯定的,我们需要全部访问一遍,不过随着技术的发展,前端技术有异步加载及惰性加载,我们现在只需要加载并访问下载一些必须的内容了
4.但是如果我们访问过呢?那么这里面信息量又变大了呦~~~~5555555555,开车了!老司机光顾那肯定是轻车熟路的嘛,各种套餐的价格早已做到了心中有数,就不需要再多要一份了,但是我们都知道现在生意竞争激烈,大家都喜欢提供各种时价的跟特殊优惠,这种我们就必须要每次取一份, 但是如何分辨出哪些需要取的哪些是不需要的呢?那在套餐前面加一个标签不就好了么,但是这个标签是什么,每家的规矩都是不同的,但是还是可以总结成四种
Etag:打标签,如果标签没变那就不需要去取了
过期时间:告知此资源什么时候过期,那么在此之前那就不用取了
Last-modified:根据此文件的最后修改时间判断,如果时间没变那就是没修改就不用取了
前端技术:直接在html里添加<link>标签
最后总结下~
二.代理层的缓存
历经千辛万苦终于连接到了服务器,好开心,23333333,你太天真了,一边情况下你根本没有连接到服务器!wtf,那我tm刚才都干了些什么,现在我看到的资源是哪个王八蛋提供的?
答案是cdn厂商,随着时间的推移,现在大家都可以用到cdn了,这对中小型企业十分友好,cdn的知识也很深奥,各家厂商也各有特色,不过多描述,直接总结下cdn为我们做的事情
- 提供就近访问
- 缓存热点数据
- 安全防护
- 智能dns
- 应用层技
- 各厂商特色服务
哈哈哈哈,北方对自己的的ps的技术简直无语了~~~~
三.web层缓存
这次我们终于真正意义上的抵达了服务商的服务器,姆Q~~~
服务器需要对我们的操作进行解析,然后发送数据给后端,后端有各自的业务代码来处理我们的各类请求,我们都知道语言有很多,大体分为解释性语言跟编译性语言,那么为了提升我们代码的速度,我们是不是对可以做一些缓存优化呢?答案是要根据语言而论的,像php我们就可以打开opcache,但是像Python就没有什么好做的了
其实我们的web服务器上本身也是可以开启缓存的哦,如apache的mod_cache模块与Nginx的fastcgi缓存
四.应用层缓存
我们提供的页面有的数据是需要变化的,有的是静态的,有的是从数据库内获取然后返回前端展示的,因此我们尽量要将页面做的静态化,因为这样数据才可以被缓存下来,如果是一直在变那么缓存了也没有意义了
五.数据层缓存
这一层用户就已经感知不到了,因为这已经是服务器内部之间的交互了
常规情况下我们将数据放置在mysql中,首先mysql服务层有缓存,然后Mysql不同的引擎带有各自的缓存,dba应该比较了解,小北方对数据库很不熟悉,就不班门弄斧了
再者就是分布式缓存服务器,redis用的比较多,组件一个集群缓存热点数据,应用程序会调用对应的库去操作它进行存储获取数据操作,它本身就是缓存服务器,为的就是提升数据获取的速度。
六.系统层
这一层的缓存主要就是内存了嘛,内存出现的意义就是因为cpu与磁盘之间速度的不对等,所以需要一层过渡层
再就是cpu内部的缓存,L1、L2、L3级缓存
七.物理层
物理层的设备有什么缓存?
其实我们的raid卡上是带有缓存的,而且还自带小电池你敢信?默认情况下是关闭的
再就是磁盘本身也有一些缓存,只是这个数值实在是太小了,因此我们一般不开
题外话就是有些服务器只识别raid设备,所以单盘我们就直接做个raid0就好,其实ssd不建议做raid,更建议作为日志盘来,其实就是写缓冲来平衡机械盘的速度,因为我们写文件落盘是要先到日志盘再到底层盘